VBAのステートメントと組み込み関数の違いを理解する
Copyright © 2026 LWP 山中 一弘
本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。
記事要約
VBAには、見た目が関数のように見えるものと、言語の構文として扱うべきものが混在しています。
たとえば If や While は明らかに制御構文です。一方で、Mid、Left、Len のような組み込み関数、あるいは一部のステートメントは、使い方だけを見ると「関数呼び出し」と「文法の一部」の境界が見えにくくなります。
この記事では、VBAのステートメントと組み込み関数を、「コード上は何として解析されるか」という視点で整理します。
本記事の対象とゴール
VBAの文法と組み込み関数の違いが曖昧になっている人
If、For、While のような構文と、関数呼び出しの違いを説明したい人
VBAの仕様を読むときに、ステートメントという言葉をどう扱うか整理したい人
先に結論
ステートメントは、VBAの構文を構成する要素です。
組み込み関数は、関数として呼び出される要素です。
内部的にはランタイムが何らかの処理を呼び出しているとしても、VBAコードを書く立場では、ステートメントは「関数呼び出し規約に従って呼ぶもの」ではなく、「構文解析の対象になる文法要素」として扱うのが分かりやすいです。
<!-- LWP_REWRITE_EXPANSION_記事102 -->
1. 構文と呼び出しを分ける
VBAを読むときは、まず「これは文法そのものか」「値を返す呼び出しか」を分けます。If、For、Do、Select Case は、プログラムの流れを作る構文です。利用者が同じ形の関数を自作して、言語の制御構造そのものを置き換えることはできません。
一方で、Len、Left$、Mid$、Replace、DateSerial のようなものは、引数を渡して結果を得る関数として読めます。実装がランタイム内部にあっても、コード上の読み方は関数呼び出しです。
この切り分けができると、仕様書を読むときに迷いにくくなります。ステートメントは構文、組み込み関数は評価される式の一部として扱います。
2. 実務コードで迷う場所
実務では、Call、Let、Set、Mid ステートメントのように、歴史的なBasicの名残を持つ構文が混ざります。ここで大切なのは、名前の見た目ではなく、その行が何を作っているかです。
制御の形を作るなら構文として読む。
値を返すなら式として読む。
オブジェクト参照を結びつけるなら代入構文として読む。
文字列の一部を書き換えるような特殊な文は、仕様上のステートメントとして扱う。
曖昧なものほど、呼び出し記法だけで判断しないことが重要です。
3. 読み分けると保守しやすくなる
構文と関数を分けて読めると、リファクタリングの判断も安定します。関数呼び出しであれば、引数、戻り値、副作用、型変換を確認します。構文であれば、処理範囲、分岐条件、ループの終了条件、スコープを確認します。
この違いを曖昧にしたまま読むと、制御構造を関数呼び出しのように見てしまい、仕様上できない置き換えを考えてしまいます。VBAの古さに振り回されないためにも、まずコード上の役割で分類します。
ステートメントは構文である
If、For、While のようなものは、関数ではありません。
これらは、VBAの文法そのものです。コードを解析するとき、VBランタイムはこれらを構文として読み、実行可能な形へ変換します。
関数であれば、基本的には「名前を指定し、引数を渡し、戻り値を受ける」という呼び出しの考え方があります。しかし、制御構文にはこの形がありません。
たとえば、次のような関数を自作することはできません。
' これは概念上の例です。VBAでFor構文そのものを関数として作ることはできません。Call ForLikeFunction(i = 1 To 10, Step 1)For ... Next は関数ではなく、言語が持っている構文だからです。
組み込み関数は関数として呼び出す
一方、Len、Left、Mid、Replace のようなものは、関数として呼び出します。
Dim s As Strings = "abcdef"Debug.Print Len(s)Debug.Print Mid$(s, 2, 3)これらはVBAの組み込み機能ですが、コード上は関数呼び出しとして扱えます。
もちろん、組み込み関数も内部的にはVBランタイムの実装に入っていきます。しかし、コードを書く側から見れば、引数を渡し、値を返す関数です。
境界が見えにくい理由
VBAでは、ステートメントと関数が近い見た目を持つ場面があります。
古いBasic系言語の流れを持っているため、文として書くもの、関数として値を返すもの、実行時ライブラリに処理を任せるものが、見た目だけでは分かりにくいことがあります。
ここで重要なのは、内部実装ではなく、コード上の役割です。
構文を作っているならステートメント
値を返す呼び出しとして使うなら関数
制御の形そのものを作っているなら、関数ではなく文法要素
このように整理すると、VBAの仕様を読むときに迷いにくくなります。
仕様を読むときの見方
VBAの言語仕様を読むときは、「この機能は関数なのか、ステートメントなのか」を意識します。
ステートメントであれば、呼び出し方ではなく構文として理解します。構文である以上、自作関数で同じ形を再現できるとは限りません。
組み込み関数であれば、引数、戻り値、型変換、副作用を確認します。
この違いが見えると、VBAのコードを「なんとなく動くもの」ではなく、「構文として処理される部分」と「関数として評価される部分」に分けて読めるようになります。
まとめ
VBAのステートメントは、言語の文法を構成する要素です。
VBAの組み込み関数は、関数として呼び出す要素です。
内部的にはどちらもランタイム処理へ進みますが、コードを書く側ではこの2つを分けて考える方が実務的です。
「関数として作れるもの」と「言語構文としてしか存在しないもの」を分けて見ることが、VBA仕様を読む第一歩になります。
出典メモ- 元Posfie URL: https://posfie.com/@hoehoe1234/p/9OGYY5L
元Posfieタイトル: 2022-01-27 VBA ステートメントと組み込み関数
投稿者: hoehoe1234
投稿数: 4
画像確認: 画像なし
取得・確認日: 2026-06-11
参考: Microsoft Open Specifications, [MS-VBAL] Visual Basic for Applications Language Specification, https://learn.microsoft.com/en-us/openspecs/microsoft_general_purpose_programming_languages/ms-vbal/
