
📷 Photo by Unsplash(商用利用可・無料)
「VBAって難しそう」「コードが書けない」——その通りです。コードをゼロから書くのは難しい。でもコピペして少し直すだけなら、今日から使えます。
私はSIerでSEとして10年以上、業務システムの開発・自動化に携わってきました。学校事務職員に転職してからも、VBAで職場の業務を自動化しています。この記事では、事務職の実務でそのまま使えるVBAコードを5パターン、コピペ可能な状態で紹介します。
前回のマクロ記録入門記事の「次のステップ」として、条件分岐・ループ・PDF出力など、マクロの記録だけでは実現できない処理を扱います。




VBAコードの貼り付け方(共通手順)
以下のコードはすべて同じ手順で使えます。最初に一度だけ確認してください。
| 手順 | 操作 |
|---|---|
| ① | Excelを開き「開発」タブ→「Visual Basic」をクリック |
| ② | 左側のツリーでシート名を右クリック→「挿入」→「標準モジュール」 |
| ③ | 右側の白いエリアにコードをコピペ |
| ④ | 「開発」タブ→「マクロ」→実行したいマクロ名を選択→「実行」 |
| ⑤ | ファイルを保存するときは「.xlsm(マクロ有効ブック)」形式で保存 |
VBAを実行すると「元に戻す(Ctrl+Z)」が効きません。初めて使うときは必ずファイルのコピーを作ってから実行してください。
事務職のVBA自動化 具体例5選


📷 Photo by Unsplash(商用利用可・無料)
名簿リストの中から「未提出」「欠席」などの条件に合う行だけを抽出して、別シートに自動でコピーするVBAです。出欠確認・提出物の未回収リスト作成・アンケートの未回答者抽出など、事務職が頻繁に行う作業に使えます。
❌ VBAなしの場合
フィルターで絞り込み→手動でコピー→別シートに貼り付け→フィルター解除という手順を毎回繰り返す。行数が多いと見落としが発生する。✅ VBAありの場合
ボタン1つで「未提出」の行だけが別シートに自動転記される。何行あっても漏れがなく、毎回同じ品質で処理できる。‘ 「Sheet1」のB列が「未提出」の行を「Sheet2」に転記する
Dim wsData As Worksheet
Dim wsResult As Worksheet
Dim lastRow As Long
Dim resultRow As Long
Dim i As Long
Set wsData = Sheets(“Sheet1”) ‘ データが入っているシート名
Set wsResult = Sheets(“Sheet2”) ‘ 転記先のシート名
‘ 転記先をクリア(ヘッダー行は残す)
wsResult.Rows(“2:” & wsResult.Rows.Count).ClearContents
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
resultRow = 2 ‘ 転記先の開始行
For i = 2 To lastRow
If wsData.Cells(i, 2).Value = “未提出” Then ‘ B列が「未提出」なら
wsData.Rows(i).Copy wsResult.Rows(resultRow)
resultRow = resultRow + 1
End If
Next i
MsgBox “転記完了:” & (resultRow – 2) & “件”
End Sub
"未提出"」の部分を「"欠席"」「"未回答"」などに変えれば、どんな条件にも対応できます。また列番号の「2」(B列)を「3」(C列)に変えれば、確認する列を変更できます。
毎月「書類名_202504.pdf」のようなファイル名でPDFを保存している方は多いはずです。このVBAは、実行した日付を自動でファイル名に入れてデスクトップにPDF保存します。マクロの記録ではできなかった「日付の自動入力」がVBAで解決します。
❌ VBAなしの場合
「名前を付けて保存」→ファイル名を手入力→保存場所を選択という手順を毎月繰り返す。ファイル名の入力ミス・保存先の間違いが発生しやすい。✅ VBAありの場合
ボタン1つで「月次報告書_20250401.pdf」という形式でデスクトップに自動保存。ファイル名の入力ミスゼロ。Dim fileName As String
Dim savePath As String
‘ ファイル名を「書類名_YYYYMMDD.pdf」の形式で作成
fileName = “月次報告書_” & Format(Date, “YYYYMMDD”) & “.pdf”
‘ 保存先:デスクトップ
savePath = Environ(“USERPROFILE”) & “\Desktop\” & fileName
‘ アクティブシートをPDFとして保存
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard
MsgBox “PDFを保存しました:” & fileName
End Sub
"月次報告書_"」の部分を「"出欠確認表_"」「"請求書_"」などに変えれば、どんな書類にも使えます。保存先を変えたい場合はsavePathの行のパスを書き換えてください。
複数の担当者が入力したExcelファイルは、シートごとにフォントや列幅がバラバラになりがちです。このVBAはブック内の全シートに対して、フォント・サイズ・列幅を一括で統一します。月次報告書の提出前や引き継ぎ資料の整理に役立ちます。
❌ VBAなしの場合
シートを1枚ずつ開いて全選択→フォント変更→列幅調整という作業をシート枚数分繰り返す。10枚以上あると数十分かかる。✅ VBAありの場合
ボタン1つで全シートのフォントと列幅が一括統一。何十枚のシートでも30秒以内に完了。Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
With ws.Cells
‘ フォントを統一
.Font.Name = “游ゴシック”
.Font.Size = 11
End With
‘ 列幅を自動調整
ws.Cells.EntireColumn.AutoFit
Next ws
MsgBox “全シートの書式を統一しました”
End Sub
"游ゴシック"」や文字サイズ「11」は職場のルールに合わせて変更してください。特定のシートだけスキップしたい場合は、If ws.Name = "表紙" Then GoTo Skipのような条件を追加できます。






