Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2013)
「Rec!TABLE_NAME」の「!」とは?
投稿日時: 20/07/03 21:16:46
投稿者: S.Kos

こんにちは、みなさま。この板へは初めての書き込みです。
 
EXCEL・VBAからACCESSへの接続にあって、以下のコードを見かけました。
 
  Dim Rec As New ADODB.Recordset
   
  Set Rec = AdCon.OpenSchema(adSchemaTables)
  Do Until Rec.EOF
    If Rec!TABLE_NAME = tbNane Then
    ・・・・
 
スキーマを開いてテーブルの存在を確認する、ってコードです。
 
この「Rec!TABLE_NAME」の「!」に戸惑っています。
これについて、ご教示いただけれは幸いです。

回答
投稿日時: 20/07/03 21:41:51
投稿者: よろずや

S.Kos さんの引用:
この「Rec!TABLE_NAME」の「!」に戸惑っています。
戸惑うのは当然です。
 
歴史的には、プロパティやメソッドを記述するときには「.」を、
コレクションを記述するときには「!」を使うとしていました。
 
しかし、それは徹底されずどちらでも「.」で記述できるような、
あいまいな感じになっています。
 
簡単に言うと、ベテランは「!」を使い分けているが、
新しい人は区別しない人が多いというような感じですかね。

回答
投稿日時: 20/07/05 21:31:43
投稿者: hatena
投稿者のウェブサイトに移動

OpenSchema メソッド (ADO) | Microsoft Docs
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/openschema-method-ado
 
上記によると OpenSchemaメソッドの戻り値はRecordsetオブジェクトです。
 
Rec!TABLE_NAME はRecordsetオブジェクト「Rec」のFieldsコレクションのFieldオプジェクト「TABLE_NAME」の値を参照するという意味になります。
 
省略せずに記述すると、下記になります。
Rec.Fields("TABLE_NAME").Value
 
TABLE_NAME はプロパティではないので、
Rec.TABLE_NAME
というような記述はできません。

回答
投稿日時: 20/07/06 09:39:16
投稿者: sk

S.Kos さんの引用:
「Rec!TABLE_NAME」の「!

ディクショナリアクセス演算子です。
 
Microsoft Docs より:
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/program-structure/special-characters-in-code
 
引用:
型のメンバーにアクセスするには、型名とメンバー名の間に
ドット (.) または感嘆符 (!) 演算子を使用します。

引用:
. 演算子は、クラス、構造体、インターフェイス、または列挙型で
メンバー アクセス演算子として使用します。
メンバーには、フィールド、プロパティ、イベント、またはメソッドを指定できます。

引用:
! 演算子は、ディクショナリ アクセス演算子として
クラスまたはインターフェイスでのみ使用します。
クラスまたはインターフェイスには、単一の String 引数を受け入れる
既定のプロパティが必要です。
! 演算子の直後の識別子は、既定のプロパティに文字列として
渡される引数値になります。

既定のプロパティが定義されているか、どのプロパティが既定のプロパティであるかは
それぞれのオブジェクトによって異なります。
 
S.Kos さんの引用:
Dim Rec As New ADODB.Recordset

hatena さんの引用:
Rec.Fields("TABLE_NAME").Value

・ADODB.Recordset オブジェクトの既定のプロパティは
 Fields プロパティである。
 
・Fields プロパティはそのレコードセットのフィールドの集合に当たる
 ADODB.Fields オブジェクト(コレクション)への参照を返す。
 
・ADODB.Fields オブジェクトの既定のプロパティは
 Item プロパティである。
 
・Item プロパティにフィールドのインデックスを示す整数値、
 またはフィールドの名前を示す文字列を渡すことによって、
 任意のフィールド( ADODB.Field オブジェクト)を参照することが出来る。
 
・ADODB.Field オブジェクトの既定のプロパティは
 Value プロパティである。
 
-----------------------------------------------------------------------
Debug.Print rs.Fields.Item("TABLE_NAME").Value  '全ての既定のプロパティを明示的に指定した場合
Debug.Print rs.Fields.Item("TABLE_NAME")        'Value の指定を省略
Debug.Print rs.Fields("TABLE_NAME")             'Item の指定を省略
Debug.Print rs.Fields![TABLE_NAME]              'Item へのディクショナリアクセス
Debug.Print rs![TABLE_NAME]                     'Fields の指定を省略
-----------------------------------------------------------------------

回答
投稿日時: 20/07/06 10:07:24
投稿者: hatena
投稿者のウェブサイトに移動

sk さんの引用:
ディクショナリアクセス演算子です。
 
Microsoft Docs より:
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/program-structure/special-characters-in-code

 
完璧な回答!さすがskさん。
 
ディクショナリアクセス演算子、初めて知りました。公式のドキュメントも初めて見ました。明快に解説してますね。

投稿日時: 20/07/06 11:28:00
投稿者: S.Kos

博雅集うこの板、みなさまの知識量と解説力には、驚くしかありません。
おひとりつづのお名前は記しませんが、皆様に、厚く御礼申し上げます。
 
ありがとうございました。