VBAマクロの詳細解説 休日に入った予定を平日にシフトする
この記事では、Excel VBAを使用して特定の条件に基づいてセルの値をシフトするマクロ ShiftValueForHolidays
のコードを詳しく解説します。このマクロは、特定の日(休日など)に予定されていたタスクやイベントを翌日にシフトするのに便利です。それでは、各部分の機能と役割を一つ一つ見ていきましょう。
マクロの概要
このマクロは、アクティブシートの特定の列をチェックし、条件に合致する場合、その行のデータを次の行にシフトします。主に以下の処理を行います:
- アクティブシートの取得
- 最終行と最終列の特定
- 条件に基づくデータのシフト処理
- エラーハンドリング
コードの詳細解説
変数の定義
Dim ws As Worksheet
Dim lastRow As Long, lastCol As Long
Dim i As Long, j As Long
-
ws
: 処理を行うワークシートオブジェクト。 -
lastRow
,lastCol
: データが存在する範囲の最終行と最終列。 -
i
,j
: ループ処理で使用するカウンタ変数。
ワークシートの設定
Set ws = ActiveSheet
アクティブなワークシートを ws
に設定します。
最終行と列の取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
lastCol = 32
-
lastRow
: 列Aの最後の行を取得します。xlUp
は下から上への検索を示し、空白ではない最後のセルを見つけます。 -
lastCol
: 32列目までのデータを処理対象とします(これは月日を示す場合が多いです)。
条件に基づくデータのシフト
For i = ActiveCell.Row() To lastRow
If ws.Cells(i, 3).Value = 2 Or ws.Cells(i, 3).Value = 3 Then
For j = ActiveCell.Column() To lastCol
If Not IsEmpty(ws.Cells(i, j).Value) Then
colLastRow = ws.Cells(ws.Rows.Count, j).End(xlUp).Row
If colLastRow > i Then
ws.Range(ws.Cells(i, j), ws.Cells(colLastRow, j)).Copy
ws.Cells(i + 1, j).PasteSpecial Paste:=xlPasteValues
ws.Cells(i, j).ClearContents
Application.CutCopyMode = False
End If
End If
Next j
End If
Application.StatusBar = "Processing row: " & i & " of " & lastRow
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Next i
- このループは、アクティブセルの行から最後の行まで繰り返されます。
- 第3列の値が2または3の場合(休日or祝日)、その行のデータを次の行にシフトします。
-
IsEmpty
関数を使用して空白でないセルを確認し、データをコピーして1行下にペーストし、元のセルの内容をクリアします。
エラーハンドリング
ErrorHandler:
MsgBox "Error " & Err.Number & ": " & Err.Description & " in " & VBE.ActiveCodePane.CodeModule
.Name, vbCritical
Application.StatusBar = False
エラーが発生した場合、エラー番号と説明をメッセージボックスで表示し、ステータスバーの表示をリセットします。
まとめ
このマクロは、特定の条件に基づいてExcelのセルの値を効率的にシフトさせることができる便利なツールです。カスタマイズによってさまざまなシナリオに適用可能で、日々の作業を自動化するための基盤を提供します。エラーハンドリングもしっかりと行い、予期せぬ問題にも対処できるようにしています。