Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 11全般 : Microsoft 365)
ユーザーフォームで選択した人のOutlook予定表に入力
投稿日時: 25/07/05 15:29:20
投稿者: miyuukate

下記の項目を選択してコンボボックス1で選択した人のOutlook予定表にそれぞれ入力になるようにしたいです。
ComboBox1→Aさん、Bさん、Cさん
ComboBox2 →内容
ComboBox3→日にち
ComnoBox4→開始時間
ComboBox5→終了時間
CommandButton1→Outlook予定表へ入力実行
 
初心者なので色々なサイト等参考にしながら作成したのですが、他の人のメールアドレスを指定しても全て自分のOutlook予定表に登録されます。
コードの順番、何が足りないのか等試行錯誤しましたが手詰まりでずっと改善されなく、こちらに投稿いたしました。
お解りになる方、ご教授お願いします。
 

Private Sub CommandButton1_Click()
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Outlook.Folder
    Dim olConItems As Outlook.Items
    Dim olItem As Outlook.AppointmentItem
    Dim olAppointment As Outlook.AppointmentItem
    Dim rc As String
    Dim selectedName As String
    Dim emailAddress As String
    
    Const EMAIL_A As String = "〇〇@outlook.jp"
    Const EMAIL_B As String = "△△@outlook.jp"
    Const EMAIL_C As String = "□□@outlook.jp"
    
    On Error Resume Next
    Set olApp = GetObject(, "Outlook.Application")
    If olApp Is Nothing Then
        Set olApp = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0
    
    selectedName = ComboBox1.Value
    
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set recOther = olNamespace.CreateRecipient(selectedName)
    Set olFolder = olNamespace.GetShareDefaultFolder(recOther, olFolderCalendar)
    Set olConItems = olFolder.Items
    Set olAppointment = olApp.CreateItem(olAppointmentItem)
    
    
    
    Select Case selectedName
        Case "Aさん"
            emailAddress = EMAIL_A
        Case "Bさん"
            emailAddress = EMAIL_B
        Case "Cさん"
            emailAddress = EMAIL_C
        Case Else
            MsgBox "選択されたアドレスがありません"
            Exit Sub
    End Select
    
    rc = MsgBox("予定表へ登録しますか?", vbYesNo + vbQuestion, "確認")
    
    If rc = vbYes Then
        Set olItem = olApp.CreateItem(olAppointmentItem)
          With olAppointment
             .Subject = Me.ComboBox2.Text & "の予定"
             .Body = Me.ComboBox2.Text
             .Start = Me.ComboBox3.Text & " " & Me.ComboBox4.Text
             .End = Me.ComboBox3.Text & " " & Me.ComboBox5.Text
             .Recipients.Add emailAddress
             .Save
          End With
     End If
    
    MsgBox "予定が登録されました"

回答
投稿日時: 25/07/06 10:35:10
投稿者: Suzu

引用:
初心者なので色々なサイト等参考にしながら作成したのですが、他の人のメールアドレスを指定しても全て自分のOutlook予定表に登録されます。

 
 
Outlookは使用していませんので、確かな事は言えませんが
 
【最強のカレンダーアプリ】Outlookカレンダーで日程共有した結果が便利すぎた!
https://schecon.com/article/?p=9570
 
 
引用:
Outlookで共有された予定表を表示する
Outlookカレンダーの予定表を他メンバーから共有された場合、まず自身のOutlookアカウントに「予定表共有のお知らせ」メールが届きます。
メールでは、以下の内容を確認できます。
 
予定表が共有された旨
予定表を作成したユーザーの名前・アドレス
自分に付与された予定表のアクセス権限
この旨の下に承諾ボタン(「Accept and view calendar」ボタン)が設置されており、ボタンを押すと予定表欄から共有された予定表を確認できます。
 
共有された予定表は、自分のOutlookカレンダーに追加する形で書き込まれ、自分のスケジュールと共有されたスケジュールがまとめて表示されます。

 
相手のメールに、予定表のデータがメールの形で届き
そのメールに対し承認を行って初めて その人の予定表に追加される仕様だったはず。
 
VBAではなく、手動で希望の動作になる事を確認した上で、VBAを試されていますか?

投稿日時: 25/07/06 11:14:47
投稿者: miyuukate

