質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%

Q&A

解決済

1回答

532閲覧

Outlookの予定表の変更

hakutou

総合スコア11

0グッド

0クリップ

投稿2024/08/31 01:02

実現したいこと

Outlookの予定表をOutlookVBAでExcelのリストを読込んで修正できるようにしたいです。
今はExcelのマクロからOutlookへ接続しています。

(やりたいこと)
1.変更データのExcelを検索する
2.変更期間を設定する
3.セットする項目をOutlookからエクスポートした項目へ揃える
4.アラームの有無等
5.OutlookVBAで実行する

発生している問題・分からないこと

下記のサイトを参照に作成しています。
【VBA】一瞬でExcelのスケジュールをOutlookの予定表へ登録/変更する方法

◆発生していること
(やりたいこと)2.は変更データが入力した期間外でも変更されてしまいます。
◆わからないこと
(やりたいこと)3.Outlookの予定表をExcelへエクスポートしたデータを修正し、そのまま変更データとして用いたいのですが参考にしているサイトとタイトルが異なるためどのようにしたらよいのかが分かりません。
エクスポートしたデータのタイトルは下記のとおりです。
①件名
②開始日
③開始時間
④終了日
⑤終了時刻
⑥終日イベント
⑦アラーム
⑧アラーム日付
⑨アラーム時刻
⑩会議の開催者
⑪必須出席者
⑫任意出席者
⑬リソース
⑭プライベート
⑮経費情報
⑯公開する時間帯の種類
⑰支払条件
⑱場所
⑲内容
⑳秘密度
㉑分類
㉒優先度

該当のソースコード

