2

テーブル内のすべてのフィールドのリストを取得するために、将来使用したい次のコードを作成しました。

Private Sub btnGetFields_Click()


   Dim myDBS As Database
   Dim fldLoop As Fields
   Dim fld As Field
   Dim relLoop As Relation
   Dim tdfloop As TableDef

   Set myDBS = CurrentDb

   With myDBS

  ' Display the attributes of a TableDef object's
  ' fields.
  Debug.Print "Attributes of fields in " & _
    .TableDefs("ALT_IDENTIFIER").Name & " table:"

  'Error occurs in line below
  Set fldLoop = .TableDefs("ALT_IDENTIFIER").Fields 

  For Each fld In fldLoop
     Debug.Print "  " & fld.Name & " = " & _
        fld.Attributes
  Next fld

.Close
   End With

End Sub

しかしType Mistmatch - Runtime Error 13、コードを実行すると戻ってきます。

なんで?fldloopは Fields オブジェクトです。つまり、フィールド オブジェクトのコレクションですよね? これは TableDefs.Fields プロシージャが返すものですが、なぜこのエラーが発生するのですか?

ありがとう

4

3 に答える 3

0

Access でリテラル型に値を渡すと、これらの種類のエラーが発生することがありますが、理由はわかりません。通常、変数をオープン データ型としてディメンション化することで簡単に解決できます。たとえば、次のようになります。

Dim fldloop as object

それ以外の場合は、次の行を書き直すことができます。

For Each fld In fldLoop

For Each fld In .TableDefs("ALT_IDENTIFIER").Fields

個別の変数をまとめてディメンション化することを忘れます


アップデート:

おそらく、これは SQL Server の方が便利です。MS Access 経由でしかアクセスできない場合は、リンクされたテーブルをループしてパス スルー クエリを動的に再構築することで、この例を使用できるはずです。

SQL Server の「describe table」に相当するものは何ですか?

于 2013-06-13T14:43:54.860 に答える
0

問題が見つかりました: エラーが発生した理由は、正確なフィールドを参照していなかったためです。Fields 値が割り当てられた Fields オブジェクトでエラーがスローされた理由についてはまだわかりません。

コードは次のとおりです。

   Dim f As Field
   Dim fldTableDef As Field
   Dim Rst As DAO.Recordset
   Dim numField As Integer

   Dim linkedTable As String
   linkedTable = "ALT_IDENTIFIER"

   Set Rst = CurrentDb.OpenRecordset(linkedTable)
   numField = Rst.Fields.Count

   'Loop through
   Dim index As Integer

   For index = 0 To numField - 1
        If Rst.Fields(index).Type = dbDate Then
            Debug.Print "Field: " & Rst.Fields(index).Name; " = Date/Time" & Rst.Fields(index).Value
        End If
   Next
于 2013-06-17T20:22:37.713 に答える