VBAでループでセルの値を取得したいときはないでしょうか。
けど、そんな中で悩むことは、
・VBAでループでセルの値を取得したが思うように取得できず困っている
ですよね。
今回はそんなお悩みを解決する
についてまとめます!
もくじ
VBAでループでセルの値を取得するイメージ
VBAでループでセルの値を取得するイメージについて説明をします。
Excel側に表を作成します。
VBAを実行すると、表の行数分ループしてセルの値を取得することができます。
それをループ処理別に5パターンに直接セルを参照する方式と配列に格納して処理する形式それぞれ2つに分けて説明をしていきます。
それでは早速試してみましょう。
VBAでループでセルの値を取得する方法①:For…Next ステートメントを使用する
VBAでループでセルの値を取得する方法①:For…Next ステートメントを使用する方法について説明をします。
ループでセルの値を取得する表を準備する
Excel側に”Sheet1″シートを作成し、セルの値を取得する対象となる表を作成します。
ループでセルの最終行を取得する対象の列はA列となります。
For…Next ステートメントの構文
For…Next ステートメントの構文は以下の通りです。
For counter = start To end step [ statements ]
[ Exit For ]
Next counter
For…Next ステートメントの構文の指定項目は以下の通りです。
パーツ | 説明 |
---|---|
counter | 必須。 ループ カウンターとして使用する数値変数を指定します。 この変数には、ブール値または配列要素を指定できません。 |
start | 必須です。counterの初期値を指定します。 |
end | 必須。counterの最終値を指定します。 |
step | オプション。 ループを繰り返すたびに、counterの数が変更されます。 省略されると、stepは既定値の 0 になります。 |
statements | 省略可能。 指定した回数実行されるForとNextの間の 1 つ以上のステートメント。 |
Exit For | For ループを抜けます。 |
参考:https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/fornext-statement
【Excel VBA】For Next文の使い方!抜ける方法や別シート転記も!
【Excel VBA】奇数/偶数を判定し抽出する方法!Mod演算子使用!
For…Next ステートメント+セルを直接参照するパターン①a
VBAコード
For…Next ステートメント+セルを直接参照するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得①a()
Dim intLastRowNum As Integer
Dim i As Integer
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To intLastRowNum
Debug.Print .Cells(i, 1).Value & "|" & .Cells(i, 2).Value & "|" & .Cells(i, 3).Value
Next i
End With
End Sub
VBAの実装
VBAの実装方法については
VBAの実装手順
をご参照ください。
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1|A|100
2|B|110
3|C|120
4|D|130
5|E|140
6|F|150
7|G|160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
For…Next ステートメントで2行目から最終行目まで繰り返し処理をおこないます。
For i = 2 To intLastRowNum
CellsオブジェクトのValueプロパティでセルの値を取得し、 “|”区切りで文字結合をして出力します。
Debug.Print .Cells(i, 1).Value & "|" & .Cells(i, 2).Value & "|" & .Cells(i, 3).Value
For…Next ステートメント+値を代入した配列で処理するパターン①b
VBAコード
For…Next ステートメント+値を代入した配列で処理するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得①b()
Dim intLastRowNum As Integer
Dim arrTemp As Variant
Dim i As Integer
Dim j As Integer
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
'セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
For i = LBound(arrTemp, 1) To UBound(arrTemp, 1)
For j = LBound(arrTemp, 2) To UBound(arrTemp, 2)
Debug.Print arrTemp(i, j)
Next j
Next i
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1
A
100
2
B
110
3
C
120
4
D
130
5
E
140
6
F
150
7
G
160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
For…Next ステートメントで配列のはじめのインデックスから最終インデックスまで繰り返し処理をおこないます。
Lbound関数はインデックスの最小値、Ubound関数は配列のインデックスの最大値を返します。
二次元配列となっているので、Lbound関数、Ubound関数に1次元、2次元を引数に指定し、それぞれの配列インデックス数分処理を繰り返しています。
For i = LBound(arrTemp, 1) To UBound(arrTemp, 1)
For j = LBound(arrTemp, 2) To UBound(arrTemp, 2)
二次元配列の値を出力していきます。
Debug.Print arrTemp(i, j)
VBAでループでセルの値を取得する方法②:For Each…Next ステートメントを使用する
VBAでループでセルの値を取得する方法②:For Each…Next ステートメントを使用する方法について説明をします。
For Each…Next ステートメントの構文
For Each…Next ステートメントの構文は以下の通りです。
For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
For Each…Next ステートメントの構文の指定項目は以下の通りです。
パーツ | 説明 |
---|---|
element | 必須。 コレクションまたは配列の要素を反復処理するために使用される変数です。 コレクションの場合、要素にはVariant変数、汎用オブジェクト変数、または特定のオブジェクト変数のみを指定できます。 配列の場合は、elementに使用できるのはVariant変数だけです。 |
group | 必須。 オブジェクトのコレクションまたは配列の名前です (ユーザー定義型の配列を除きます)。 |
statements | 省略可能。groupの各アイテムに対して実行される 1 つ以上のステートメントです。 |
Exit For | For ループを抜けます。 |
参考:https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/for-eachnext-statement
【Excel VBA】For Each Next文の使い方!配列操作や抜ける方法も!
For Each…Next ステートメント+セルを直接参照するパターン②a
VBAコード
For Each…Next ステートメント+セルを直接参照するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得②a()
Dim intLastRowNum As Integer
Dim rngTemp As Range
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
For Each rngTemp In .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
Debug.Print rngTemp.Cells(1, 1).Value
Next
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1
A
100
2
B
110
3
C
120
4
D
130
5
E
140
6
F
150
7
G
160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
For Each…Next ステートメントでセル範囲分処理を繰り返します。同時に変数rngTempへセル範囲の一部を代入していきます。
For Each rngTemp In .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
rngTempの左上セル(1,1)の値を出力します。
Debug.Print rngTemp.Cells(1, 1).Value
For Each…Next ステートメント+値を代入した配列で処理するパターン②b
VBAコード
For Each…Next ステートメント+値を代入した配列で処理するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得②b()
Dim intLastRowNum As Integer
Dim arrTemps As Variant
Dim arrTemp As Variant
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
'セル範囲を二次元配列として配列に代入します。
arrTemps = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
For Each arrTemp In arrTemps
Debug.Print arrTemp
Next
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1
2
3
4
5
6
7
A
B
C
D
E
F
G
100
110
120
130
140
150
160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
For Eachステートメントで配列を1件づつ取り出し配列件数分処理を繰り返します。
For Each arrTemp In arrTemps
変数の値を出力していきます。
Debug.Print arrTemp
VBAでループでセルの値を取得する方法③:While…Wend ステートメントを使用する
VBAでループでセルの値を取得する方法③:While…Wend ステートメントを使用する方法について説明をします。
While…Wendステートメントの構文
While…Wendステートメントの構文は以下の通りです。
While condition
[statements]
Wend
While…Wendステートメントの構文の指定項目は以下の通りです。
パーツ | 説明 |
---|---|
condition | 必須。TrueまたはFalseに評価される数値式または文字列式です。conditionがNullの場合は、conditionがFalseとして処理されます。 |
statements | 省略可能。 条件がTrueの間に実行される 1 つ以上のステートメントです。 |
参考:https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/whilewend-statement
While…Wendステートメント+セルを直接参照するパターン③a
VBAコード
While…Wendステートメント+セルを直接参照するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得③a()
Dim intLastRowNum As Integer
Dim i As Integer
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
i = 2
While i <= intLastRowNum
Debug.Print .Cells(i, 1).Value & "|" & .Cells(i, 2).Value & "|" & .Cells(i, 3).Value
i = i + 1
Wend
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1|A|100
2|B|110
3|C|120
4|D|130
5|E|140
6|F|150
7|G|160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
開始する行数を指定します。
i = 2
While…Wendステートメントで最終行数分処理を繰り返します。条件達成のための動的要素も必要となるため変数iをインクリメントします。
While i <= intLastRowNum
i = i + 1
CellsオブジェクトのValueプロパティでセルの値を取得し、 “|”区切りで文字結合をして出力します。
Debug.Print .Cells(i, 1).Value & "|" & .Cells(i, 2).Value & "|" & .Cells(i, 3).Value
While…Wendステートメント+値を代入した配列で処理するパターン③b
VBAコード
While…Wendステートメント+値を代入した配列で処理するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得③b()
Dim intLastRowNum As Integer
Dim arrTemp As Variant
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
'セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
i = LBound(arrTemp, 1)
While i <= UBound(arrTemp, 1)
Debug.Print arrTemp(i, 1) & "|" & arrTemp(i, 2) & "|" & arrTemp(i, 3)
i = i + 1
Wend
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1|A|100
2|B|110
3|C|120
4|D|130
5|E|140
6|F|150
7|G|160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
配列の最小インデックスを取得し、変数に代入します。
i = LBound(arrTemp, 1)
While…Wendステートメントで最終行数分処理を繰り返します。条件達成のための動的要素も必要となるため変数iをインクリメントします。
While i <= intLastRowNum
i = i + 1
配列のインデックスごとの値を取得し、 “|”区切りで文字結合をして出力します。
Debug.Print arrTemp(i, 1) & "|" & arrTemp(i, 2) & "|" & arrTemp(i, 3)
VBAでループでセルの値を取得する方法④:Do While…Loop ステートメントを使用する
VBAでループでセルの値を取得する方法④:Do While…Loop ステートメントを使用する方法について説明をします。
Do While…Loop ステートメントの構文
Do While…Loop ステートメントの構文は以下の通りです。
Do while condition
[statements]
Loop
Do While…Loop ステートメントの構文の指定項目は以下の通りです。
パーツ | 説明 |
---|---|
condition | 省略可能。TrueまたはFalseに評価される数式または文字列式です。conditionがNullの場合、conditionはFalseとして扱われます。 |
statements | conditionがTrueの間または True になるまで繰り返し実行する 1 つ以上のステートメントです。 |
参考:https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/doloop-statement
Do While…Loop ステートメント+セルを直接参照するパターン④a
VBAコード
Do While…Loop ステートメント+セルを直接参照するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得④a()
Dim intLastRowNum As Integer
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
i = 2
Do While i <= intLastRowNum
Debug.Print .Cells(i, 1).Value & "|" & .Cells(i, 2).Value & "|" & .Cells(i, 3).Value
i = i + 1
Loop
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1|A|100
2|B|110
3|C|120
4|D|130
5|E|140
6|F|150
7|G|160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
開始する行数を指定します。
i = 2
Do While…Loop ステートメントで最終行数分処理を繰り返します。条件達成のための動的要素も必要となるため変数iをインクリメントします。
Do While i <= intLastRowNum
i = i + 1
CellsオブジェクトのValueプロパティでセルの値を取得し、 “|”区切りで文字結合をして出力します。
Debug.Print .Cells(i, 1).Value & "|" & .Cells(i, 2).Value & "|" & .Cells(i, 3).Value
Do While…Loop ステートメント+値を代入した配列で処理するパターン④b
VBAコード
Do While…Loop ステートメント+値を代入した配列で処理するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得④b()
Dim intLastRowNum As Integer
Dim arrTemp As Variant
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
'セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
i = LBound(arrTemp, 1)
Do While i <= intLastRowNum
Debug.Print arrTemp(i, 1) & "|" & arrTemp(i, 2) & "|" & arrTemp(i, 3)
i = i + 1
Loop
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1|A|100
2|B|110
3|C|120
4|D|130
5|E|140
6|F|150
7|G|160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
配列の最小インデックスを取得し、変数に代入します。
i = LBound(arrTemp, 1)
Do While…Loop ステートメントで最終行数分処理を繰り返します。条件達成のための動的要素も必要となるため変数iをインクリメントします。
Do While i <= intLastRowNum
i = i + 1
配列のインデックスごとの値を取得し、 “|”区切りで文字結合をして出力します。
Debug.Print arrTemp(i, 1) & "|" & arrTemp(i, 2) & "|" & arrTemp(i, 3)
VBAでループでセルの値を取得する方法⑤:Do…Loop While ステートメントを使用する
VBAでループでセルの値を取得する方法⑤:Do…Loop While ステートメントを使用する方法について説明をします。
Do…Loop While ステートメントの構文
Do…Loop While ステートメントの構文は以下の通りです。
Do
[statements]
Loop while condition
Do…Loop While ステートメントの構文の指定項目は以下の通りです。
パーツ | 説明 |
---|---|
condition | 省略可能。TrueまたはFalseに評価される数式または文字列式です。conditionがNullの場合、conditionはFalseとして扱われます。 |
statements | conditionがTrueの間または True になるまで繰り返し実行する 1 つ以上のステートメントです。 |
参考:https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/doloop-statement
Do…Loop While ステートメント+セルを直接参照するパターン⑤a
VBAコード
Do…Loop While ステートメント+セルを直接参照するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得⑤a()
Dim intLastRowNum As Integer
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
i = 2
Do
Debug.Print .Cells(i, 1).Value & "|" & .Cells(i, 2).Value & "|" & .Cells(i, 3).Value
i = i + 1
Loop While i <= intLastRowNum
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1|A|100
2|B|110
3|C|120
4|D|130
5|E|140
6|F|150
7|G|160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
開始する行数を指定します。
i = 2
Do…Loop While ステートメントで最終行数分処理を繰り返します。条件達成のための動的要素も必要となるため変数iをインクリメントします。
Do
i = i + 1
Loop While i <= intLastRowNum
CellsオブジェクトのValueプロパティでセルの値を取得し、 “|”区切りで文字結合をして出力します。
Debug.Print .Cells(i, 1).Value & "|" & .Cells(i, 2).Value & "|" & .Cells(i, 3).Value
Do…Loop While ステートメント+値を代入した配列で処理するパターン⑤b
VBAコード
Do…Loop While ステートメント+値を代入した配列で処理するパターンとなります。
サンプルのVBAコードは以下の通りです。
Sub ループでセルの値を取得⑤b()
Dim intLastRowNum As Integer
Dim arrTemp As Variant
'"Sheet1"シートを対象にします。
With Sheets("Sheet1")
'最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
'セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
i = LBound(arrTemp, 1)
Do
Debug.Print arrTemp(i, 1) & "|" & arrTemp(i, 2) & "|" & arrTemp(i, 3)
i = i + 1
Loop While i < intLastRowNum
End With
End Sub
VBAを実行する
VBAを実行してみましょう。
イミディエイトウィンドウにセルの値が表示されましたね!
1|A|100
2|B|110
3|C|120
4|D|130
5|E|140
6|F|150
7|G|160
VBAの説明
VBAについて説明をします。
“Sheet1″シートを対象にします。
With Sheets("Sheet1")
対象の表のA列最終行数を取得します。
intLastRowNum = .Cells(Rows.Count, 1).End(xlUp).Row
セル範囲を二次元配列として配列に代入します。
arrTemp = .Range(.Cells(2, 1), .Cells(intLastRowNum, 3))
配列の最小インデックスを取得し、変数に代入します。
i = LBound(arrTemp, 1)
Do…Loop While ステートメントで最終行数分処理を繰り返します。条件達成のための動的要素も必要となるため変数iをインクリメントします。
Do
i = i + 1
Loop While i < intLastRowNum
配列のインデックスごとの値を取得し、 “|”区切りで文字結合をして出力します。
VBAの実装手順
実装手順は以下の通りです。
Excel側にVBAを実装していきます。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
VBAを実行する
では早速VBAの実行をしてみましょう。
①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。
②処理がされたことが確認できれば完了です。
さいごに
いかがでしょうか。
今回は、
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す