昨日書店で久々にVBA エキスパートの公式テキストを読んでいたら、用語の説明でおかしなところに気づいた。
VBAエキスパート公式テキスト Excel VBA ベーシック [模擬問題プログラム付き]
- 作者: 田中亨
- 出版社/メーカー: オデッセイコミュニケーションズ
- 発売日: 2009/03/31
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 19回
- この商品を含むブログ (4件) を見る
ステートメントという用語である。
テキストには、ステートメントとは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 '★
一般的なプログラミング用語に照らし合わせるとこれは間違っている。
ステートメントとは英語で「述べること」という意味で、プログラミングにおいては命令として成り立つすべての文を指す。
代入や関数呼び出しも、すべてステートメントである。
「何々を之々に代入すべし」「何某を呼び出すべし」と述べられているのだ。
私の知識がまちがっているのかもしれないので一応以下の書籍で確認してみたが、やはりステートメントとはすべての完結した命令を指している。
- 作者: Jesse Liberty,Brian MacDonald,日向俊二
- 出版社/メーカー: オライリージャパン
- 発売日: 2006/08/01
- メディア: 単行本
- 購入: 1人 クリック: 3回
- この商品を含むブログ (11件) を見る
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
この正式名称は知らないが、"ステートメントの改行"とでも呼んでおこう。
参考資料を読むときに、自分のなかで用語の定義が間違っていると、とんでもない勘違いが起きたりする。
文章を読んで理解できないものがあれば、まず用語の定義を正しく理解しているか、もういちど確かめてみよう。