Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1996 / 2272 ツリー ←次へ | 前へ→

【4251】テーブルとかクエリーの有無 ひろのしま 05/1/25(火) 9:09 発言[未読]
【4252】Re:テーブルとかクエリーの有無 MJM 05/1/25(火) 10:21 回答[未読]
【4256】Re:テーブルとかクエリーの有無 ひろのしま 05/1/25(火) 13:06 お礼[未読]
【4260】Re:テーブルとかクエリーの有無 クロ 05/1/25(火) 16:41 発言[未読]
【4261】Re:テーブルとかクエリーの有無 MJM 05/1/25(火) 17:05 発言[未読]
【4262】Re:テーブルとかクエリーの有無 ひろのしま 05/1/26(水) 9:33 お礼[未読]
【4265】Re:テーブルとかクエリーの有無 MJM 05/1/26(水) 11:47 発言[未読]
【4324】Re:テーブルとかクエリーの有無 ひろのしま 05/2/3(木) 9:05 お礼[未読]

【4251】テーブルとかクエリーの有無
発言  ひろのしま  - 05/1/25(火) 9:09 -

引用なし
パスワード
   すみません。質問致します。
フォームの有無を確認するコマンドで、
If currentProject.allforms("該当フォーム名").isloaded=true Then
    msgbox"該当フォームは存在してます。"
end if
という記述がありますが、これと同じような役割をするもので
テーブルやクエリの有無を確認する記述はありませんでしょうか。
教えてください。お願いします。

【4252】Re:テーブルとかクエリーの有無
回答  MJM  - 05/1/25(火) 10:21 -

引用なし
パスワード
   こんにちは。

CurrentData オブジェクトに
AllTables と AllQueries コレクションがありますので、
こちらを用いては如何でしょうか。

因みに、IsLoaded プロパティは、
ロードされているか(開かれているか)否かを示すもので、
存在しているか否かを示すものではありません。

【4256】Re:テーブルとかクエリーの有無
お礼  ひろのしま  - 05/1/25(火) 13:06 -

引用なし
パスワード
   ▼MJM さん:
>こんにちは。
>
>CurrentData オブジェクトに
>AllTables と AllQueries コレクションがありますので、
>こちらを用いては如何でしょうか。
>
>因みに、IsLoaded プロパティは、
>ロードされているか(開かれているか)否かを示すもので、
>存在しているか否かを示すものではありません。
フォームに関しては確かにそうですね。わかりました。
良きバスガイド、否アドバイスをありがとうございます。

【4260】Re:テーブルとかクエリーの有無
発言  クロ  - 05/1/25(火) 16:41 -

引用なし
パスワード
   興味があったので...
隠しオブジェクト「MSysObjects」を使用したオブジェクトの有無判定を考えてみました

M_Objectsというテーブルを用意してください。
Typeをオブジェクト名に変更するために使用します。
詳細は以下の通り


Type(数値型)/ObjectsName(テキスト型)
1/テーブル
4/他リンクテーブル
6/リンクテーブル
5/クエリ
-32768/フォーム
-32764/レポート
-32761/モジュール


ユーザー関数を作成

Function GetObjects(strObj As String)
Dim ct As ADODB.Connection
Dim rs As ADODB.Recordset
Dim myObj As String, strSQL As String
myObj = strObj
strSQL = "SELECT M_Objects.ObjectsName, MSysObjects.Name" & _
       " FROM M_Objects INNER JOIN MSysObjects ON M_Objects.typa = MSysObjects.Type" & _
       " WHERE [Name]='" & myObj & "'"
Set ct = Application.CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open strSQL, ct
If rs.EOF Then
  MsgBox "同名のオブジェクトはありません"
Else
  MsgBox rs.GetString
End If
rs.Close
ct.Close
End Function

イミディエイトウィンドウで
?GetObjects("存在するオブジェクト名")
オブジェクトタイプ/オブジェクト名がメッセージされると思います。

同様に"存在しないオブジェクト名"で「ないよ」とメッセージしてくれる
と思います。

【4261】Re:テーブルとかクエリーの有無
発言  MJM  - 05/1/25(火) 17:05 -

引用なし
パスワード
   以下の方法でも可能かと…

TablDefあるいはRecordsetオブジェクト変数に対して、
調べたいテーブル名を代入し、エラーになるか否かを
エラートラップして判定する。

【4262】Re:テーブルとかクエリーの有無
お礼  ひろのしま  - 05/1/26(水) 9:33 -

引用なし
パスワード
   ▼MJM さん:
>以下の方法でも可能かと…
>
>TablDefあるいはRecordsetオブジェクト変数に対して、
>調べたいテーブル名を代入し、エラーになるか否かを
>エラートラップして判定する。

とりあえず、自分は以下のようにしました。


'アクセスのテーブルを数える変数
Public TBL_Cnt As Integer 'テーブルカウント
Public TBL_Sum As Integer 'テーブル合計
Public TBL_Keyword As String '検索テーブル名保存
Public TBL_HIT As Integer '検索出来た時に1を入れる。

Public Sub Moju_テーブル確認 ( )
TBL_HIT=0
TBL_Keyword="検索テーブル名"
TBL_Sum = CurrentData.AllTables.Count
For TBL_Cnt = 0 To TBL_Sum - 1
    msgbox CurrentData.AllTables(TBL_Cnt).Name
  If CurrentData.AllTables(TBL_Cnt).Name = TBL_Keyword Then
    TBL_HIT = 1
  End If
Next
    msgbox TBL_HIT
End Sub

すると、
MSysAccessObject
MSysAccessXML
MSysACEs
MSysObjects
MSysQueries
MSysRelationships

と6つの隠しオブジェクトの名前が出た後に実際に使用しているテーブル名
が出てきました。これを出さず、数えないようにするのは別に難しくはないの
ですが、少々不便に出来ているとは思いました。

良きアドバイスをありがとうございます。

【4265】Re:テーブルとかクエリーの有無
発言  MJM  - 05/1/26(水) 11:47 -

引用なし
パスワード
   以下でも可能ですよ。

Dim OB As Object

For Each OB In CurrentData.AllTables
  If Left(OB.Name, 4) <> "MSys" And OB.Name = TBL_Keyword Then
    TBL_HIT = 1
  End If
Next

【4324】Re:テーブルとかクエリーの有無
お礼  ひろのしま  - 05/2/3(木) 9:05 -

引用なし
パスワード
   ▼MJM さん:
>以下でも可能ですよ。
>
>Dim OB As Object
>
>For Each OB In CurrentData.AllTables
>  If Left(OB.Name, 4) <> "MSys" And OB.Name = TBL_Keyword Then
>    TBL_HIT = 1
>  End If
>Next

適切なアドバイスをいつもありがとうございます。

1996 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078271
(SS)C-BOARD v3.8 is Free