アドバイスありがとうございます。
参考になるサイトも教えていただきたすかります。
色々と検索しましたがこのサイトは見れていませんでした。
  
コードに問題はないようでしたら…共有設定の部分かと悩んでいましたが
入力したい予定表(AさんBさん…)に手動では登録したり削除できていたので
VBAでもできるものと思っていましたが、それ以外にも設定等必要なのか確認してみます。
  
そもそもコードが間違っているのだろうと思っていたので(でもどうすればいいのかわからなく)
こちらに質問させていただきました。
共有の設定等もう1度確認してみます。

回答
投稿日時: 25/07/06 15:16:32
投稿者: simple

回答ではありません。
 
「Excel のデータをほかのユーザーの予定表に書き込むマクロ」
https://outlooklab.wordpress.com/2012/10/27/excel-%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e3%81%bb%e3%81%8b%e3%81%ae%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%ae%e4%ba%88%e5%ae%9a%e8%a1%a8%e3%81%ab%e6%9b%b8%e3%81%8d%e8%be%bc%e3%82%80/
が参考になりませんか?
いずれにせよ、こちらのoutlook研究所にほとんどの情報はありそうな気がしています。

投稿日時: 25/07/06 15:51:19
投稿者: miyuukate

アドバイスありがとうございます。
このサイトも見つけられていませんでした。
とても参考になります。
共有の設定のサイトとこのサイトのコードを参考にして、再度作ってみます。

回答
投稿日時: 25/07/06 18:08:05
投稿者: Suzu

引用:
コードに問題はないようでしたら…共有設定の部分かと悩んでいましたが
入力したい予定表(AさんBさん…)に手動では登録したり削除できていたので
VBAでもできるものと思っていましたが、それ以外にも設定等必要なのか確認してみます。

 
VBAに問題があるのかどうかまでは見ておりませんでした。
simpleさんが紹介くださったサイトにもある様に、
他の方の予定表を触るとなると、
 Exchange が必要であり
 Exchange 経由でないなら、Mailにて予定情報を送信し、そこで承認されて 他の方の予定表に加わる
 
 
Exchange 経由なのかどうかが、質問者さんの質問文では判断できず
質問者さんが『Exchange 経由でないにも関わらず、VBAだったら、他人の予定表を編集できる』
と思い、質問されているのかも知れないと考え
Exchange経由なのかどうかを確認する為に、手動ではできているのですか?と聞いた次第です。
 
何にしても、simpleさんの紹介くださったサイトが Outlook VBA を扱うには詳しいサイトですので
そちらを参考にして頂ければよいと思います。

投稿日時: 25/07/07 00:19:50
投稿者: miyuukate

色々と教えていただきありがとうございます。
職場で利用するために作成しているのですがExchange経由になっています。
色々とアドバイスや参考になるサイト等教えていただき、それを元に明日実際に予定表に登録になるか試してみようと思います。

投稿日時: 25/07/07 22:45:44
投稿者: miyuukate

共有の設定については大丈夫でした。
ですが自分の予定表に入力になるため、サイト等参考にしてコードを少し改良したのですが、olFolder,olConItems,olAppointment等がNothingでエラーが出ます。
コードの順番等色々試行錯誤しているのですが、どの部分に問題があるのか不明です。
中々解決せず申し訳ないのですが、どの部分に問題があるのかお解りになる方、ご教授お願いします。
 
 
Private Sub CommandButton1_Click()
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Outlook.Folder
    Dim olConItems As Outlook.Items
    Dim olItem As Outlook.AppointmentItem
    Dim olAppointment As Outlook.AppointmentItem
    Dim rc As String
    Dim selectedName As String
    Dim emailAddress As String
    Dim olRec As Outlook.Recipient
 
     
    Const EMAIL_A As String = "〇〇@outlook.jp"
    Const EMAIL_B As String = "△△@outlook.jp"
    Const EMAIL_C As String = "□□@outlook.jp"
     
    On Error Resume Next
    Set olApp = GetObject(, "Outlook.Application")
    If olApp Is Nothing Then
        Set olApp = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0
     
    selectedName = ComboBox1.Value
     
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set olRec = olNamespace.CreateRecipient(selectedName)
    Set olFolder = olNamespace.GetShareDefaultFolder(olRec, olFolderCalendar)
    Set olConItems = olFolder.Items
    Set olAppointment = olApp.CreateItem(olAppointmentItem)
     
     
     
    Select Case selectedName
        Case "Aさん"
            emailAddress = EMAIL_A
        Case "Bさん"
            emailAddress = EMAIL_B
        Case "Cさん"
            emailAddress = EMAIL_C
        Case Else
            MsgBox "選択されたアドレスがありません"
            Exit Sub
    End Select
     
    rc = MsgBox("予定表へ登録しますか?", vbYesNo + vbQuestion, "確認")
     
    If rc = vbYes Then
        Set olItem = olApp.CreateItem(olAppointmentItem)
          With olAppointment
             .MeetingStatus = olMeeting
             .Subject = selectedName & "の予定"
             .Body = Me.ComboBox2.Text
             .Start = Me.ComboBox3.Text & " " & Me.ComboBox4.Text
             .End = Me.ComboBox3.Text & " " & Me.ComboBox5.Text
             .Recipients.Add emailAddress
             .Save
          End With
     End If
     
    MsgBox "予定が登録されました"
     
