VBA技術解説
VBAのマルチステートメント(複数のステートメントを同じ行に)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-10-14 最終更新日:2019-10-15

VBAのマルチステートメント(複数のステートメントを同じ行に)


VBAでは、基本的な決まりとして1ステートメントは1行で書くことになっています。
しかし、あまりに長くなってしまうと見づらくなります。
逆に、短いステートメントが多数行になっていても見づらい場合もあります。


1ステートメントを複数行に継続して書く方法については、マクロVBA入門で解説していますが、
あるセルの文字と、あるセルの文字をくっつけて、別のセルに表示する、よくある事例であり、頻繁に行われることです。A1セルに"abc" B1セルに"123" この時に、C1セルに"abc123"を入れるような場合のマクロVBAになります。
複数ステートメントを1行に書く方法については記載していなかったので、ここで追加解説します。

VBAでのステートメントという用語について

VBAのドキュメントでは、ステートメントという用語が二つの意味で使われています。

①Ifステートメント、Forステートメント等々、VBAに用意されたステートメント
②完結した一つの文、つまり通常改行する単位の1行全体

VBAの説明ではこれらは区別して使われず、どちらもステートメントとして説明されます。

For i = 1 To 10
  If i > 5 Then
    Cells(i, 1) = i
  End If
Next

・For ...Then ・・・ 前者①のForステートメント
・If ... ・・・ 前者①のIfステートメント
・For i = 1 To 10 ・・・ 後者②の1行1ステートメント
・If i > 5 Then ・・・ 後者②の1行1ステートメント
・Cells(i, 1) = i ・・・ 後者②の1行1ステートメント

以下の説明においても、これらを混在して使っていますので、適宜読み分けてください。

行継続(1ステートメントを複数の行に)

複数ステートメントを1行に書くことを説明する前に、
先に1ステートメントを複数行に分けて書く場合の書き方を確認しておきます。

空白(半角スペース)に続けて、_(アンダーバー)を書くと、次の行に続けて書く事が出来ます。

Sub 行継続()
  Cells(1, 6).Value = Cells(1, 1).Value & Cells(1, 2).Value & Cells(1, 3).Value & Cells(1, 4).Value & Cells(1, 5).Value
End Sub

Sub 行継続()
  Cells(1, 6).Value = Cells(1, 1).Value & _
            Cells(1, 2).Value & _
            Cells(1, 3).Value & _
            Cells(1, 4).Value & _
            Cells(1, 5).Value
End Sub

上記2つのVBAは全く同一のものとなります。
VBEを横にスクロールするのはとても見づらいものです。
適宜改行して、見やすく整形しておきましょう。

VBAマルチステートメントの基本

前置きが長くなりましたが、本題のVBAでのマルチステートメントの書き方を解説します。
1行のステートメントが非常に短く、かつ何行にもわたっている場合、
VBAの行数が多くなり、全体を見渡すのに不便な場合も出てきます。
そこで、複数のステートメントを1行にまとめて書く書き方がVBAには用意されています。

ステートメントを、:(コロン)でつなげることで1行にまとめることができます。

Dim i As Long
i = 1

これをマルチステートメントとして1行に書くと、

Dim i As Long: i = 1

このように書くことができます。
良くある使い方としては、

Dim i As Long: i = 1
Dim j As Long: j = 1

Dim i As Long, j As Long
i = 1: j = 1

この2つはどちらも同じものになります。
どちらが良いという事はなく、i,jの関係性にもよるでしょう。
i,jが同種のものなのか、全く別のものなのかということと、他の宣言との見た目で使い分けることになるでしょう。

VBAマルチステートメントの応用

事前に言っておきますが、以下の使い方は本来使うべきではないと思います。
しかし、極めて特殊な状況において使いたい場合も出てくるかもしれません。
知識として知っておくことは悪い事ではないという事で、あえて説明しておきます。

上ではDim宣言に関する例を示しましたが、
ほとんどのステートメントは、:(コロン)でつなげることができます。
ただし、Ifステートメントについてはかなり制限があります。
※以下の参考VBAでは、変数宣言されているものとして変数宣言を省略しています。

If i = 0 Then
  i = 1
Else
  i = i + 1
End If

これをマルチステートメントとして記述する場合、

If i = 0 Then: i = 1: Else: i = i + 1: End If

これはエラーになります。

VBA マクロ マルチステートメント

End Ifはマルチステートメントでは使う事が出来ません。

If i = 0 Then: i = 1: Else: i = i + 1

このように、End Ifを書かなければマルチステートメントにできます。

If i = 0 Then: i = 1: i = 2: Else: i = i + 1: i = i + 2

このように、Then、Elseにそれぞれ複数のステートメントを入れることも可能です。
では、他の構文ではどうでしょうか。

