【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!
Excel (VBA) |
|
(Windows 11全般 : 指定なし)
Outlook 削除
投稿日時: 24/09/13 13:10:26
投稿者: chokobanana
|
---|---|
Outlookの予定表をExcelを使って、削除、登録させるようにしたいです
|
投稿日時: 24/09/13 19:46:08
投稿者: simple
|
|
---|---|
予定を管理するAppointmentItem オブジェクトのヘルプは下記のようです。
|
投稿日時: 24/09/14 12:30:08
投稿者: Suzu
|
|
---|---|
引用: 引用: 参考のコードを探し それを元に希望のコードに改造は よくありますが それは、コードの内容をある程度理解して が前提。 コードがどんな条件でどんな動作を行っているかは把握していますか? それが判らなければ、どこでどんな動作をさせれば良いか組み立てる事ができません。 どんな事を行い、どうなっって、希望の動作と違うのでしょうか。 |
投稿日時: 24/09/17 09:57:24
投稿者: chokobanana
|
|
---|---|
(追記)
引用: EntryIDが一致したら削除↑ これで削除はできたのですが 引用: ↑これを削除すると sheetにある情報すべて(抽出期間外も)削除、追加となってしまいました ここが更新となっているんではないかと思っております 見当違いだったらすいません これを抽出期間のみに作用させるにはどうしたらいいのですか |
投稿日時: 24/09/18 08:34:43
投稿者: simple
|
|
---|---|
技術的観点から、Microsoftのヘルプを紹介しましたが、別の観点から。
Set olConItems = olConItems.Restrict("[Start] >= '" & strStart & "' And [End] < '" & strEnd & "'")ですから、そこが適切に動作していないものと推定します。 絞り込みできているのに、それ以外の期間のものまで削除することは考えにくいです。 ステップ実行して、olConItemsが適切なものになっているかをローカルウインドウで確認すべきです。 想定外のことがどうしても発生してしまう、ということなら、ますます手動で十分じゃないですか? ----- ちなみに*2、 いったん削除したものも「削除済みアイテム」フォルダから戻すことが可能です。 (一定時間後に自動消去する「自動整理」を設定していれば別ですが。) |
投稿日時: 24/09/18 09:11:45
投稿者: chokobanana
|
|
---|---|
simple 様
|
投稿日時: 24/09/18 12:48:12
投稿者: Suzu
|
|
---|---|
引用: 質問の仕方が悪かったです。 そういう事をお聞きしたかったのではなく どんな条件の時に、コードが実行されているのかを理解されていますか? とお聞きしたかったのです。 そのうえで、上記の返答を見る限り、コードの認識に 間違いがあります。 以下に一部赤でコメントと、コードを追加しました。 'ExcelI列のEntryIDと登録されているEntryIDが一致していたら該当予定表を更新 If olItemBefor.EntryID = Cells(i, 9) Then 'EntryIDと登録されているEntryIDが一致している時 '比較用に一時的に作成 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 'ここでは、 'EntryIDと登録されているEntryIDが一致している時 'かつ 'Subject、Start、End が一致していない 'モノに対し アイテムを生成保存しています。 'ここでの生成対象は、Start/End は、先の 'Restrictメソッドで期間指定して抽出するメールアイテムを絞り込む 'Set olConItems = olConItems.Restrict("[Start] >= '" & strStart & "' And [End] < '" & strEnd & "'") 'にて、指定したStart/End は 何ら反映されず、 'Excel シート上のEntryIDが一致しているモノに、データを上書きしており 'ご希望の指定期間の判定を行うなら、 'strStart と、strEnd それぞれに対し シート3列目、4列目 のデータと比較し 'データを生成するか決める必要があります。 '定期アイテムは除外します。 If Not olItemBefor.IsRecurring Then 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 End If 'Null out the variables. Set olItem = Nothing Else 'EntryIDと登録されているEntryIDが一致していない時 End If 一致しない場合の動作については、何も指定されていません。 期間についても、上記内に記載した内容にて判定を行う必要があります。 それらを踏まえ、どの位置にてどんな判定を行えば 希望の条件が得られるか を検討し、そこに、目的の動作を行う命令を入れるようにしましょう。 |
投稿日時: 24/09/19 01:28:47
投稿者: MMYS
|
|
---|---|
直接の回答ではありません。直接の原因は、他の方の回答を参考にしてください
If olItemBefor.Subject = olItem.Subject And olItemBefor.Start = olItem.Start And olItemBefor.End = olItem.End Then Else '定期アイテムは除外します。 '<略> End If ここの処理ですが、もし、こんな都合のよい関数があったらどうでしょう。 ・条件1 Subject が一致していること。 ・条件2 Start が一致していること。 ・条件3 End が一致していること。 すへての条件が揃った場合、Trueを返す。それ以外はFalseを返す。 では、上記の内容を満たすコードを作成してみましょう。コードは下記になります。 Function CheckMailItem(olItemBefor As AppointmentItem, olItem As AppointmentItem) Dim b As Boolean b = True b = b And (olItemBefor.Subject = olItem.Subject) b = b And (olItemBefor.Start = olItem.Start) b = b And (olItemBefor.End = olItem.End) CheckMailItem = b End Function 上記コードは、すべての条件が、揃った場合、Trueを返します。条件が一つでも当てはまらない場合、Falseを返します。デバック時は、ステップ実行で、bの値を1行ごとに確認してください。条件不一致のとき、変数 b はFalseになり、その後の条件は関係なく 常にFalseです。つまり、すべての条件が Trueの時だけ Tureを返します。 ※上記コードは論理演算の理解が必要ですが、本題から逸れるので割愛。 さて、最初のコードを次のように書き換えて、「ユーザーインターフェース」と「実行部」を分割。 Dim b As Boolean b = CheckMailItem(olItemBefor, olItem) If b Then Debug.Print "条件OK", olItemBefor.Subject Else Debug.Print "定期アイテムは除外", olItemBefor.Subject End If この時点では、まだ削除コードは書いてはいけません。この時点はイミテーションウインドウで正しく動作か確認します。正しいことが確認出来たら、今度は削除するプロシージャを作成します。 Sub DeleteMailItem(olItemBefor As AppointmentItem, i As Long) '定期アイテムは除外します。 If Not olItemBefor.IsRecurring Then 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 End Sub では、このプロシージャを呼び出して、削除コードを追加します。 Dim b As Boolean b = CheckMailItem(olItemBefor, olItem) If b Then Debug.Print "条件OK", olItemBefor.Subject Else Debug.Print "定期アイテムは除外", olItemBefor.Subject DeleteMailItem olItemBefor, i End If あとは、同じようにして、下記も書き換えて行きます。 変更前 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) ' <以下略> 変更後 Dim rc As Integer rc = MsgBox("予定表へ登録しますか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then UpdateOutlookPlan 引数 End If Sub UpdateOutlookPlan(引数) '予定表一覧の件数分繰り返す。 For i = lnContactCount To Cells(1, 1).End(xlDown).Row Set olItem = olApp.CreateItem(olAppointmentItem) ' <以下略> End Sub 以上のように、プロシージャを分割。プロシージャ単位でデバックし、単体でバグがないことを確認。今回は割愛してますが通常単体テストのコードを作成し、プロシージャ単体でしっかりテスト。品質が確保されたら、次の工程に進みます。次の工程でバグがある場合、 ・呼び出し元のバグ ・呼び出し先のバグ。 のどちらかに切り分けます。呼び出し先なら、再度プロシージャ単体テスト。呼び出し元なら引数の値の確認。 一つのプロシージャで多くのことを行うと、バグの発生確率が上がり、デバックも困難になります。 プロシージャ自体の行数が短かいほど、バグの可能性が低く、仕様変更に強いプログラムになります。 ※提示コードは、考え方の提示のため、動作検証はしておりません。 |
投稿日時: 24/09/19 09:36:27
投稿者: chokobanana
|
|
---|---|
Suzu 様
引用: |
投稿日時: 24/09/19 10:50:36
投稿者: Suzu
|
|
---|---|
前提条件として
引用: がありました。 加えて 引用: から察するに シート9列目 と 同一な EntryID の Outlookのアイテムがある場合 → 削除 シート9列目 と 同一な EntryID の Outlookのアイテムがない場合 かつ シートの 3列目(開始)、4列目(終了) が指定した期間内 の場合 → 登録 という事なのでは? プログラミングは VBAに限らず 条件 をきちんとご自身で理解しコード上で実現できる ができないといけません。 それは、VBAのコーディング うんぬん ではありません。読み解くのも同様です。 現状のコードを利用するなら、どんな条件の時に 動作するのかを理解する イチから作るのであれば どういう条件の時に どういう動作をさせたい。 を日本語できちんとまとめましょう。 ご自身がフロー図の方が判り良いならフロー図で表現しても良いでしょう 今回、部分的に ○○の様な動作させたい場合の コードは何でしょうか? の様な質問があれば △△.Delete ですね 等、回答する事はありますが 当方から、条件分岐から動作まで含め こうしたら良いと言うコードを示す事はしません。 |
投稿日時: 24/09/20 13:35:32
投稿者: chokobanana
|
|
---|---|
MMYS 様
|