End Sub

回答
投稿日時: 25/07/08 10:00:41
投稿者: Suzu

Exchange は使っていないのでテストできませんので
予定共有そのものの実行までは判りません。
 
テストと捉えた場合のコードの組み方
コードそのものの評価について
 
・予定共有そのものについて、VBAでの動作確認もできていない状態ですので
 まずは、それをVBAにて予定共有を行うコードをめざす。
  ボタントリガーではなく、標準モジュールで良い
  コンボボックス等余計なものはそぎ落とし、Select Case や、MsgBoxは最低限で良い
 
 まずはテストなので、Aさん〜Cさんの選択はあとから、今はAさん決め打ち。
 Select Case や、MsgBoxは省く。日時も直打ちにてテストすれば良い。
そうなると、下記の様なコードになるかと。
 

Sub TEST()
  Dim olApp As Outlook.Application
  Dim olNamespace As Outlook.Namespace
'  Dim olFolder As Outlook.Folder
'  Dim olConItems As Outlook.Items
  Dim olItem As Outlook.AppointmentItem
  Dim olAppointment As Outlook.AppointmentItem
'  Dim rc As Long 'As String
  Dim selectedName As String
  Dim emailAddress As String
'  Dim olRec As Outlook.Recipient

  Const EMAIL_A As String = "〇〇@outlook.jp"

  Set olApp = GetObject(, "Outlook.Application")

  selectedName = "Aさん"
  emailAddress = EMAIL_A

  Set olNamespace = olApp.GetNamespace("MAPI")
'  Set olRec = olNamespace.CreateRecipient(selectedName)
'  Set olFolder = olNamespace.GetShareDefaultFolder(olRec, olFolderCalendar)
'  Set olConItems = olFolder.Items
  Set olAppointment = olApp.CreateItem(olAppointmentItem)

'  rc = MsgBox("予定表へ登録しますか?", vbYesNo + vbQuestion, "確認")

'  If rc = vbYes Then
'    Set olItem = olApp.CreateItem(olAppointmentItem)
    With olAppointment
      .MeetingStatus = olMeeting
      .Subject = selectedName & "の予定"
      .Body = "内容"
      .Start = #7/8/2025 9:00:00 AM#
      .End = #7/8/2025 10:00:00 AM#
      .Recipients.Add emailAddress
      .Save
    End With
'  End If
  MsgBox "予定が登録されました"
End Sub

 
 
さらに、上記コード中、コメントアウト部は
 
・Set〜 にて生成したオブジェクトについて、
 生成後、使用していないモノが多くあります。
 それらは使っていないのですから、生成してもしょうがない部分。
 
本来は必要であるのに、使われていない為、コメントアウトにしてしまっている部分があるなら
その部分を使う様にしましょう。
 
当方テストできないので、
予定共有を行う上で、本来必要なメソッドやコレクションが何であるかすら調べていません。
 (提示コードから、働いている部分はここですよ と言っているだけです)

投稿日時: 25/07/08 20:15:15
投稿者: miyuukate

必要な動きの部分だけでまずコードを作成してみるという方法は思いつきませんでした。
アドバイス大変勉強になりました。ありがとうございます。
この方法でまず希望通りの動きになるか試してみます。

トピックに返信