VBAで連番を振る作業を完全自動化~初心者でも実践できるテクニックを紹介~
毎日のエクセル作業で何度も連番を振る作業に追われていませんか?
手作業での連番付けは時間がかかるだけでなく、データの追加や修正のたびにやり直しが必要で、とても面倒な作業ですよね。
VBAを使えば
めんどうな連番を振る作業を完全自動化
することができます。
本記事では、プログラミング初心者の方でもすぐに実践できる連番を自動で振るVBAコードをご紹介します。
基本的な使い方から応用テクニックまで、実務で使える具体例を交えながらわかりやすく解説。
今まで何十分もかかっていた連番を振る作業を1クリックで完結させることだって夢ではありません。
エクセル作業の効率アップを検討している方は是非参考にしてみてください。
目次
VBAで連番を振る作業の問題点とメリット
エクセルで連番を振る作業は多くの方が日々苦労されている作業の一つです。
特に大量のデータを扱う場合、
手作業での連番付けは時間がかかるだけでなくミスが発生するリスクがアップ
してしまいますよね。
VBAを使ってこんな問題を解決していきましょう。
よくある連番作業の3つの問題点
手作業で連番を振る作業の問題点がこちら
- 手間と時間がかかる
- ミスが発生しやすい
- 連番の振り直し作業がかなりめんどう
連番を振る作業をやったことがある方は上記のような問題を1度は経験したことがあるのではないでしょうか。
これらの問題を放置すれば
業務効率を大きく下げ多くの時間を無駄にする
ことに繋がります。
VBAを使った自動化のメリット
VBAを使えば上記の問題をいっきに解決することができます。
連番を振るVBAの導入メリットがこちら
- 連番の数量を自動的にカウント
- 編集ミス発生を完全に防止
- 業務内容に合わせて連番の振り方をアレンジ可能
- 数千行のデータでも一瞬で処理可能
業務内容に合わせてVBAを設定すればどんな連番の振り方でも対応できるので、業務内容の変更がない限り半永久的に使い続けることが可能です。
本記事ではVBA初心者の方でも理解できるように、
基本的なコードの書き方から応用的なテクニックまで順を追って説明
していきます。
基本的なVBAコードの準備
VBAはエクセルを開くことさえできれば、誰でも扱えるプログラミングです。
特別なアプリのダウンロードやインストールを行う必要なありません。
ここからはVBAを設定するための準備を詳しくご紹介していきます。
VBAエディタの開き方
VBAを設定するためには専用の編集画面(VBAエディタ)を開く必要があります。
エクセルを開いた状態でALTキー + F11を押すと、VBAエディタが起動します。
この画面がプログラミングを行う作業場所となります。
必要なモジュールの設定方法
VBAエディタの左側にある「プロジェクト」ウィンドウから、「挿入」→「標準モジュール」を選択します。
これで、コードを書く準備が整いました。
コードを書く前の注意点
コードを書く前に、操作しているエクセルの「マクロを有効にする」必要があります。
マクロを有効にする方法がこちら
「ファイル」→「オプション」→「セキュリティセンター」→「セキュリティセンターの設定」→「マクロの設定」で、「すべてのマクロを有効にする」を選択
これらの設定をしなければ、編集画面(VBAエディタ)を開いてコードを書くことはできてもVBAコードを保存することができません。
エクセルファイルを閉じて再度立ち上げたとき「あれ?頑張って設定したVBAコードがない!!」という事態に陥ってしまいます。
連番を振るVBAコードの実装
実際のエクセル業務でよく使われる連番を振るVBAをサンプルコードを使ってご紹介します。
基本的な連番コードの書き方
最も基本的な連番を振るVBAコードがこちら
Sub 連番を振る()
Dim lastRow As Long
'最終行を取得
lastRow = Range("A" & Rows.Count).End(xlUp).Row
'連番を振る
For i = 2 To lastRow
Cells(i, 2) = Cells(i, 1) & "-1"
Next
End Sub
このコードを実行すると、A列の数値に「-1」という連番が振られた数値がB列に表示されます。
結果はこんな感じ
開始番号の設定方法
開始番号を自由に設定できると便利ですよね。
100番から始めたい場合や、特定の番号から連番を振りたい場合に使えるコードがこちら
Sub 開始番号指定連番()
Dim lastRow As Long
Dim startNum As Long
'開始番号を設定(例:100から開始)
startNum = 100
'最終行を取得
lastRow = Range("A" & Rows.Count).End(xlUp).Row
'連番を振る
For i = 2 To lastRow
If Cells(i, 1).Value < startNum Then
Cells(i, 2) = Cells(i, 1).Value
Else
Cells(i, 2) = Cells(i, 1) & "-1"
End If
Next i
End Sub
このコードでは、startNumに設定した数字から連番が始まります。
上記のサンプルコードのように100を設定すると、100-1, 101-1, 102-1…という具合に番号が振られていきます。
結果はこんな感じ
連番の間隔設定の方法
番号を1つずつではなく、5つずつや10ずつ増やしたい場合もあるでしょう。
そんな時は以下のコードが便利です。
Sub 間隔指定連番()
Dim lastRow As Long
Dim interval As Long
'間隔を設定(例:5間隔)
interval = 5
'最終行を取得
lastRow = Range("A" & Rows.Count).End(xlUp).Row
'連番を振る
For i = 2 To lastRow
Cells(i, 2) = Cells(i, 1) & "-" & (i - 1) * interval
Next i
End Sub
intervalの値を変更することで、好きな間隔で連番を振ることができます。
たとえば5を設定すると、連番の数値が5,10, 15, 20…と増やすことが可能です。
結果はこんな感じ
エラー処理の実装方法
エラーが発生した際にプログラムが突然停止するのを防ぐため、エラー処理を実装することが重要です。
エラー処理を含んだサンプルコードがこちら
Sub エラー処理付き連番()
On Error GoTo ErrorHandler
Dim lastRow As Long
'処理開始前に確認
If MsgBox("連番を振りますか?", vbYesNo) = vbNo Then
Exit Sub
End If
Application.ScreenUpdating = False
'最終行を取得
lastRow = Range("A" & Rows.Count).End(xlUp).Row
'連番を振る
Range("A2:A" & lastRow).Value = _
Application.Transpose(Evaluate("ROW(1:" & lastRow - 1 & ")"))
Application.ScreenUpdating = True
MsgBox "連番の作成が完了しました。"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました。" & vbNewLine & _
"エラー番号:" & Err.Number & vbNewLine & _
"エラー内容:" & Err.Description
Application.ScreenUpdating = True
End Sub
17行目から21行目までのコードは、
エラーが発生したとき「エラー番号」と「エラー内容」をメッセージとして表示させる
という内容です。
エラーが発生したときに、エラー番号とエラー内容を表示することでスムーズにコードを修正することができます。
応用テクニックとカスタマイズ
どんなエクセル業務にも対応できるよう、連番を振るVBAの応用テクニックとカスタマイズ方法をご紹介します。
特定の条件で連番を振る方法
特定の条件を満たす行にのみ連番を振るVBAの作り方をご紹介します。
処理内容は、
B列に「対象」と書かれている行にのみ連番を振る
です。
サンプルコードがこちら
Sub 条件付き連番()
Dim lastRow As Long
Dim i As Long
Dim num As Long
'最終行を取得
lastRow = Range("A" & Rows.Count).End(xlUp).Row
'番号の初期化
num = 1
'条件に合う行のみに連番を振る
For i = 2 To lastRow
If Cells(i, 2).Value = "対象" Then
Cells(i, 1).Value = num
num = num + 1
End If
Next i
End Sub
10行目のFor~Nextで繰り返し処理を開始
11行目のIF関数でB列に「対象」というコメントがある場合連番を振る
For~Nextと関数IFの組み合わせをめちゃくちゃ使用頻度が高いので自由に使えるようにしておきましょう。
関連記事「VBAでForと関数Ifを組み合わせて使用する方法」ではFor~Nextと関数IFの使い方が詳しく紹介されています。
複数シートへの一括処理
複数のシートに同時に連番を振るサンプルコードを紹介します。
以下のコードを使えば、ブック内のす全てのシートに一瞬で連番を振ることが可能です。
Sub 複数シート連番()
Dim ws As Worksheet
Dim lastRow As Long
'確認メッセージ
If MsgBox("全シートに連番を振りますか?", vbYesNo) = vbNo Then
Exit Sub
End If
Application.ScreenUpdating = False
'すべてのシートに対して処理を実行
For Each ws In ThisWorkbook.Worksheets
ws.Activate
num = 1
'最終行を取得
lastRow = Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To lastRow
If Cells(i, 2).Value = "対象" Then
Cells(i, 1) = Cells(i, 1) & "-" & num
num = num + 1
End If
Next i
Next ws
Application.ScreenUpdating = True
MsgBox "全シートの連番付けが完了しました。"
End Sub
コードの内容は、
10行目で全てのシートへの切替を開始
11行目~20行目までの処理後、次のシートへ切り替わる
です。
関連記事「別シートに情報を自動反映させるマクロ」では、VBAでシートを操作する方法が詳しく紹介されています。
併せてチェックしてみてください。
連番フォーマットのカスタマイズ
連番を「001」や「NO.001」のような形式で表示したいことってありますよね。
以下のコードでは、思い通りの形式で連番を振ることができます。
Sub フォーマット付き連番()
Dim lastRow As Long
Dim i As Long
'最終行を取得
lastRow = Range("A" & Rows.Count).End(xlUp).Row
'連番を振る
For i = 2 To lastRow
'Format関数で3桁の0埋め形式に
Cells(i, 2).Value = "NO." & Format(i - 1, "000")
Next i
End Sub
Format関数を使えば、好きな形式でテキストを表示できるのでとても使用頻度が高いコードです。
結果はこんな感じ
よくあるトラブルと解決方法
連番を振るVBAは関数IFやFor~Nextなど、いろんなVBAを組み合わせることで表現することができます。
そのため、
「設定が難しい」「運用後トラブルが発生する」などの問題発生確率が高い。。。
そこで、発生した問題をスムーズに解決できるようにするために「よくあるトラブルと解決方法」をご紹介します。
コードが動かない時の対処法
VBAコードが動かない主な原因として、以下のようなケースが考えられます。
- マクロが無効になっている
- シートが保護されている
単純なことですがよく見落としがちなポイントなので注意しましょう。
マクロが無効になっている場合は前述の設定手順を確認してください。
他にも下図のような対応で解決できるかもしれません。
シートが保護されていてVBAが正常動作しない場合の対処法がこちら
Sub シート保護解除()
If ActiveSheet.ProtectContents = True Then
ActiveSheet.Unprotect
MsgBox "シートの保護を解除しました。"
End If
End Sub
上記のコードを設定しておけばシートが保護されていても連番を振るVBAを正常に動作させることができます。
エラーメッセージの意味と対策
エラー発生時に表示されるメッセージを分析することでスムーズに問題を解決することができます。
エラー原因をつきとめるときに便利なサンプルコードがこちら
Sub エラー対策例()
On Error Resume Next
Dim lastRow As Long
'エラーが発生しそうな処理の前後でエラー状態をチェック
lastRow = Range("A" & Rows.Count).End(xlUp).Row
If Err.Number <> 0 Then
MsgBox "最終行の取得に失敗しました。" & vbNewLine & _
"シートを確認してください。"
Exit Sub
End If
On Error GoTo 0 '通常のエラー処理に戻す
End Sub
上記のコードは複雑なVBA作成時にめちゃくちゃ役立つコードなので、自由に扱えるようにしておきましょう。
パフォーマンス改善のコツ
連番を振るVBAはFor~Nextと関数IFを組み合わせて大量のデータを処理するため、完了までに時間がかかることがあります。
こんな問題を解決してくれるのが処理速度を向上させるVBAです。
サンプルコードがこちら
Sub 高速連番処理()
'画面更新をオフに
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim lastRow As Long
lastRow = Range("A" & Rows.Count).End(xlUp).Row
'配列を使用して一括で値を設定
Dim numArray() As Long
ReDim numArray(1 To lastRow - 1)
Dim i As Long
For i = 1 To lastRow - 1
numArray(i) = i
Next i
Range("A2:A" & lastRow).Value = Application.Transpose(numArray)
'設定を元に戻す
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
- VBA実行中の画面更新をオフにする
- For~Nextで繰り返し処理するのではなく配列を使って処理をする
これらのテクニックを駆使することで処理速度を大幅にアップさせることが可能です。
まとめ:連番を振るVBA設定のポイント
これまでの内容を振り返りながら、重要なポイントをまとめてみましょう。
連番を振るVBAの作成は、
基本的なコードの理解から始まり、徐々に応用的なテクニックを身につけていくことが大切
です。
いきなり理想的な連番を振るVBAを設定しようとすると難易度が高くて挫折してしまう恐れがあります。。。
特に、
エラー処理の実装とパフォーマンスの最適化は、連番を振るVBAを導入する際に非常に重要になるので自由に扱えるようにしておきましょう。
本記事で紹介したコードはコピー&ペーストするだけですぐに使えますが、自分の環境に合わせてカスタマイズすることで、さらに使いやすいツールになるはずです。
VBAによる自動化は、単純な作業時間の短縮だけでなく、ミスの防止や作業の標準化にもつながります。
是非この記事を参考にエクセル作業の効率化に挑戦してみてください。
けど、
エクセル作業を自動化させたいけどVBAを設定する時間なんてない。。。
このような問題を抱えている方はマメBlogのVBA開発依頼サービスの利用を検討してみてください。
あなたに代わってエクセル業務の効率をアップさせるVBAを設定します。
詳しくは関連記事「マメBlogエクセルVBA開発依頼」を参考にしてみてください。
ディスカッション
コメント一覧
まだ、コメントがありません