例文を使って繰り返し業務を時短

【マクロ・VBA】二重ループで指定した範囲の表を処理する

エクセル、マクロ、VBAで二重ループして、指定した表を処理する VBA

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
  1. my_arrayには、現在のシートのA2セルから始まるセルのリージョンが割り当てられます。
  2. i変数が初期化されます。
  3. ループ処理がmy_array内の各要素bに対して実行されます。
  4. Ifステートメントは、bが「大阪」と等しい場合に実行されます。
  5. “大阪は、i番目です”という文字列がDebugウィンドウに出力されます。
  6. iは1つ増やされます。
  7. 3から6までのステップが、my_array内のすべての要素に対して繰り返されます。
  8. 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関数が使用されます。計算された合計値は、式を評価して表示するためにセルに直接入力されます。

最後に、新しい列の見出し行に「計」というテキストが表示されます。最後に、完了のメッセージボックスが表示されます。

コメント

タイトルとURLをコピーしました