この記事でわかること
- VBAでExcelからOutlookの予定表に予定を登録できる(AppointmentItem)
- リマインダー・場所・本文を設定した予定を作成できる
- 一覧表から複数の予定を一括登録し、重複チェックで二重登録を防げる
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
—
どんな場面で使う?
- 月初に翌月の定例会議や締め切りを一括でOutlookの予定表に登録したい
- Excelのスケジュール管理表から20件以上の予定を手入力なしで登録したい
- 同じ予定を二重登録してしまうミスを防ぎたい
- リマインダー・場所・本文もExcelの一覧表から一括で設定したい
—
完成イメージ(Before / After)
Before(Excelの一覧を見ながら手作業で予定表に登録):
| 操作 | 所要時間 |
|---|---|
| 予定を1件登録 | 約1分 |
| 20件登録 | 約20分 |
| 入力ミスの確認・修正 | さらに数分 |
After(VBAで一括登録):
| 操作 | 所要時間 |
|---|---|
| Excelに予定一覧を記入 | 数分 |
| マクロ実行で一括登録 | 数秒 |
| 重複チェックで二重登録防止 | 自動 |
—
自分も以前、月初に翌月の定例会議や締め切りをOutlookの予定表に1件ずつ手入力していた。件名を打ち間違えたり、開始時刻と終了時刻を逆にしてしまったり、同じ予定を2回登録してしまったりと、地味なミスが多かった。VBAで一括登録するようにしてからは、Excelの一覧表に書くだけで数十件の予定が数秒で登録されるようになった。入力ミスもゼロ。同じようにOutlookの予定表登録に時間を取られている人に、この記事で一括登録を体験してほしい。
Outlookの予定表への手入力は件数が増えるほどミスが起きやすい。VBAで一括登録すれば速くて正確。
なお、Outlookのメール作成を自動化したい場合は ExcelからOutlookメールを自動作成する方法 を参照。
—
実行前の準備
Outlookの起動を確認する
VBAからOutlookを操作するには、Outlookがインストール済みで、初回起動(プロファイル設定)が完了している必要がある。マクロ実行前にOutlookを起動しておくこと。
※ Outlookが起動していない場合、「実行時エラー ‘429’」が発生します。タスクバーにOutlookのアイコンがあることを確認してください。
バックアップを取る
Outlookの予定表に直接登録されるため、テスト時は数件のダミーデータで動作確認してから全件実行すること。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
スケジュール一覧を準備する(実務版で使用)
実務版コードは以下のシート構成を前提としている:
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | 件名 | 開始日時 | 終了日時 | 場所 | 本文 | リマインダー(分) | ステータス |
| 2 | 定例会議 | 2026/04/01 10:00 | 2026/04/01 11:00 | 会議室A | 議題:進捗確認 | 15 | |
| 3 | 月次報告 | 2026/04/05 14:00 | 2026/04/05 15:00 | 報告資料を持参 | 30 |
基本版・応用版はシート構成を問わない。
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
- Outlookが起動していることを確認する(※ 未起動の場合はエラー429が発生します)
Alt + F8→ マクロ名を選んで「実行」
ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。
—
コード(基本版)– 予定を1件登録する
まずはこれだけで動く。Outlookの予定表に1件の予定を登録する。
'============================================================
' ■ Outlookの予定表に予定を1件登録する(基本版)
' → 件名・開始日時・終了日時を指定して予定を作成
'============================================================
Sub CreateAppointment()
'--- ★書き換えポイント ---
Dim apptSubject As String
apptSubject = "定例会議" '← 件名
Dim apptStart As Date
apptStart = #4/1/2026 10:00:00 AM# '← 開始日時
Dim apptEnd As Date
apptEnd = #4/1/2026 11:00:00 AM# '← 終了日時
'--- ★ここまで ---
' Outlook を起動(参照設定不要)
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
' 予定アイテムを作成
Dim olAppt As Object
Set olAppt = olApp.CreateItem(1) ' 1 = olAppointmentItem
With olAppt
.Subject = apptSubject ' 件名
.Start = apptStart ' 開始日時
.End = apptEnd ' 終了日時
.Save ' ★ 予定表に保存
End With
MsgBox "予定を登録しました。" & vbCrLf & _
"件名:" & apptSubject & vbCrLf & _
"開始:" & Format(apptStart, "yyyy/mm/dd hh:nn"), vbInformation
Set olAppt = Nothing
Set olApp = Nothing
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
apptSubject |
予定の件名 | "定例会議" |
apptStart |
開始日時 | #4/1/2026 10:00:00 AM# |
apptEnd |
終了日時 | #4/1/2026 11:00:00 AM# |
コードの流れ
- 件名・開始日時・終了日時を変数に設定
CreateObject("Outlook.Application")でOutlookを起動(参照設定不要)CreateItem(1)で予定アイテム(AppointmentItem)を作成.Saveで予定表に保存
ポイント: .Save は予定表に直接保存する。内容を確認してから保存したい場合は .Display に変更すると、予定ウィンドウが開くだけで保存はされない。
—
コード(応用版)– リマインダー・場所・本文を設定
業務で使うなら、リマインダー・場所・本文も設定したい。予定の詳細情報を一通り設定する応用版。
'============================================================
' ■ リマインダー・場所・本文付きで予定を登録(応用版)
' → AppointmentItemの主要プロパティを設定
'============================================================
Sub CreateAppointmentEx()
'--- ★書き換えポイント ---
Dim apptSubject As String
apptSubject = "月次報告会" '← 件名
Dim apptStart As Date
apptStart = #4/5/2026 2:00:00 PM# '← 開始日時
Dim apptEnd As Date
apptEnd = #4/5/2026 3:00:00 PM# '← 終了日時
Dim apptLocation As String
apptLocation = "会議室B(3F)" '← 場所
Dim apptBody As String
apptBody = "議題:" & vbCrLf & _
"1. 先月の実績報告" & vbCrLf & _
"2. 今月の計画確認" & vbCrLf & _
"3. その他" '← 本文
Dim apptReminder As Long
apptReminder = 15 '← リマインダー(分前)
'--- ★ここまで ---
' Outlook を起動(参照設定不要)
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
' 予定アイテムを作成
Dim olAppt As Object
Set olAppt = olApp.CreateItem(1) ' 1 = olAppointmentItem
With olAppt
.Subject = apptSubject ' 件名
.Start = apptStart ' 開始日時
.End = apptEnd ' 終了日時
.Location = apptLocation ' 場所
.Body = apptBody ' 本文
.ReminderSet = True ' リマインダーを有効化
.ReminderMinutesBeforeStart = apptReminder ' 通知タイミング(分前)
.BusyStatus = 2 ' 2 = 予定あり(空き時間表示)
.Save ' ★ 予定表に保存
End With
MsgBox "予定を登録しました。" & vbCrLf & _
"件名:" & apptSubject & vbCrLf & _
"開始:" & Format(apptStart, "yyyy/mm/dd hh:nn") & vbCrLf & _
"場所:" & apptLocation & vbCrLf & _
"リマインダー:" & apptReminder & "分前", vbInformation
Set olAppt = Nothing
Set olApp = Nothing
End Sub
追加ポイント
- Location: 場所を設定。空文字でもOK
- Body: 本文(メモ欄)を設定。
vbCrLfで改行 - ReminderSet / ReminderMinutesBeforeStart: リマインダーを有効化し、何分前に通知するか設定
- BusyStatus: 空き時間の表示。0=空き、1=仮の予定、2=予定あり、3=外出中
Outlookのメール本文にExcelの表を貼り付けたい場合は Excelの表をOutlookメール本文に貼り付けて送る方法 も参考になる。
—
コード(実務版)– 一覧表から一括登録+重複チェック
実務でスケジュールを管理するなら、Excelの一覧表から一括登録するのが最も効率的。件名+開始日時が一致する既存予定をスキップする重複チェック付き。
一覧表で予定を管理するようにしてからは、翌月の予定登録が5分で終わるようになった。何度実行しても二重登録にならないので、追加分だけ一覧に書いて再実行すればOK。
シートのレイアウト(実務版):
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | 件名 | 開始日時 | 終了日時 | 場所 | 本文 | リマインダー(分) | ステータス |
| 2 | 定例会議 | 2026/04/01 10:00 | 2026/04/01 11:00 | 会議室A | 議題:進捗確認 | 15 | |
| 3 | 月次報告 | 2026/04/05 14:00 | 2026/04/05 15:00 | 報告資料を持参 | 30 | ||
| 4 | 締め切り | 2026/04/10 09:00 | 2026/04/10 09:30 | 経費精算の提出期限 | 60 |
'============================================================
' ■ 一覧表からOutlook予定表に一括登録(実務版)
' → Sheet1のA列=件名、B列=開始日時、C列=終了日時
' → D列=場所、E列=本文、F列=リマインダー(分)
' → G列にステータスを記録
' → 件名+開始日時が一致する既存予定はスキップ(重複チェック)
'============================================================
Sub BulkCreateAppointments()
'--- ★書き換えポイント ---
Dim sheetName As String
sheetName = "Sheet1" '← シート名
Dim dataStartRow As Long
dataStartRow = 2 '← データの開始行(1行目はヘッダー)
'--- ★ここまで ---
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(sheetName)
'--- 最終行を取得(A列基準)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If lastRow < dataStartRow Then
MsgBox "スケジュール一覧にデータがありません。" & vbCrLf & _
"A2セル以降にデータを入力してください。", vbExclamation
Exit Sub
End If
'--- Outlook を起動(参照設定不要)
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
'--- 予定表フォルダを取得(重複チェック用)
Dim olNS As Object
Set olNS = olApp.GetNamespace("MAPI")
Dim olCal As Object
Set olCal = olNS.GetDefaultFolder(9) ' 9 = olFolderCalendar
Dim olItems As Object
Set olItems = olCal.Items
olItems.Sort "[Start]"
olItems.IncludeRecurrences = True
'--- 登録ループ
Dim addCount As Long
Dim skipCount As Long
Dim errCount As Long
addCount = 0
skipCount = 0
errCount = 0
Dim r As Long
For r = dataStartRow To lastRow
'--- A列(件名)が空欄ならスキップ
Dim subj As String
subj = Trim(CStr(ws.Cells(r, 1).Value))
If subj = "" Then
ws.Cells(r, 7).Value = "スキップ(件名なし)"
skipCount = skipCount + 1
GoTo NextRow
End If
'--- B列(開始日時)、C列(終了日時)を取得
Dim startDT As Date
Dim endDT As Date
On Error Resume Next
startDT = CDate(ws.Cells(r, 2).Value)
endDT = CDate(ws.Cells(r, 3).Value)
If Err.Number <> 0 Then
ws.Cells(r, 7).Value = "エラー(日時の形式が不正)"
errCount = errCount + 1
Err.Clear
On Error GoTo 0
GoTo NextRow
End If
On Error GoTo 0
'--- 開始 > 終了 のチェック
If startDT > endDT Then
ws.Cells(r, 7).Value = "エラー(開始が終了より後)"
errCount = errCount + 1
GoTo NextRow
End If
'--- 重複チェック(件名+開始日時が一致する予定を検索)
Dim sFilter As String
sFilter = "[Subject] = '" & Replace(subj, "'", "''") & "'" & _
" AND [Start] = '" & Format(startDT, "yyyy/mm/dd hh:nn") & "'"
Dim olExist As Object
Set olExist = olItems.Find(sFilter)
If Not olExist Is Nothing Then
ws.Cells(r, 7).Value = "スキップ(登録済み)"
skipCount = skipCount + 1
Set olExist = Nothing
GoTo NextRow
End If
'--- 予定を作成
On Error GoTo ErrHandler
Dim olAppt As Object
Set olAppt = olApp.CreateItem(1) ' 1 = olAppointmentItem
With olAppt
.Subject = subj ' A列:件名
.Start = startDT ' B列:開始日時
.End = endDT ' C列:終了日時
' D列:場所(空欄ならスキップ)
If Trim(CStr(ws.Cells(r, 4).Value)) <> "" Then
.Location = CStr(ws.Cells(r, 4).Value)
End If
' E列:本文(空欄ならスキップ)
If Trim(CStr(ws.Cells(r, 5).Value)) <> "" Then
.Body = CStr(ws.Cells(r, 5).Value)
End If
' F列:リマインダー(空欄なら既定値のまま)
If Trim(CStr(ws.Cells(r, 6).Value)) <> "" Then
.ReminderSet = True
.ReminderMinutesBeforeStart = CLng(ws.Cells(r, 6).Value)
End If
.BusyStatus = 2 ' 予定あり
.Save ' ★ 予定表に保存
End With
ws.Cells(r, 7).Value = "登録済み"
addCount = addCount + 1
Set olAppt = Nothing
On Error GoTo 0
NextRow:
Next r
'--- 結果を表示
MsgBox "予定の一括登録が完了しました。" & vbCrLf & vbCrLf & _
"登録:" & addCount & " 件" & vbCrLf & _
"スキップ:" & skipCount & " 件" & vbCrLf & _
"エラー:" & errCount & " 件" & vbCrLf & vbCrLf & _
"G列にステータスを記録しました。", vbInformation, "完了"
Set olItems = Nothing
Set olCal = Nothing
Set olNS = Nothing
Set olApp = Nothing
Exit Sub
ErrHandler:
ws.Cells(r, 7).Value = "エラー:" & Err.Description
errCount = errCount + 1
Set olAppt = Nothing
On Error GoTo 0
Resume NextRow
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
sheetName |
一覧表のシート名 | "Sheet1" |
dataStartRow |
データの開始行 | 2(1行目はヘッダー) |
コードの流れ
- 一覧表シートの最終行を取得
- Outlookを起動し、既定の予定表フォルダを取得
- 一覧表を1行ずつ読み、件名・開始日時・終了日時を取得
- 件名が空欄の行はスキップ
- 日時の形式チェック・開始>終了のチェック
- 重複チェック: 件名+開始日時が一致する既存予定があればスキップ
- 予定アイテムを作成し、場所・本文・リマインダーを設定
.Saveで予定表に保存- G列にステータス(「登録済み」「スキップ」「エラー」)を記録
ポイント: 重複チェックは件名(Subject)と開始日時(Start)の一致で判定する。同じ件名でも開始日時が異なれば別の予定として登録される。何度実行しても二重登録にならないので、追加分だけ一覧に追記して再実行すればOK。
シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
CreateObject を使っているため、参照設定は不要。そのままコピペで動く。
営業日を考慮してスケジュールを組みたい場合は 祝日・土日を除いた営業日を自動計算する方法 も参考になる。
—
よくある落とし穴5選
1. 「実行時エラー ‘429’」が出る
原因: Outlookがインストールされていない、または一度も起動されていない。
対策: Outlookをインストールし、初回起動でプロファイル設定を完了させてからマクロを実行する。タスクバーにOutlookのアイコンがあることを確認。
2. 開始日時と終了日時を逆にして登録してしまう
自分も何度かやった。Excelの一覧表でB列とC列を逆に入力してしまい、Outlookにエラー予定が大量に登録された。
対策: 実務版コードでは開始日時>終了日時の場合にエラーとしてスキップする処理を入れてある。
3. 日付の形式が合わずエラーになる
原因: セルの値が文字列として入力されていて、CDate() で変換できない。例えば「4月1日」のような書式だと変換に失敗する場合がある。
対策: セルの表示形式を「yyyy/mm/dd hh:mm」に統一する。実務版コードでは CDate() の変換エラーをキャッチしてスキップする処理を入れてある。
4. 同じ予定が何度も登録されてしまう
原因: 重複チェックなしでマクロを繰り返し実行した場合に発生する。
対策: 実務版コードでは件名+開始日時の一致で重複チェックしている。基本版・応用版には重複チェックがないため、繰り返し実行する場合は実務版を使うこと。
5. リマインダーの分数に文字列を入れてエラーになる
原因: F列(リマインダー)に「15分」のように単位付きで入力すると、CLng() で変換できずエラーになる。
対策: リマインダーの列には数値のみ入力する(例:15、30、60)。単位(分)はヘッダーに書いておく。
VBAでOutlookに予定が登録されないときの対処法
「マクロを実行したのにOutlookの予定表に予定が表示されない」という場合、原因は .Save ではなく .Display を使っていて保存していないか、Outlookが起動していないことが多い。タスクバーにOutlookのアイコンがあることを確認し、コード内で .Save が呼ばれているかチェックすること。
VBAでOutlook連携時にエラー429が出るときの対処法
「実行時エラー ‘429’: ActiveX コンポーネントはオブジェクトを作成できません」と出る場合、原因はOutlookがインストールされていないか、初回起動(プロファイル設定)が完了していないことだ。Outlookを起動してプロファイルのセットアップを完了させてから再実行する。
—
FAQ
Q1: 終日イベントとして登録したい
.AllDayEvent = True を設定すると終日イベントになる。この場合、.Start には日付のみ(時刻なし)を指定する:
With olAppt
.Subject = "有給休暇"
.Start = #4/15/2026#
.AllDayEvent = True
.Save
End With
Q2: 予定に色(分類項目)を付けたい
.Categories プロパティで分類項目を設定できる。Outlookの分類項目名を指定する:
.Categories = "重要"
複数の分類を設定する場合はカンマ区切り:"重要, 会議"
Q3: 登録した予定をVBAで削除したい
予定表フォルダから検索して削除する:
Dim olItem As Object
Set olItem = olItems.Find("[Subject] = '定例会議'")
If Not olItem Is Nothing Then
olItem.Delete
End If
大量削除する場合は、ループで Find → Delete を繰り返す。
Q4: 会議出席依頼(MeetingRequest)として送りたい
AppointmentItemに出席者を追加すると会議出席依頼になる。ただし処理が複雑になるため、この記事の範囲外とする。カスタマイズが必要な場合はココナラで相談を推奨。
Q5: 他の人の予定表に登録したい
既定の予定表(自分の予定表)以外への登録は、共有予定表のアクセス権限が必要。GetSharedDefaultFolder を使う方法があるが、組織のセキュリティ設定に依存するためIT部門に確認を推奨。
—
まとめ
- 基本版: 件名・開始日時・終了日時を指定して予定を1件登録
- 応用版: リマインダー・場所・本文・空き時間表示を設定
- 実務版: 一覧表からの一括登録+重複チェック+G列にステータスログ
重要なのは、重複チェック付きで何度実行しても二重登録にならないこと。追加の予定があれば一覧に追記して再実行するだけでOK。
関連記事
- ExcelからOutlookメールを自動作成する方法 — メール作成もVBAで自動化
- 祝日・土日を除いた営業日を自動計算する方法 — 営業日ベースでスケジュールを組む
- フォルダ内のファイルを日付フォルダに自動バックアップ — マクロ実行前のバックアップ自動化
—
次にやりたくなること
- ExcelからOutlookメールを自動作成する方法: 予定表だけでなくメール作成もVBAで自動化
- 祝日・土日を除いた営業日を自動計算する方法: 営業日を計算して予定の開始日を自動決定
- 指定時刻にマクロを自動実行する方法: 毎朝決まった時刻に予定の一括登録を自動実行
—
もっとカスタマイズしたい場合
「繰り返し予定(毎週・毎月)を自動登録したい」「会議出席依頼として出席者に送りたい」「Teamsの予定表とも連携したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。
相談時に伝えると話が早い情報:
- Excel のバージョン / OS
- 予定の種類(通常予定/終日イベント/会議出席依頼)
- 繰り返しパターンの有無(毎週月曜、毎月1日など)
- 出席者の指定が必要か
- Outlook以外のカレンダー(Teams, Googleカレンダーなど)との連携が必要か


コメント