IT系/VBA/基本/構文・ステートメント

Last-modified: 2020-08-08 (土) 08:27:47

目次


概要

構文・ステートメントに関するVBAのTIPS。になればよいけどリンク集。

構文・ステートメントとは

プログラムの構成単位で、手続きや命令、宣言などを「ステートメント」または「文」という。
「ステートメント」の書き方のルールを、構文や、文法という。

 

VBAのドキュメントでは、ステートメントという用語が二つの意味で使われている。
上記以外の意味では、VBAに用意されたSubステートメント、Dimステートメント等の命令文のことを指す。

 

本項目では、初めのステートメントの構文について、主に記載する。

ステートメントの記述

  • 1ステートメントは1行で書くことが基本。
  • 1行が非常に長くなる場合もあるため、「_」 を末尾に記述することで、ステートメントを途中で改行する記述が許されている。
    Text = _
    "Hoge" & _
    "Fuga"
  • 複数ステートメントを1行に書く方法(マルチステートメント)も用意されている。
    ステートメントを、「:」でつなげることで1行にまとめることができる。
    Dim i As Long: i = 1
    ' If文もEnd Ifを書かなければマルチステートメントで書ける。
    If i = 0 Then: i = 1: i = 2: Else: i = i + 1: i = i + 2

コメント

コメントとは、プログラムの実行に何も影響を与えないメモのこと。
処理の内容を簡潔に記載することで処理内容の意図を分かりやすくする。

  • 「'」を記述することでコメント文を記載できる。
    ' 行ごとコメント
    Sub 実行()
        Dim i As Integer ' 文末コメント
        ' 行連結文字の後ろはコメント化できない
        i = 100 + 100 + _  ' NG
             100 + 100
    End Sub
  • 「Rem」を行頭に書いても、その行はコメント行とみなされる。
    ただし、「'」のように文末に使用することはできない。
    Rem コメント1
    Sub Test1()
        Dim str As String
        Rem コメント2
    End Sub

条件付きコンパイル

VBAの特定のコードブロックを選択してコンパイルするには、条件付きコンパイルステートメントを使用する。
条件付きコンパイルステートメントは、実行時ではなくコンパイル時に実行される。

  • 条件に基づいてコンパイルするコードのブロックを指定するには#If...Then...#Else ディレクティブを使用する。
  • 主な用途としては、Win32APIを使用しているときに、Excel32ビットとExcel64 ビットの互換性を保つ為に使われる。
    例えば、以下のように宣言の切り替えを行う際に使用する。
    #If Vba7 Then
    Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
    #Else
    Declare Function GetActiveWindow Lib "user32" () As Long
    #End If
  • #If...Then...#Else ディレクティブを広域コメントアウトに使用することを考えた方もいる。便利かもしれない。
    #If COMMENT_OUT Then
    コメント:作りかけ
     Sub Test1()
         Dim str As String
     End Sub
    #End If

感嘆符演算子

「!」演算子は、ディクショナリ アクセス演算子としてクラスまたはインターフェイスでのみ使用する。

  • 以下のように、ADODBでAccessDBのテーブルにアクセスした結果から、フィールド名を指定して取得するケースで見かける記述。
    With adoRs    ' ADODB.Recordset
        Do Until .EOF
            Debug.Print !名前.Value, !番号.Value, ![なん ・・ だと].Value
            adoRs.MoveNext
        Loop
    End With
  • 「!名前.Value」は「adoRs("名前").Value」または「adoRs.Fields("名前").Value」さらには「adoRs.Fields.Item("名前").Value」と同等。
    FieldsのItemプロパティは省略してもデフォルトで呼び出される既定のプロパティであり、RecordsetのFieldsプロパティも既定のプロパティであり省略可能。
    つまり、「adoRs.Fields.Item("名前").Value」→「adoRs.Fields("名前").Value」→「adoRs("名前").Value」→「adoRs!名前.Value」と省略した形。
  • クラスまたはインターフェイスには、単一の String 引数を受け入れる既定のプロパティが必要。
  • ! 演算子の直後の識別子は、既定のプロパティに文字列として渡される引数値になる。
  • そのまま使えない文字列については「[]」で囲うことで指定可能。
  • Dictionaryでも使える。
  • MS公式では、VBAのリファレンスには載っていない(多分)。VBのリファレンスに載っている。でもVBAでも使える。

TIPS

別ページの一覧を入れる。

'IT系/VBA/基本/構文・ステートメント/' には、下位層のページがありません。

リンク集

重複を恐れないリンク集。

動画

その他メモ