For~Nextの二重ループで処理したあと右隣りのシートに転記する
現在アクティブなシートにある表のデータをループ処理して、別の新しいシートに転記するマクロです。
Sub 表ループして新規シートに貼付け()
Dim 行 As Long
Dim 列 As Long
Dim 番号 As Long
Dim LastRow1 As Long
LastRow1 = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
Dim LastCol1 As Long
LastCol1 = ActiveSheet.Cells(2, Columns.Count).End(xlToLeft).Column
Worksheets.Add(After:=ActiveSheet).Name = ActiveSheet.Name & "_" & VBA.Format(Now(), "h時mm分ss秒")
Set Target = ActiveSheet
ActiveSheet.Previous.Select
番号 = 2
For 行 = 2 To LastRow1
For 列 = 2 To LastCol1
If Cells(行, 列).Value <> "" Then
Cells(行, 1).Copy ActiveSheet.Next.Cells(番号, 1)
Cells(行, 2).Copy ActiveSheet.Next.Cells(番号, 2)
Cells(1, 列).Copy ActiveSheet.Next.Cells(番号, 3)
Cells(行, 列).Copy ActiveSheet.Next.Cells(番号, 4)
番号 = 番号 + 1
End If
DoEvents
Next 列
Next 行
ActiveSheet.Next.Activate
Cells(1, 1) = "項目名1"
Cells(1, 2) = "項目名2"
Cells(1, 3) = "項目名3"
Cells(1, 4) = "項目名4"
'ActiveSheet.Previous.Select
MsgBox "完了 "
End Sub
解説
- Dim 行 As Long, 列 As Long, 番号 As Long: 変数宣言。この場合、行、列、番号の3つの変数が宣言されています。
- Dim LastRow1 As Long, LastCol1 As Long: 変数宣言。この場合、表の最終行と最終列の行番号、列番号を示す変数が宣言されています。
- LastRow1 = ActiveSheet.Cells(Rows.Count, 2).終了(xlUp)。Row: 最終行の行番号を取得するためのコード。ActiveSheetでアクティブなシートを取得し、Rows.Countでシートの行数を取得し、2列目から上に向かってxlUpを指定して最初に空でないセルを取得して、その行番号をLastRow1に代入しています。
- LastCol1 = ActiveSheet.Cells(2, Columns.Count).End(xlToLeft).Column: 最終列の列番号を取得するためのコード。ActiveSheetでアクティブなシートを取得し、Columns.Countでシートの列数を取得し、2行目から右に向かってxlToLeftを指定して最初に空でないセルを取得して、その列番号をLastCol1に代入しています。
- Worksheets.Add(After:=ActiveSheet).Name = ActiveSheet.Name & “_” & VBA.Format(Now(), “h時mm分ss秒”): 現在アクティブなシートの後ろに新しいシートを作成して、そのシートの名前を設定しています。シート名は、アクティブなシートの名前に現在の時刻を追加しています。
- Set Target = ActiveSheet: Target変数をアクティブなシートに設定しています。
- ActiveSheet.Previous.Select: 新しいシートをアクティブにし、アクティブなシートに切り替えています。
- 番号 = 2: 新しいシートに貼り付けるときの最初の行番号を2に設定しています。
- For 行 = 2 To LastRow1、For 列 = 2 To LastCol1: 最初のループは、表の2行目と2列目から始まります。これは、1行目と1列目は、項目名が記載されていることが多いため、ループ処理の対象から外しています。
- If Cells(行, 列).値 <> “”: ループしているセルが空でない場合に、そのセルの値を新しいシートに転記する処理を実行します。
- セル(行, 1).アクティブシートをコピーします。次へ.セル
ダミーデータのダウンロード
ダミーデータのダウンロード
For Each~Nextで表をループ処理する
このVBAコードは、指定した範囲の表をループして、条件に合致するセルの値を取得し、その隣のセルの値を新しい列に出力するものです。
Sub 指定した範囲の表をループ()
Dim c As Range, myCnt As Long
For Each c In Range("A2:D100")
If c.Value = 5 Then
myCnt = myCnt + 1
Range("D" & myCnt).Value = c.Offset(0, 1).Value
End If
Next c
MsgBox "完了 "
End Sub
A2:D100のセル範囲を対象に、各セルの値が5である場合、その隣のセルの値を取得して、D列に新しく列挿入して出力します。
‘範囲内の各c(“A2:D100”)の行で、範囲A2:D100の各セルを順に取得します。取得されたセルを変数cに代入します。’c.Value = 5の場合、If c.Value = 5 Then
の行で、セルcの値が5である場合を判定し、その場合に’myCntmyCnt
変数を1つ増やします。そして、Range("D" & myCnt).Value = c.Offset(0, 1).Value
の行で、取得したセルcの右隣のセルの値を新しい列のD列に書き込みます。
最後に’MsgBox “完了
範囲指定データを配列に入れてFor Each~Nextで処理する
このVBAコードは、指定した範囲(A2セルから現在のリージョン内)のセルに含まれる文字列をループして、特定の文字列が含まれるセルを検索します。
Sub 表をループ()
my_array = ActiveSheet.Range("A2").CurrentRegion
i = 0
For Each b In my_array
i = i + 1
'「If」で検索
If b = "大阪" Then
'結果を出力
Debug.Print b & "は、" & i & " 番目です"
End If
Next
MsgBox "完了"
End Sub
- my_arrayには、現在のシートのA2セルから始まるセルのリージョンが割り当てられます。
- i変数が初期化されます。
- ループ処理がmy_array内の各要素bに対して実行されます。
- Ifステートメントは、bが「大阪」と等しい場合に実行されます。
- “大阪は、i番目です”という文字列がDebugウィンドウに出力されます。
- iは1つ増やされます。
- 3から6までのステップが、my_array内のすべての要素に対して繰り返されます。
- MsgBoxで完了メッセージが表示されます。
指定した範囲をSelectionで指定してFor Each~Nextで処理する
このVBAコードは、ユーザーが選択した範囲内のすべてのセルをループして、それぞれのセルの値を即座に表示するために使用されます。
Sub 選択した範囲をループ()
'選択したセル範囲を全てループ
For Each A In Selection
'セルの値をイミディエイト画面へ出力
Debug.Print A.Value
Next
MsgBox "完了"
End Sub
- ‘各Aに対して:選択範囲内の各セルについて反復処理を行うために使用されるループ。
- ‘デバッグ.出力 A.値:選択範囲内のセルの値を即座に表示するために使用されるVBAのデバッグメソッド。
- ‘MsgBox “完了
このVBAコードは、選択された範囲内の値に対して何らかの操作を行う前に、データの確認や診断に使用されます。例えば、フォーマット、スペルチェック、または重複値のチェックなどが挙げられます。
表ループ/シート内/合計表示(縦→横に移動)
Sub 合計を求める()
Dim my_array As Variant
Dim s_row, s_col As Long
Dim max_row, max_col As Long
s_row = 2
s_col = 2
max_row = Cells(Rows.Count, s_col).End(xlUp).Row
max_col = Cells(s_row, Columns.Count).End(xlToLeft).Column
'my_array = Range(Cells(s_row, s_col), Cells(max_row, max_col))
For i = s_row To max_row
Cells(i, max_col + 1).Formula = _
"=SUM(A" & i & ":" & Cells(i, max_col).Address(False, False) & ")"
Next i
Cells(1, max_col + 1) = "計"
MsgBox "完了 "
End Sub
解説
最初に、変数s_rowとs_colに2が割り当てられ、これらは処理の開始行と列を表します。その後、max_rowとmax_colに、処理する範囲の最後の行と列が設定されます。これらの変数は、ActiveCellやSelectionなどの選択された範囲を代わりに使用できます。
Forループは、s_rowからmax_rowまでの各行に対して実行され、各行のmax_colの右に合計値が書き込まれます。各セルには、SUM関数が使用され、行の最初のセル(A列)と最後のセル(max_col列)を参照するためにCells関数が使用されます。計算された合計値は、式を評価して表示するためにセルに直接入力されます。
最後に、新しい列の見出し行に「計」というテキストが表示されます。最後に、完了のメッセージボックスが表示されます。
コメント