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

【マクロ・VBA】縦(行)ループして連番を振る 

エクセル、マクロ、VBAでループして、連番をふる VBA

ループ/最終列に連番を振る

これは、アクティブなシートの最終列に連番をふるエクセルマクロです。最終列の項目名として、「もとの順番」というテキストを追加しています。

Sub 最終列に連番を振る()

Dim wb1 As Workbook
Set wb1 = ThisWorkbook
Dim ws1 As Worksheet
Set ws1 = ActiveSheet

Dim LastRow1 As Long
LastRow1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row

Dim LastCol1 As Long
LastCol1 = ws1.Cells(1, Columns.Count).End(xlToLeft).Column

Dim i, 連番
 
 連番 = 1
 For i = 2 To LastRow1
   Cells(i, LastCol1 + 1).Value = 連番
   連番 = 連番 + 1
 Next

Cells(1, LastCol1 + 1) = "もとの順番"

 MsgBox "完了"
End Sub

解説

  • 1行目から7行目は変数の定義をしています。
  • 8行目で、選択されたシートをws1という変数にセットしています。
  • 10行目で、ws1の中で、最終行の番号を取得しています。
  • 12行目で、ws1の中で、最終列の番号を取得しています。
  • 13行目から18行目では、forループを使って、各行に対して以下の処理を実行しています。
    • LastCol1 + 1列目に、1から順に番号を振る。
    • 振った番号を1ずつ増やす。
  • 最後に、もとの順番という文字列を最終列の1行目に入力して、完了というメッセージを表示します。

注意

注意点としては、このコードで使用されている Cells() 関数には、行と列の引数が必要であることです。引数が省略されている場合は、アクティブなシートの現在のセルが使用されます。したがって、常に ws1.Cells() のように、シートを明示的に指定するようにしてください。

また、このコードは、最終列の算出に xlToLeft を使用しています。これは、右端から空白セルが始まる最初の列を返します。最終列が空でない場合は、正しい結果を得ることができます。ただし、最終列が空の場合、このコードは望ましい結果を返しません。この場合は、代わりに xlToRight を使用することを検討してください。

A列を挿入して連番を振る

これは、指定された列(この場合は列B)の範囲内にある各行に対して、連番を割り当てるエクセルマクロです。

Sub 連番()

    Dim i As Long, 指定行 As Long, 連番 As Long, LastCol1 As Long

    指定行 = 2
    連番 = 1

    Columns("A").Insert

    LastCol1 = ThisWorkbook.ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column

    For i = 指定行 To ThisWorkbook.ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
        ThisWorkbook.ActiveSheet.Cells(i, LastCol1 + 1).Value = 連番
        連番 = 連番 + 1

        If i = ThisWorkbook.ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row Then
            MsgBox "完了"
            Exit Sub
        End If
    Next

    Range("A1") = "No"

    MsgBox "完了"
End Sub

解説

  • 1行目から4行目は、変数の宣言です。i, 指定行, 連番, LastCol1という4つの変数が宣言されています。
  • 5行目では、A列に新しい列を挿入しています。これは、連番を割り当てるために必要な、新しい列を作成するための操作です。
  • 6行目では、変数LastCol1を定義しています。これは、最後の列を指定するための変数です。この変数は、ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Columnの操作によって設定されます。この操作は、現在のシートの最初の行で最も右の列を取得します。
  • 7行目から11行目では、指定された列(この場合はB列)に対して、各行に1ずつ連番を振っている部分です。まず、指定された列の最初の行から最後の行までループ処理が行われます。ループ内で、現在の行の次の列(LastCol1 + 1)に、連番が割り当てられます。そして、連番は1ずつ増加し続けます。最後の行に到達した場合、”完了”というメッセージが表示されます。
  • 12行目では、A1セルに”No”という値が挿入されます。
  • 最後に、13行目では”完了”というメッセージが表示されます。

A列を挿入してカウント用の1をたてる

Sub 列挿入_カウント用の1をたてる()

Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A2").Select

Dim i
For i = 2 To ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
       Cells(i, 1) = 1
Next

Range("A1") = "カウント"

MsgBox "完了"
End Sub

同じデータに同じ連番を記入

連番を振る際に、同じデータがあった場合は、同じ番号をふる

Sub 同じデータに同じ連番をふる()

Dim DicName As Variant
Dim i As Long
Dim j As Long
Dim Cnt As Long
Dim LastRow As Long
Dim GetName As String
Dim myKey As Variant
    
    '連想配列にいれる
    Set DicName = CreateObject("Scripting.Dictionary")

    '最終行を取得
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row

    '行をループ
    For i = 2 To LastRow

        '1列目の値を変数へ
        GetName = Cells(i, 1)

        '重複しないリストを連想配列へ
        If Not DicName.Exists(GetName) Then
            DicName.Add GetName, GetName
        End If
    Next i

    Dim LastCol1 As Long
    LastCol1 = Cells(1, Columns.Count).End(xlToLeft).Column

    myKey = DicName.keys
    Cnt = 1

    'リスト分ループ
    For i = 0 To UBound(DicName.items)

        For j = 1 To LastRow
            If Cells(j, 1) = myKey(i) Then

                '最終列に通し番号を振る
                 Cells(j, LastCol1 + 1) = Cnt

            End If
        Next j

        Cnt = Cnt + 1

    Next i

    Set DicName = Nothing

MsgBox "完了 "
End Sub

解説

  • 連想配列を作成する。
  • 最終行の番号を取得する。
  • ループを使用して各行に対して、最初の列の値を連想配列に追加する。
  • 最終列の列番号を取得する。
  • 連想配列内の要素ごとに、各行をループして、値が同じ行に通し番号を振り、それを最終列に記録する。
  • 追加された通し番号の値を更新する。
  • 作成した連想配列を削除する。
  • 「完了」メッセージボックスを表示する。

コメント

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