Sub Outlookの予定表を変更() 'ファイルの検索 Dim fName As String fName = Application.GetOpenFilename(FileFilter:="Excelブック,*.xls*", MultiSelect:=False) If fName = "False" Then MsgBox "キャンセルしました。" Exit Sub '終了 End If 'Outlook用の定義 Dim olApp As Outlook.Application Dim olNamespace As Outlook.Namespace Dim olFolder As Folder Dim olConItems As Outlook.Items Dim olItem As AppointmentItem Dim olItemBefor As AppointmentItem Dim checkFlg As Long '重複チェックフラグ初期値設定 checkFlg = 0 'Excel用の定義 Dim wbBook As Workbook Dim wsSheet As Worksheet Dim lnContactCount As Long Dim i As Integer '抽出期間の定義 Dim strStart As String Dim strEnd As String Dim intKikan As Integer '対象予定表の抽出期間を月単位で指定します。 '※抽出期間が短いと予定アイテムのチェックができず登録できない場合がありますので注意してください。 'intKikan = 12 '抽出期間を12か月にしています。 '抽出期間をフォーム入力へ変更 intKikan① = InputBox(prompt:="変更開始日をyyyy/mm/ddで入力してください。", Title:="期間設定") intKikan② = InputBox(prompt:="変更終了日をyyyy/mm/ddで入力してください。", Title:="期間設定") 'strStart = Format(DateAdd("m", -intKikan, Date), "yyyy/mm/dd") '抽出するスケジュールの開始日を指定 'strEnd = Format(DateAdd("m", intKikan, Date), "yyyy/mm/dd") '抽出するスケジュールの終了日を指定 strStart = Format(intKikan①, "yyyy/mm/dd") '抽出するスケジュールの開始日を指定 strEnd = Format(intKikan②, "yyyy/mm/dd") '抽出するスケジュールの終了日を指定 'スクリーンの更新は行われません。 Application.ScreenUpdating = False 'Excelのブックとワークシートのオブジェクトを設定します。 Set wbBook = Workbooks.Open(fName) Set wsSheet = wbBook.Worksheets("予定表リスト") wsSheet.Activate 'Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。 Set olApp = New Outlook.Application Set olNamespace = olApp.GetNamespace("MAPI") Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar) Set olConItems = olFolder.Items 'Restrictメソッドで期間指定して抽出するメールアイテムを絞り込みます。 Set olConItems = olConItems.Restrict("[Start] >= '" & strStart & "' And [End] < '" & strEnd & "'") '取得結果を記述する行番号を指定します。2行目のセルから開始されることになります。 lnContactCount = 2 Dim rc As Integer rc = MsgBox("予定表へ登録しますか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then '予定表一覧の件数分繰り返す。 For i = lnContactCount To Cells(1, 1).End(xlDown).Row Set olItem = olApp.CreateItem(olAppointmentItem) '重複チェック&更新処理 For Each olItemBefor In olConItems If TypeName(olItemBefor) = "AppointmentItem" Then 'ExcelI列のEntryIDと登録されているEntryIDが一致していたら該当予定表を更新 If olItemBefor.EntryID = Cells(i, 9) Then '比較用に一時的に作成 With olItem .Subject = Cells(i, 1) .Start = Format(Cells(i, 3), "yyyy/mm/dd hh:mm:ss") .End = Format(Cells(i, 4), "yyyy/mm/dd hh:mm:ss") End With '重複フラグ1をセット checkFlg = 1 '登録されている予定表の件名と開始日時及び終了日時が一致していなかった場合のみ更新 '※更新の条件はご都合に応じて変更してください。この条件が無い場合はExcelの予定表すべて更新されますので、ご注意ください。 If olItemBefor.Subject = olItem.Subject And olItemBefor.Start = olItem.Start And olItemBefor.End = olItem.End Then Else With olItemBefor .Subject = Cells(i, 1) .Location = Cells(i, 2) .Start = Format(Cells(i, 3), "yyyy/mm/dd hh:mm:ss") .End = Format(Cells(i, 4), "yyyy/mm/dd hh:mm:ss") .Body = Cells(i, 5) .RequiredAttendees = Cells(i, 6) .OptionalAttendees = Cells(i, 7) .Save End With End If 'Null out the variables. Set olItem = Nothing End If End If Next If checkFlg <> 1 Then 'ExcelI列のEntryIDと登録されているEntryIDが一致していなかったら新規登録 With olItem .Subject = Cells(i, 1) .Location = Cells(i, 2) .Start = Format(Cells(i, 3), "yyyy/mm/dd hh:mm:ss") .End = Format(Cells(i, 4), "yyyy/mm/dd hh:mm:ss") .Body = Cells(i, 5) .RequiredAttendees = Cells(i, 6) .OptionalAttendees = Cells(i, 7) .Save End With 'ExcelI列へ発行されたEntryIDを書き込み Cells(i, 9) = olItem.EntryID End If '重複フラグリセット checkFlg = 0 Next Else MsgBox "処理を中断します" Exit Sub End If 'Null out the variables. Set olItem = Nothing Set olApp = Nothing 'Turn screen updating back on. Application.ScreenUpdating = True MsgBox "Outlook予定表の登録が完了しました!", vbInformation End Sub

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

(やりたいこと)1.は解決済みです。
(やりたいこと)2.は自分なりに変更しましたが思い通りの結果になりませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk.exe

2024/09/02 08:15 編集

> エクスポートしたデータのタイトルは下記のとおりです。 Outlook の標準機能によって CSV 形式でエクスポートされたテキストファイルであるとして、 > 1.変更データのExcelを検索する > 2.変更期間を設定する 予定の開始日時や終了日時の変更もひっくるめての話なのであれば、少なくともそのファイルレイアウトのままで、ご要望を完璧な形で叶える手段は存在しないでしょう。 Outlook 側のアイテムの内容を変更するには、まず CSV ファイル側の該当レコードとの紐づけが正確に行われなければなりません。 しかし、Outlook から出力された CSV ファイルには予定アイテムの EntryId が含まれておらず、それぞれのアイテムを一意に識別するための項目が記録されていません。 仮に[件名]、[開始日]、[開始時刻]、[終了日]、[終了日時]の組み合わせを検索条件にしたとしても、Outlook 上において「全ての設定項目が完全に一致する予定」を複数件登録することは可能ですので、それらの値の組み合わせが必ずしも一意になるとは限りません。 内容が重複する予定アイテムが実際には存在しなかったとしても、例えば CSV ファイル側の[開始日]が異なる日付に変更されれば、当然 Outlook 側の元の予定アイテムの日付とは一致しないため紐付けることが出来ません。 逆に Outlook 側で元の予定アイテムの[開始日]が変更された場合も同様です。
hakutou

2024/09/11 05:25

sk.exe 様 コメントありがとうございます。 >予定の開始日時や終了日時の変更もひっくるめての話なのであれば、少なくともそのファイルレイアウト>のままで、ご要望を完璧な形で叶える手段は存在しないでしょう。 やはりそうですか。 今、段階を踏んで登録できるか試行錯誤しております。 少し時間がかかるかもしれませんが頑張ってみようと思います。 また、分からないことがありましたら教えてください。 どうもありがとうございました。  
hakutou

2024/09/11 05:30

sk.exe 様 ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
guest

回答1

0

ベストアンサー

エクスポートしたデータのタイトルは下記のとおりです。

Outlook の標準機能によって CSV 形式でエクスポートされたテキストファイルであるとして、

1.変更データのExcelを検索する
2.変更期間を設定する

「既存の予定アイテムの開始日時や終了日時の変更」もひっくるめての話なのであれば、少なくともそのファイルレイアウトのままで、ご要望を完璧な形で叶える手段は存在しないでしょう。

Outlook 側のアイテムの内容を変更するには、まず CSV ファイル側の該当レコードとの紐づけが正確に行われなければなりません。
しかし、Outlook から出力された CSV ファイルには予定アイテムの EntryID が含まれておらず、それぞれのアイテムを一意に識別するための項目が記録されていません。

仮に[件名]、[開始日]、[開始時刻]、[終了日]、[終了日時]の組み合わせを検索条件にしたとしても、Outlook 上において「全ての設定項目が完全に一致する予定」を複数件登録することは可能ですので、それらの値の組み合わせが必ずしも一意になるとは限りません。

内容が重複する予定アイテムが実際には存在しなかったとしても、例えば CSV ファイル側の[開始日]が異なる日付に変更されれば、当然 Outlook 側の元の予定アイテムの日付とは一致しないため紐付けることが出来ません。
逆に Outlook 側で元の予定アイテムの[開始日]が変更された場合も同様です。

ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?

と言われたので一応投稿はしましたが、質問へのコメントにおいて問題の解決策や代替案を提示したわけではないので、念のためそれっぽいことも追記しておきます。

今、段階を踏んで登録できるか試行錯誤しております。

「Outlook の標準エクスポート機能を使用すること」が絶対条件ではないのであれば、例えば次のような方式が考えられます。

  • 標準レイアウトの出力項目に加え、更にそれぞれの予定アイテム( Outlook.AppointmentItem オブジェクト)の EntryID を出力対象とする独自のエクスポート処理(Excel のマクロによって直接ワークシートに展開するのであれば「インポート処理」)を作成する。

  • 上記の処理によって出力されたファイルを Excel で編集する際は、EntryID が出力された列のセルを編集しない/させないようにする。

  • 「ExcelワークシートとOutlook予定表との同期処理」を実行する際には、ワークシートの行ごとに EntryID が一致する予定アイテムを検索し、もし該当する予定アイテムが見つかった場合はそのアイテムの更新(上書き)を、見つからなかった(あるいは EntryID 列が空白セルである)場合は予定アイテムの新規作成を行うようにする。

  • 同期に際して「任意の予定アイテムの削除」も実行できるようにするのであれば、別途[削除フラグ]のような列を設け、その値によって削除の是非を判定するようにする。

但し、上記の方法( EntryID による紐づけ)が有効なのは、あくまで「同一環境/同一ユーザーのOutlook予定表」を参照/操作する場合のみです。

Outlook 上において各予定アイテムに対して内部的に割り当てられている EntryID は、それぞれの予定を追加した時点で自動生成される48桁の一意な文字列です。
生成された文字列と予定の内容(件名、日時、本文など)との間に相関性はありません。

例えば「あるユーザーAが使用するOutlookからエクスポートされたファイル」と「別のユーザーBが使用するOutlookの予定表」を同期させようとしても、両者の EntryID が一致することはほぼありません。
万が一 EntryID が一致する予定アイテムが見つかったとしてもそれは単なる偶然でしかなく、その予定アイテムを更新対象とするのはむしろ不適切です。

投稿2024/09/11 08:46

編集2024/09/11 09:16
sk.exe

総合スコア1070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問