他のシステムからコピペしたデータには、見えない全角スペース・半角スペース・改行コードが混入していることがあります。これが原因でVLOOKUPが一致しない・集計がずれるなどの謎エラーが発生します。このVBAは選択範囲内のスペースと改行を一括で削除します。
❌ VBAなしの場合
TRIM関数で1列ずつ処理→別列に貼り付け→元の列を削除という手順を繰り返す。全角スペースはTRIM関数でも取れないケースがある。✅ VBAありの場合
範囲を選択してボタン1つで半角・全角スペース・改行コードをすべて削除。VLOOKUPの謎エラーが解消される。Dim cell As Range
Dim targetRange As Range
‘ 選択範囲を対象にする
Set targetRange = Selection
For Each cell In targetRange
If cell.Value <> “” Then
Dim v As String
v = cell.Value
v = Application.Trim(v) ‘ 先頭末尾の半角スペース削除
v = Replace(v, “ ”, “”) ‘ 全角スペース削除
v = Replace(v, Chr(10), “”) ‘ 改行コード(LF)削除
v = Replace(v, Chr(13), “”) ‘ 改行コード(CR)削除
cell.Value = v
End If
Next cell
MsgBox “スペース・改行の削除が完了しました”
End Sub
「先月のシートをコピーして、シート名を変えて、日付を書き換えて、データをクリアして…」という月末・月初の定型作業を自動化します。このVBAは現在のシートをコピーし、翌月の名前をつけて、指定したセルの日付を自動更新し、入力データをクリアします。
❌ VBAなしの場合
月末に毎回10〜15分かけてシートのコピー・リネーム・日付変更・データクリアを手作業で実施。「前月データの消し忘れ」というミスが発生しやすい。✅ VBAありの場合
ボタン1つで翌月シートが完成。日付の自動更新・データクリアも同時に実行。消し忘れミスがゼロになる。Dim wsSource As Worksheet
Dim wsNew As Worksheet
Dim nextMonth As Date
Dim newSheetName As String
‘ 現在アクティブなシートを元にする
Set wsSource = ActiveSheet
‘ 翌月の日付を計算
nextMonth = DateSerial(Year(Date), Month(Date) + 1, 1)
newSheetName = Format(nextMonth, “YYYY年M月”)
‘ 同名シートが既にある場合はエラー回避
On Error GoTo AlreadyExists
‘ シートをコピーして末尾に追加
wsSource.Copy After:=Sheets(Sheets.Count)
Set wsNew = ActiveSheet
wsNew.Name = newSheetName
‘ A1セルの日付を翌月1日に更新(日付が入っている場合)
wsNew.Range(“A1”).Value = nextMonth
‘ データ入力範囲をクリア(例:A3:Z100)
wsNew.Range(“A3:Z100”).ClearContents
MsgBox newSheetName & “のシートを作成しました”
Exit Sub
AlreadyExists:
MsgBox newSheetName & “のシートはすでに存在します”
End Sub
"A3:Z100"」は実際のシートに合わせて変更してください。日付を入れるセルが「A1」以外の場合はRange("A1")の部分を変えます。






VBAをさらに活用するための次のステップ


📷 Photo by Unsplash(商用利用可・無料)
今回紹介したVBAに慣れてきたら、以下のステップでさらに活用の幅が広がります。
| ステップ | 学ぶこと | できるようになること |
|---|---|---|
| Step 1(本記事) | コピペして使う・カスタマイズする | 定型作業の自動化・条件分岐・ループ |
| Step 2 | 変数・条件分岐・ループの基本を理解する | コードを読んで意味がわかる・自分で修正できる |
| Step 3 | ユーザーフォームの作成 | 入力フォームを作って誰でも使いやすいツールを作れる |
| Step 4 | 他のOfficeアプリとの連携(Outlook・Word) | メール自動送信・Word差し込み印刷の自動化 |
Step 2以降はChatGPTを活用すると学習が大幅に加速します。「このVBAコードに〇〇の処理を追加したい」「このエラーの原因を教えて」という形で聞くと、具体的なコードを生成・説明してくれます。
まとめ|事務職のVBA自動化は「コピペ→カスタマイズ」から始める
- 未提出者・欠席者の自動抽出 ─ 条件に合う行を別シートに自動転記
- 今日の日付つきPDF自動保存 ─ ファイル名入力ミスをゼロに
- 全シートの書式一括統一 ─ フォント・列幅を何十枚でも30秒で統一
- スペース・改行の一括削除 ─ VLOOKUPの謎エラーを根本解決
- 翌月集計シートの自動生成 ─ 月末の定型作業をボタン1つに圧縮