Select Case i: Case 0: i = 1: Case Is >= 1:: i = i + 1: End Select

For i = 1 To 10: Cells(i, 1) = i: Next

For Each ws In Worksheets: Debug.Print ws.Name: Next

Do While i <= 10: i = i + 1: Loop

With ActiveSheet: i = 1: .Cells(i, 1) = "abc": End With

以上、全て問題なく正しく動作します。
では、これらの構文をネストする場合はどうでしょうか。

With ActiveSheet: For i = 1 To 10: .Cells(i, 1) = i: Next: End With

これは問題ありません。
では、Ifステートメントをネストした場合はどうでしょうか。

For i = 1 To 10: If i = 0 Then: j = 1: Else: j = j + 1: Next

これは入力した時点で赤字エラーとなってしまいます。
Ifステートメントに関しては、前述した通り制限があり使えません。
しかし、これはSelect Caseを使って書き直すことができます。

For i = 1 To 10: Select Case i: Case 0: j = 1: Case Else: j = j + 1: End Select: Next

これなら問題なく動作します。
どうやら、マルチステートメントにおいてはEnd Ifが書けないことからくる制限で、
ほとんどIfステートメントが使用できなくなってしまっているようです。
その他の制限はほとんど(まだ他にもありそうではありますが)見当たりませんでした。

マルチステートメントの最後に

マルチステートメントの書き方について説明してきましたが、
積極的に使うべきものではないとことは再度言っておきます。
使うとしたら、
「VBAマルチステートメントの基本」で説明した、
変数宣言と初期値代入くらいに限定した使い方までが良いでしょう。
本サイト内でも、変数宣言と初期値代入については使っているVBAも掲載していますので、
今回はマルチステートメントについて詳しく解説しておきました。



同じテーマ「マクロVBA技術解説」の記事

ShapesとDrawingObjectsの相違点と使い方

・Shapes コレクション ・DrawingObjects コレクション ・ShapesとDrawingObjectsの相違点 ・DrawingObjectsの便利な使い道 ・最後に ・図形オートシェイプ(Shape)に関連する記事
新規挿入可能なシート名の判定
・シート名として使える文字列か判定 ・シートの存在確認:存在すればシートのオブジェクトを返す ・シートの挿入:存在すればシートのオブジェクトを返す
VBAにおける配列やコレクションの起点について
・配列の起点について ・コレクション ・Collectionオブジェクト ・その他:文字列関数 ・配列の起点の原則
VBAのマルチステートメント(複数のステートメントを同じ行に)
クリップボードに2次元配列を作成してシートに貼り付ける
・クリップボードのデータ取得/クリップボードへデータ送信 ・エクセルの行・列のデータ ・クリップボードに2次元配列を作成してシートに貼り付けるVBA ・クリップボードに2次元配列の最後に
ユーザー定義型の制限とクラスとの使い分け
・ユーザー定義型 ・クラスについて ・ユーザー定義型とクラスの速度比較 ・ユーザー定義型の制限 ・ユーザー定義型の制限とクラスとの使い分け
シングルクォートの削除とコピー(PrefixCharacter)
・シングルクォーテーション意味 ・VBAでシングルクォーテーションがコピーされる場合と消える場合 ・VBAでのシングルクォーテーションの取得方法 ・VBAでシングルクォーテーションを取り除くVBA ・VBAでシングルクォーテーションを含めて値コピーするVBA
空文字列の扱い方と処理速度について(""とvbNullString)
・String型変数のメモリ配置と取得する関数 ・空文字列について ・String変数に空文字列を入れる ・セルに空文字列を入れる ・Stringが空文字列か判定 ・InputBox関数の戻り値が空文字列判定 ・空文字列の処理方法による速度比較
VBAにおける変数のメモリアドレスについて
・メモリアドレスを取得する関数とメモリコピーのWindowsAPI ・メモリアドレスを確認するために使用したVBA ・文字列型Stringのメモリアドレス ・Integer, Long, Single, Double, Dateのメモリアドレス ・Variantのメモリアドレス ・配列のメモリアドレス ・オブジェクトのメモリアドレス ・ByRef,ByValのメモリアドレス
Evaluateメソッド(文字列の数式を実行します)
・Evaluateメソッドの構文 ・Evaluateメソッドの解説と使用例 ・Evaluateメソッドの最後に
Rangeオブジェクトの論理演算(差集合と排他的論理和)
・集合について ・Rangeオブジェクトの論理演算のVBAについて ・和集合:Unionメソッド ・積集合:Intersectメソッド ・補集合 ・差集合 ・排他的論理和 ・Rangeオブジェクトの論理演算VBAの使い方とテスト


新着記事NEW ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