お知らせ
こちらの記事は、電子書籍「難しく考えない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回動くごとに、内側の繰り返しが全て動きます。
具体的には
- 外側の「i」が1の時「j」が1,2,3,4,5とカウントされ5回動く
- 外側の「i」が2の時「j」が1,2,3,4,5とカウントされ5回動く
- 外側の「i」が3の時「j」が1,2,3,4,5とカウントされ5回動く
- 外側の「i」が4の時「j」が1,2,3,4,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)へ併合して月の収支を出すものです。
それぞれの収支はキャプチャのようになっています。
実行結果
Sheet4に事前に準備していた表で月次の計算を行わせます。(この表はVBAではなく通常のワークシート関数を利用したエクセルの表です。)
補足説明部分
Selection.ClearContents…選択された範囲の値を消去します。
この記事の試し読みはここまでとなります。
Resizeプロパティの概要と利用方法
Resizeプロパティの概要
…
Resizeプロパティの利用方法
…
Resizeプロパティの利用例
…
…
…
今回は以上です。
howahowablogのVBA記事が電子書籍にて販売となりました。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。