01-VBA

制御構文|Excel VBA (Part.6)【For Next】ネスト編(前編)

お知らせ

こちらの記事は、電子書籍「難しく考えないExcel VBA基礎学習編」として出版されました。記事は途中までが試し読みの対象となります。

howahowablogのVBA記事が電子書籍にて販売となりました。

目標

For~Nextのネストを理解して利用できる
ネストした繰り返し文の動きをイメージできる
Resizeプロパティを理解して利用できる。

For~Nextステートメントのネストの利用方法と動作

For~Nextステートメントのネストの利用方法

ネストとは入れ子構造のことでした。先ずは、どのような場面で利用されるのかを考えてみたいと思います。

例えば、形式の同じ表が複数のシートに用意されているExcelファイルがあったとします。そして、各シートの表に同様の繰り返し処理を行わせたい場合、「シートを選択する繰り返し」の中に「各シートの表で共通に行わせたい繰り返しの処理」とすることで、ひとつ目の表での繰り返しの処理、ふたつ目の表での繰り返しの処理、みっつ目の表での繰り返しの処理、…と、終わったら次の表へ処理が移動するようなプログラムを記述することができます。

今回は上記のようなプログラムを記述してみます。次の制御構造(Part.7)ではもう少し複雑な処理のプロシージャを組んでみようと思います。

ネストされた繰り返し文のプログラムの動き

先ずは基本の動きを理解するためにシンプルなFor文のネストを確認します。

サンプルプロシージャ1

Sub NestFor1()

Dim i As Integer, j As Integer

For i = 1 To 5
    For j = 1 To 5
        Cells(i, j) = i * j
    Next j
Next i

End Sub

実行結果

動作の確認

繰り返しのネストでは外の繰り返しが1回動くごとに、内側の繰り返しが全て動きます。

具体的には

  1. 外側の「i」が1の時「j」が1,2,3,4,5とカウントされ5回動く
  2. 外側の「i」が2の時「j」が1,2,3,4,5とカウントされ5回動く
  3. 外側の「i」が3の時「j」が1,2,3,4,5とカウントされ5回動く
  4. 外側の「i」が4の時「j」が1,2,3,4,5とカウントされ5回動く
  5. 外側の「i」が5の時「j」が1,2,3,4,5とカウントされ5回動く

となっています。

サンプルプロシージャ2

次は、冒頭であげた「形式の同じ表が複数個用意されているExcelファイルで、それぞれの表に同様の計算や処理を行わせたい場合」について参考のプロシージャを作成します。

Dim sheetName(3) As String
sheetName(1) = "Sheet1"
sheetName(2) = "Sheet2"
sheetName(3) = "Sheet3"

Sheets("Sheet4").Select
Range("C3").Select
ActiveCell.CurrentRegion.Select
Selection.ClearContents

For i = 1 To 3
    Worksheets(sheetName(i)).Select
    Range("C3").Select
    ActiveCell.CurrentRegion.Select
    tableRow = Selection.Rows.Count
    tableColumns = Selection.Columns.Count
   
    If i = 1 Then
        Selection.Copy
        Sheets("Sheet4").Select
        Range("C3").Select
        ActiveSheet.Paste
        Range("C3").Select
    ElseIf i <> 1 Then
        ActiveCell.Offset(1, 0).Resize(tableRow - 1, tableColumns).Select
        Selection.Copy
        Sheets("Sheet4").Select
        Range("C3").Select
        Selection.End(xlDown).Select
        ActiveCell.Offset(1, 0).Select
        ActiveSheet.Paste
    End If

    Application.CutCopyMode = False
    
    If i = 3 Then
        ActiveCell.CurrentRegion.Select
        tableRow = Selection.Rows.Count
        tableColumns = Selection.Columns.Count
        ActiveSheet.Range("H5").Select
        
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        For j = 1 To tableRow - 2
            ActiveCell.FormulaR1C1 = "=R[-1]C+RC[-2]-RC[-1]"
            ActiveCell.Offset(1, 0).Select
        Next j
        Application.ScreenUpdating = True
        Application.EnableEvents = True
    End If
Next i

End Sub

ネストされているFor文は下から9行目の「For j = 1 To tableRow -2」の部分となります。

このプログラムでは下のキャプチャのような日計計算のエクセルファイルがあったと仮定して最終的な月次の収支を出すような場面を想定しています。シートは「現金収支のシート(Sheet1)」「口座収支のシート(Sheet2)」「ガード入金(Sheet3)」の三種類があり、最終的に一枚のシート(Sheet4)へ併合して月の収支を出すものです。

それぞれの収支はキャプチャのようになっています。

これら3つの表を纏めてひとつのシートに併合します。そこで月の収支を出しています。

実行結果

Sheet4に事前に準備していた表で月次の計算を行わせます。(この表はVBAではなく通常のワークシート関数を利用したエクセルの表です。)

補足説明部分

Selection.ClearContents…選択された範囲の値を消去します。

この記事の試し読みはここまでとなります。

Resizeプロパティの概要と利用方法

Resizeプロパティの概要

Resizeプロパティの利用方法

Resizeプロパティの利用例

今回は以上です。

howahowablogのVBA記事が電子書籍にて販売となりました。

初心者も実践で通用!「VBA・VBS」おすすめ書籍5選 | 現役エンジニア&プログラミングスクール講師「VBA・VBS」初心者の方が実践業務の中でそれらを活用しt活躍できるために必要な知識を習得できる書籍を紹介しています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST