ステートメントと関数の違いは書き方が違う
VBAでは記述の仕方でステートメントと呼ぶ場合と関数と呼ぶ場合に分かれるものがあります。
例えばFileCopyステートメントとFileCopy関数などです。
構文が以下のように異なります。
ステートメント
FileCopy Source, Destination
関数
Sub FileCopy(Source As String, Destination As String)
実際はどちらもファイルのコピーを行うという同じことをやっているので、どちらで書いても構いません。
ステートメントと関数の厳密な違い
上記の通り、ステートメントも関数もやってることは同じなので、好きな方を書けばOKなんですが、言葉の定義としての「ステートメント」と「関数」の違いはあります。
ステートメントとは
ステートメントとは処理の最小単位のことを指し、1行で記述する処理単位のことを言います。その1行で処理が完結している状態です。
1行が長くなりアンダーバーで改行している場合も1行の場合と同様に1つのステートメントとみなします。
ステートメントは関数と異なり、値を返すことはありません。「処理行」と言った方がイメージしやすいかもしれません。
以下のプロシージャ内の全ての行(2行目から6行目)はそれぞれが1つのステートメントになります。
1 2 3 4 5 6 7 |
Sub StatementTest() Range("A1").Select Range("A1").Value = "C:\a.txt" Range("A1").Value = "C:\b.txt" FileCopy Range("A1").Value, Range("B1").Value Call FileCopy(Source:=Range("A1").Value, Destination:=Range("B1").Value) End Sub |
5行目はFileCopyステートメントを使っています。
6行目はCallステートメントを使ってFileCopy関数を利用しています。
関数とは
関数とはなんらかの一連の処理を代わりに行ってくれる機能です。
Functionプロシージャの場合は値を返しますが、Subプロシージャの場合は値を返しません。
そのため関数の場合は2通りの書き方になります。戻り値をもらう場合とそうでない場合です。
1 2 3 4 5 6 7 8 9 |
Sub FunctionTest() Dim s '// 戻り値をもらう s = Left("abc", 1) '// 戻り値をもらわない Call FileCopy("C:\a.txt", "C:\b.txt") End Sub |