【VBA】ExcelからOutlookの予定表に一括登録する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク
  1. この記事でわかること
  2. どんな場面で使う?
  3. 完成イメージ(Before / After)
  4. 実行前の準備
    1. Outlookの起動を確認する
    2. バックアップを取る
    3. Excelをマクロ有効ブック(.xlsm)で保存する
    4. スケジュール一覧を準備する(実務版で使用)
  5. 手順(コピペ → 実行まで約5分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  6. コード(基本版)– 予定を1件登録する
    1. 書き換えポイント
    2. コードの流れ
  7. コード(応用版)– リマインダー・場所・本文を設定
    1. 追加ポイント
  8. コード(実務版)– 一覧表から一括登録+重複チェック
    1. 書き換えポイント
    2. コードの流れ
  9. よくある落とし穴5選
    1. 1. 「実行時エラー ‘429’」が出る
    2. 2. 開始日時と終了日時を逆にして登録してしまう
    3. 3. 日付の形式が合わずエラーになる
    4. 4. 同じ予定が何度も登録されてしまう
    5. 5. リマインダーの分数に文字列を入れてエラーになる
    6. VBAでOutlookに予定が登録されないときの対処法
    7. VBAでOutlook連携時にエラー429が出るときの対処法
  10. FAQ
    1. Q1: 終日イベントとして登録したい
    2. Q2: 予定に色(分類項目)を付けたい
    3. Q3: 登録した予定をVBAで削除したい
    4. Q4: 会議出席依頼(MeetingRequest)として送りたい
    5. Q5: 他の人の予定表に登録したい
  11. まとめ
    1. 関連記事
  12. 次にやりたくなること
  13. もっとカスタマイズしたい場合

この記事でわかること

  • 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 のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

スケジュール一覧を準備する(実務版で使用)

実務版コードは以下のシート構成を前提としている:

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(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. Outlookが起動していることを確認する(※ 未起動の場合はエラー429が発生します)
  3. 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#

コードの流れ

  1. 件名・開始日時・終了日時を変数に設定
  2. CreateObject("Outlook.Application") でOutlookを起動(参照設定不要)
  3. CreateItem(1) で予定アイテム(AppointmentItem)を作成
  4. .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行目はヘッダー)

コードの流れ

  1. 一覧表シートの最終行を取得
  2. Outlookを起動し、既定の予定表フォルダを取得
  3. 一覧表を1行ずつ読み、件名・開始日時・終了日時を取得
  4. 件名が空欄の行はスキップ
  5. 日時の形式チェック・開始>終了のチェック
  6. 重複チェック: 件名+開始日時が一致する既存予定があればスキップ
  7. 予定アイテムを作成し、場所・本文・リマインダーを設定
  8. .Save で予定表に保存
  9. 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

大量削除する場合は、ループで FindDelete を繰り返す。

Q4: 会議出席依頼(MeetingRequest)として送りたい

AppointmentItemに出席者を追加すると会議出席依頼になる。ただし処理が複雑になるため、この記事の範囲外とする。カスタマイズが必要な場合はココナラで相談を推奨。

Q5: 他の人の予定表に登録したい

既定の予定表(自分の予定表)以外への登録は、共有予定表のアクセス権限が必要。GetSharedDefaultFolder を使う方法があるが、組織のセキュリティ設定に依存するためIT部門に確認を推奨。

まとめ

  • 基本版: 件名・開始日時・終了日時を指定して予定を1件登録
  • 応用版: リマインダー・場所・本文・空き時間表示を設定
  • 実務版: 一覧表からの一括登録+重複チェック+G列にステータスログ

重要なのは、重複チェック付きで何度実行しても二重登録にならないこと。追加の予定があれば一覧に追記して再実行するだけでOK。

関連記事

次にやりたくなること

もっとカスタマイズしたい場合

「繰り返し予定(毎週・毎月)を自動登録したい」「会議出席依頼として出席者に送りたい」「Teamsの予定表とも連携したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。

相談時に伝えると話が早い情報:

  • Excel のバージョン / OS
  • 予定の種類(通常予定/終日イベント/会議出席依頼)
  • 繰り返しパターンの有無(毎週月曜、毎月1日など)
  • 出席者の指定が必要か
  • Outlook以外のカレンダー(Teams, Googleカレンダーなど)との連携が必要か

コメント

タイトルとURLをコピーしました