Dim lastRow As Long
Dim i As Long
' ① A列の最終行を取得して変数に入れる
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' ② 2行目(見出しの次)から最終行まで繰り返す
For i = 2 To lastRow
' G列(7列目)に、上から順番に番号を入力する
Cells(i, 7).Value = i - 1
Next i
コードの説明は後ほど行います。
STEP
マクロを実行する
結果を確認する
「▶」ボタンを押す
エクセルに戻り、G列に採番されていることを確認
STEP
最終行まで連続採番された
最終行まで番号があることを確認
リストの一番下まで移動し、番号が振られていることを確認しましょう。
このコードのポイントは次のとおりです。
For i = 2 To lastRow~Next i
2行目から最終行まで処理を繰り返しています。
特に指定がない場合、iは1ずつ増えていきます。
実務で使用するデータは1行目に見出しがあることがほとんどであるため、繰り返し処理はFor i = 2から開始するのが一般的です。
もしも1行目にタイトル、2行目に見出しがあり、実際のデータが3行目から始まる場合は、For i = 3に変更してください。
Public Sub 一気にコピー()
Dim lastRow As Long
' ① A列の最終行を取得して変数に入れる
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' ② C2からC列最終行までの範囲を、H2を起点に一気にコピー
Range("C2:C" & lastRow).Copy Destination:=Range("H2")
End Sub
Public Sub 名簿に追加()
Dim nextRow As Long
Dim inputName As String, inputZip As String, inputAddress As String
'インプットボックスで1人分の氏名を取得
inputName = InputBox("「氏名」を入力してください")
'もし氏名が未入力やキャンセルされたらマクロを終了する
If inputName = "" Then Exit Sub
inputZip = InputBox("「郵便番号」を入力してください")
inputAddress = InputBox("「住所」を入力してください")
'A列の最終行に「+1」をして、次の空白行を取得
nextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
'取得した新しい行のA~C列に、入力したデータを転記する
Cells(nextRow, 1).Value = inputName 'A列:氏名
Cells(nextRow, 2).Value = inputZip 'B列:郵便番号
Cells(nextRow, 3).Value = inputAddress 'C列:住所
MsgBox "名簿への追加が完了しました!"
End Sub
For Nextの一番の特徴は、「2行目から始まり、最終行で終わる」といったように、処理の始まりと終わりがあらかじめ明確に決まっていることです。
Public Sub 発送完了チェック①()
Dim i As Long
Dim lastRow As Long
'A列の最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
'2行目から最終行まで確実に繰り返す
For i = 2 To lastRow
'特定の条件でループを強制終了したい場合は Exit For で抜ける
If Cells(i, 1).Value = "終了" Then
Exit For
End If
'ここにメインの処理を書く
Cells(i, 4).Value = "発送完了"
Next i
End Sub
Do WhileなどのDo Loop文は、エクセルVBAの解説本でよく紹介されていますが、最終行までの繰り返し処理に使うのは要注意です。
Public Sub 発送完了チェック②()
Dim i As Long
i = 2
'A列のセルが空白になるまで繰り返す
Do While Cells(i, 1).Value <> ""
'ここに処理を書く
Cells(i, 4).Value = "発送完了"
'行番号を自分で1つ増やす(これを忘れると無限ループになる)
i = i + 1
Loop
End Sub
このコードは一見シンプルで処理内容が分かりやすいメリットもありますが、注意点もあります。
Loopの前にi = i + 1と自分で行番号を1つ増やす必要があり、これを書き忘れると、永遠にi=2行目を処理し続ける無限ループ状態に陥ります。
For Eachは、行番号を1、2、3……と数えていくのではなく、あらかじめ指定したセル範囲の中にあるすべてのセルに対して一度に処理を行うコードです。
Public Sub 発送完了チェック③()
Dim lastRow As Long
Dim targetCell As Range
'A列の最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
'2行目から最終行までのA列の範囲を対象にする
For Each targetCell In Range("A2:A" & lastRow)
'targetCellに対して直接処理を書く
targetCell.Offset(0, 3).Value = "発送完了"
Next targetCell
End Sub
Sub 最終列取得()
Dim j As Long
Dim lastCol As Long
'1行目の最終列(一番右の列番号)を取得
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
'2列目(B列)から最終列まで繰り返し処理
For j = 2 To lastCol
'1行目の各列に背景色をつける
Cells(1, j).Interior.Color = RGB(255, 255, 0)
Next j
End Sub