t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 用語を正しく覚える ~ステートメントとは

昨日書店で久々にVBA エキスパートの公式テキストを読んでいたら、用語の説明でおかしなところに気づいた。

VBAエキスパート公式テキスト Excel VBA ベーシック [模擬問題プログラム付き]

VBAエキスパート公式テキスト Excel VBA ベーシック [模擬問題プログラム付き]

ステートメントという用語である。

テキストには、ステートメントとはDim、If、For、Subなどのプログラムの中で特殊な役割を果たす命令だと書かれている。

説明のために以下のようなプログラムを用意した。
テキストの定義によれば、ステートメントは★をつけた部分だけということになる。

Sub Main()  '★
    Dim 底辺 As Double  '★
    Dim 高さ As Double  '★
    底辺 = InputBox("底辺を入力してください。")
    高さ = InputBox("高さを入力してください。")
    If 底辺 > 0 And 高さ > 0 Then   '★
        MsgBox ("三角形の面積は" & 三角形の面積(底辺, 高さ))
    Else    '★
        MsgBox ("与えられた数値では三角形は作成できません。")
    End If  '★
End Sub '★

Function 三角形の面積(W As Double, H As Double) As Double   '★
    '任意の三角形の面積を求めるプログラム
    三角形の面積 = W * H / 2
End Function    '★


一般的なプログラミング用語に照らし合わせるとこれは間違っている。
ステートメントとは英語で「述べること」という意味で、プログラミングにおいては命令として成り立つすべての文を指す。
代入や関数呼び出しも、すべてステートメントである。
「何々を之々に代入すべし」「何某を呼び出すべし」と述べられているのだ。

私の知識がまちがっているのかもしれないので一応以下の書籍で確認してみたが、やはりステートメントとはすべての完結した命令を指している。

初めてのC# 第2版

初めてのC# 第2版

VBE の用語集で定義を調べてみると、以下のように書かれている。

1 種類の処理、宣言、または定義を表す、構文的に完全な単位。通常では 1 行に 1 ステートメントですが、コロン (:) を使用することで 1 行に複数のステートメントを記述できます。また、行連結文字 (_) を使用することにより、論理的な 1 行を物理的な複数行に継続できます。

つまり、上記のプログラムでは、すべての行がステートメントなのである。
あえて名前をつけるなら以下のようになる。

Sub Main()  'Subステートメント
    Dim 底辺 As Double  'Dimステートメント
    Dim 高さ As Double  'Dimステートメント
    底辺 = InputBox("底辺を入力してください。") '代入ステートメント
    高さ = InputBox("高さを入力してください。") '代入ステートメント
    If 底辺 > 0 And 高さ > 0 Then   'Ifステートメント
        MsgBox ("三角形の面積は" & 三角形の面積(底辺, 高さ))  '呼び出しステートメント
    Else    'Elseステートメント
        MsgBox ("与えられた数値では三角形は作成できません。") '呼び出しステートメント
    End If  'End Ifステートメント
End Sub 'End Subステートメント

Function 三角形の面積(W As Double, H As Double) As Double   'Functionステートメント
    '任意の三角形の面積を求めるプログラム   'コメントステートメント
    三角形の面積 = W * H / 2  '代入ステートメント
End Function    'End Subステートメント

DimやIf、SubなどはVBAのキーワードであって、それだけがステートメントなのではない。

代入ステートメントではLetキーワードが省略されている。
呼び出しステートメントではCallキーワードが省略されている。
また、コメントステートメントのアポストロフィーはRemキーワードの省略記法である。

すべて省略せずに書くと、こうなる。

Sub Main()
    Dim 底辺 As Double
    Dim 高さ As Double
    Let 底辺 = InputBox("底辺を入力してください。")
    Let 高さ = InputBox("高さを入力してください。")
    If 底辺 > 0 And 高さ > 0 Then
        Call MsgBox("三角形の面積は" & 三角形の面積(底辺, 高さ))
    Else
        Call MsgBox("与えられた数値では三角形は作成できません。")
    End If
End Sub

Function 三角形の面積(W As Double, H As Double) As Double
    Rem 任意の三角形の面積を求めるプログラム
    Let 三角形の面積 = W * H / 2
End Function

それぞれ、Letステートメント、Callステートメント、Remステートメントである。
これですべての命令文がステートメントであることがいっそうはっきりしたと思う。


さて、ステートメントとは完結した一文であって、"行"ではない。
さきほど上記のプログラムではすべての行がステートメントであると書いたが、それは「たまたま、上記のプログラムにおいては行とステートメントが一致した」ということである。
定義にあるように、コロンを使えば1行に複数ステートメントを書くことができる。

    Dim 底辺 As Double: Let 底辺 = InputBox("底辺を入力してください。")
    Dim 高さ As Double: Let 高さ = InputBox("高さを入力してください。")

これをマルチステートメントという。

また、スペースにつづけてアンダーバーを書くことで、1つのステートメントを複数行に分けることができる。

    Dim _
    底辺 _
    As _
    Double

この正式名称は知らないが、"ステートメントの改行"とでも呼んでおこう。

参考資料を読むときに、自分のなかで用語の定義が間違っていると、とんでもない勘違いが起きたりする。
文章を読んで理解できないものがあれば、まず用語の定義を正しく理解しているか、もういちど確かめてみよう。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。