Excelの業務が日々増えるにつれて、手作業でやっているタスクを自動化できていれば、時間短縮とミス防止の両面で大きな効果が期待できます。
そこで、実務にすぐに取り入れられるVBA(Visual Basic for Applications)のスクリプトを、実際に業務で使用した事例10選にまとめました。
それぞれのケースでは、なぜVBAが有効なのか、どのように導入すべきか、サンプルコード付きで解説します。
ポイント
- VBAの基本は「1行で何をしたいか」を明確にし、必要最低限のコードで実装すること。
- セキュリティ設定(マクロ有効化)やファイルフォーマット(xlsm)に注意。
- スクリプトは事前にバックアップから試行し、エラー処理を入れること。
1. データ入力のワンクリック化:CSVを1枚のシートにまとめるスクリプト
何をするのか
複数の取引先から提供されたCSVを、業務で使う「集計表」に自動貼り付け。
例: CSVを読み込んで貼り付け
Sub ImportAllCSV()
Dim folderPath As String, fileName As String, i As Long
Dim wsDest As Worksheet, wbSrc As Workbook
Dim lastRow As Long
folderPath = "C:\Data\CSV\"
Set wsDest = ThisWorkbook.Sheets("集計")
i = 1
fileName = Dir(folderPath & "*.csv")
Do While fileName <> ""
Set wbSrc = Workbooks.Open(folderPath & fileName, Format:=6)
lastRow = wsDest.Cells(wsDest.Rows.Count, 1).End(xlUp).Row + 1
wbSrc.Sheets(1).UsedRange.Copy wsDest.Cells(lastRow, 1)
wbSrc.Close False
fileName = Dir()
i = i + 1
Loop
End Sub
導入手順
ThisWorkbookに「集計」シートを作成。- VBA エディタでプロジェクトを開き、上記コードを標準モジュールへ貼り付け。
- ダイレクトキー
Ctrl+Shift+Iで実行(ショートカットキーを設定可)。 - エラーが出たらフォルダパス・CSV形式確認。
2. PDFへの一括変換とメール送付
何をするのか
業務で作成したレポートをPDFに変換し、関係者へ自動でメール送付。
サンプルコード
Sub ExportPDFAndSend()
Dim ws As Worksheet, pdfPath As String, outlookApp As Object, mail As Object
Set ws = ActiveSheet
pdfPath = ThisWorkbook.Path & "\" & ws.Name & ".pdf"
ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath, _
Quality:=xlQualityStandard, IncludeDocProperties:=True
' Outlook自動化
Set outlookApp = CreateObject("Outlook.Application")
Set mail = outlookApp.CreateItem(0)
With mail
.To = "user@example.com"
.CC = "cc@example.com"
.Subject = ws.Name & " レポート"
.Body = "添付ファイルをご確認ください。"
.Attachments.Add pdfPath
.Send
End With
MsgBox "PDF送付完了"
End Sub
導入ポイント
- Outlookがインストールされている事前検証。
- PDF保存場所は実行時に自動設定。
- セキュリティ設定でマクロから外部アプリ起動許可。
3. 自動ハイパーリンク生成:目次と章へのジャンプ
何をするのか
長文のドキュメントで目次をクリックだけで該当章へジャンプ。
コード例
Sub CreateTableOfContents()
Dim ws As Worksheet, rng As Range, cell As Range
Set ws = ThisWorkbook.Sheets("本文")
ws.Range("A1").Value = "目次"
Set rng = ws.Range("A3:A100") ' 見出しが入力されているセル範囲
Dim i As Long: i = 2
For Each cell In rng
If cell.Value <> "" Then
ws.Hyperlinks.Add Anchor:=cell, Address:="", SubAddress:=cell.Address, TextToDisplay:=cell.Value
i = i + 1
End If
Next
End Sub
ステップ
- 見出しセルに「タイトル」入力。
- マクロで目次生成(
Ctrl+Shift+T)。 - 目次セルをクリックすると該当セルへジャンプ。
4. 時間管理:残業時間自動集計
何をするのか
各社員の残業時間を自動で計算し、月末レポートへ統合。
実装サンプル
Sub SumOvertime()
Dim wsSrc As Worksheet, wsDest As Worksheet
Dim lastRow As Long, col As Long, i As Long
Set wsSrc = ThisWorkbook.Sheets("打刻")
Set wsDest = ThisWorkbook.Sheets("残業集計")
wsDest.Cells.Clear
wsDest.Range("A1").Value = "社員名"
wsDest.Range("B1").Value = "残業時間"
lastRow = wsSrc.Cells(wsSrc.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
wsDest.Cells(i, 1).Value = wsSrc.Cells(i, 1).Value
wsDest.Cells(i, 2).Value = WorksheetFunction.Sum(wsSrc.Cells(i, 3).Resize(1, 2)) _
' 例: 午後の残業時間が列CとDに入力
Next i
End Sub
注意点
- 打刻フォーマット(時刻入力の整合性)を統一。
- 時間加算は
Time型で計算。
5. 業務フロー管理:案件進捗自動メール通知
何をするのか
案件ステータスが「進捗中」から「完了」に変更された際に、担当者にメールで通知。
コード(シートの変更イベント)
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C:C")) Is Nothing Then ' ステータス列
If Target.Value = "完了" Then
Dim mailOut As Object, toAddr As String
toAddr = Me.Cells(Target.Row, "D").Value ' 担当者メール
Set mailOut = CreateObject("Outlook.Application").CreateItem(0)
With mailOut
.To = toAddr
.Subject = "案件完了通知"
.Body = "案件 " & Me.Cells(Target.Row, "A").Value & " が完了しました。"
.Send
End With
End If
End If
End Sub
導入手順
- シートの
C列にステータス、D列に担当者メール入力。 - VBAエディタでシートモジュールへペースト。
- Outlookメール送信設定(送信アカウント確認)。
6. 集計レポートの自動印刷とファイル管理
何をするのか
月次売上集計表をPDF化し、指定フォルダへ自動保存、同時に印刷。
Sub ExportAndPrintSummary()
Dim ws As Worksheet, path As String, pdfName As String
Set ws = Sheets("月次売上")
path = "C:\Reports\"
pdfName = path & "売上_" & Format(Date, "yyyymmdd") & ".pdf"
ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfName, Quality:=xlQualityStandard
ws.PrintOut Copies:=1
MsgBox "レポート完成: " & pdfName
End Sub
手順
pathのフォルダは事前作成。- 印刷設定はプリンタに合わせて
PrintOutのパラメータを調整。
7. データベース連携:Access から Excel へのレポート抽出
何をするのか
Access のテーブルから最新データを取得し、Excel でレポート作成。
Sub GetDataFromAccess()
Dim cn As Object, rs As Object, sql As String, wb As Workbook, ws As Worksheet
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\MyDB.mdb;"
sql = "SELECT * FROM Sales WHERE Date >= DateAdd('m', -1, Date())"
Set rs = cn.Execute(sql)
Set wb = ThisWorkbook
Set ws = wb.Sheets("Accessデータ")
ws.Cells.Clear
ws.Range("A1").CopyFromRecordset rs
rs.Close: cn.Close
MsgBox "Accessデータ取得完了"
End Sub
導入ポイント
- Office の 32/64bit に合わせて ADO プロバイダを選択。
- パスとテーブル名は環境に合わせて変更。
8. データバリデーション:入力規則をコードで一括設定
何をするのか
業務シート全体に対し、数値範囲や文字数制限等を自動で設置。
Sub SetValidationRules()
Dim ws As Worksheet, i As Long
Set ws = ThisWorkbook.Sheets("入力フォーム")
For i = 2 To 100
With ws.Range("B" & i).Validation
.Delete
.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="0", Formula2:="100"
.IgnoreBlank = True
.InCellDropdown = True
.ErrorMessage = "0~100の整数を入力してください"
End With
Next i
End Sub
手順
- 既存データに影響がないよう、バックアップからテスト。
- 必要に応じて
Formula1/2を動的に変更。
9. Excel データの定期チェック:古いファイルの自動アーカイブ
何をするのか
一定期間使用されていないブックを自動でアーカイブフォルダへ移動。
Sub ArchiveOldFiles()
Dim folderSrc As String, folderDst As String, fso As Object, t As Object
Dim daysOld As Long: daysOld = 90
folderSrc = "C:\ExcelFiles\"
folderDst = "C:\Archive\"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each t In fso.GetFolder(folderSrc).Files
If t.DateLastAccessed < Date - daysOld Then
fso.MoveFile t.Path, folderDst & t.Name
End If
Next
MsgBox "アーカイブ完了"
End Sub
留意点
- ファイルはロック状態でないかチェック。
- アーカイブ時に重複ファイル名が無いか確認。
10. 自動タスクスケジューラ:Windows タスクと連携
何をするのか
定期的にVBAマクロを走らせるためのバッチやショートカットを作成。
-
マクロを実行するバッチ
@echo off set EXCELPATH="C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" "%EXCELPATH%" /Automation "C:\MyWorkbook.xlsm" /m"AutoRun" exitAutoRunはThisWorkbook内のサブルーチン名。 -
Windows タスクスケジューラ
- 新規タスク作成 > トリガー:毎日 / 週 / 月
- 操作:プログラム/スクリプトにバッチファイルパス
実装手順
ThisWorkbookに次を追加:Public Sub AutoRun() Call ExportPDFAndSend Call SumOvertime End Sub- バッチファイルを任意の場所に配置し、タスクスケジューラに登録。
まとめ
| # | 目的 | 主なVBA機能 | 推奨対象 |
|---|---|---|---|
| 1 | CSV統合 | Dir、Workbooks.Open |
データ収集 |
| 2 | PDF自動化 | ExportAsFixedFormat |
レポート |
| 3 | 目次リンク | Hyperlinks.Add |
文書作成 |
| 4 | 残業算出 | WorksheetFunction.Sum |
労務管理 |
| 5 | ステータス通知 | Worksheet_Change |
案件管理 |
| 6 | 印刷&保存 | PrintOut |
出力 |
| 7 | Access連携 | ADO | データベース |
| 8 | 入力規則 | Validation |
データ入力 |
| 9 | アーカイブ | FileSystemObject |
ファイル管理 |
| 10 | 定期実行 | バッチ & タスクスケジューラ | 自動化全般 |
実装のコツ
- コードの再利用
共通処理はサブルーチン・関数に分離し、ユーティリティファイルに集約。 - エラーハンドリング
On Error GoTo ErrorHandlerを設け、具体的なメッセージを表示。 - セキュリティ
Office の「マクロを有効にする」設定をプロジェクトごとに管理。
業務に合わせてカスタマイズすれば、VBAは単なる自動化ツールではなく、日常業務を一新する戦略的資産になります。
ぜひ、上記10例をベースにご自身の業務フローに合わせ、次から次へとスクリプトを導入してみてください!

コメント