Excel (VBA) |
|
(Windows 11全般 : Microsoft 365)
ユーザーフォームで選択した人のOutlook予定表に入力
投稿日時: 25/07/05 15:29:20
投稿者: miyuukate
|
|---|---|
|
下記の項目を選択してコンボボックス1で選択した人の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カレンダーで日程共有した結果が便利すぎた! https://schecon.com/article/?p=9570 引用: 相手のメールに、予定表のデータがメールの形で届き そのメールに対し承認を行って初めて その人の予定表に追加される仕様だったはず。 VBAではなく、手動で希望の動作になる事を確認した上で、VBAを試されていますか? |
|
|
|
投稿日時: 25/07/06 11:14:47
投稿者: miyuukate
|
|---|---|
|
アドバイスありがとうございます。
|
|
|
|
投稿日時: 25/07/06 15:16:32
投稿者: simple
|
|---|---|
|
回答ではありません。
|
|
|
|
投稿日時: 25/07/06 15:51:19
投稿者: miyuukate
|
|---|---|
|
アドバイスありがとうございます。
|
|
|
|
投稿日時: 25/07/06 18:08:05
投稿者: Suzu
|
|---|---|
引用: VBAに問題があるのかどうかまでは見ておりませんでした。 simpleさんが紹介くださったサイトにもある様に、 他の方の予定表を触るとなると、 Exchange が必要であり Exchange 経由でないなら、Mailにて予定情報を送信し、そこで承認されて 他の方の予定表に加わる Exchange 経由なのかどうかが、質問者さんの質問文では判断できず 質問者さんが『Exchange 経由でないにも関わらず、VBAだったら、他人の予定表を編集できる』 と思い、質問されているのかも知れないと考え Exchange経由なのかどうかを確認する為に、手動ではできているのですか?と聞いた次第です。 何にしても、simpleさんの紹介くださったサイトが Outlook VBA を扱うには詳しいサイトですので そちらを参考にして頂ければよいと思います。 |
|
|
|
投稿日時: 25/07/07 00:19:50
投稿者: miyuukate
|
|---|---|
|
色々と教えていただきありがとうございます。
|
|
|
|
投稿日時: 25/07/07 22:45:44
投稿者: miyuukate
|
|---|---|
|
共有の設定については大丈夫でした。
|
|
|
|
投稿日時: 25/07/08 10:00:41
投稿者: Suzu
|
|---|---|
|
Exchange は使っていないのでテストできませんので
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
|
|---|---|
|
必要な動きの部分だけでまずコードを作成してみるという方法は思いつきませんでした。
|
|
|
|
投稿日時: 25/07/26 01:35:47
投稿者: miyuukate
|
|---|---|
|
日数が経過してしまいましたがこの間も試行錯誤で取り組んでいて、やっと自分の予定表ではなく希望の予定表に登録することができたのでOutlookの共有設定には問題がないことはわかりました。
Private Sub CommandButton1_Click()
Dim olApp As Outlook.Application
Dim olNamespace As Outlook.Namespace
Dim olFolder As Outlook.Folder
Dim olRec As Outlook.Recipient
Dim olConItems As Outlook.Items
Dim olItem 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 olRec = olNamespace.CreateRecipient([color=red]selectedName[/color])
[b]Set olFolder = olNamespace.GetShareDefaultFolder(olRec, olFolderCalendar)[/b]
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 = olConItems.Add()
With olItem
.Subject = Me.ComboBox2.Text & "の予定"
.Body = Me.ComboBox2.Text
.Start = Me.ComboBox3.Text & " " & Me.ComboBox4.Text
.End = Me.ComboBox3.Text & " " & Me.ComboBox5.Text
.Save
End With
End If
End Sub
式 値
EMAIL_A "〇〇@outlook.jp"
EMAIL_B "△△@outlook.jp"
EMAIL_C "□□@outlook.jp"
Me
olAPP
olNameSpase
[color=red]olFolder Nothing[/color]
rc ""
selectedName "Aさん"
[color=red]olRec
olConItems Nothing
olItem Nothing
olCalenderItems Empty値[/color]
ユーザーフォームで選択した人(ComboBox1)をselectedNameに格納してる部分がうまく動かないようです。(※selectedNameではなくメールアドレスを直接入れると登録されます。)
コードに何か足りないか順番がおかしいのか教えていただいたサイト等参考にしながら試行錯誤していましたがうまく行かず… アドバイスをお願いしたいです。
|
|
|
|
投稿日時: 25/07/27 17:48:40
投稿者: Suzu
|
|---|---|
引用: 引用: この登録することができたときの、selectedName には、何を渡していたのですか? "Aさん"? それとも、"〇〇@outlook.jp"? 格納している部分がうまく動かない との事ですか、どうなるのが理想でしょうか? コンボボックスとの事ですので、そのコンボボックスの中身は 列が複数列になっていて 1列目:Aさん、Bさん、Cさん 2列目:Asan、Bsan、Csan の様に、複数列になっており、2列目の値を取得したいという事? なのであれば、ComboBox1 の「BoundColumn」プロパティーを『2』にすれば Asan、Bsann を ComboBox1.Valueプロパティーにて取得する事が可能です。 しかしながら、上記推測が正とすると selectedName = "Asan" となり、 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
の 条件分岐における比較内容が意味をなさなくなります。 上記2つを踏まえ推測をすると、テストでは、 Set olRec = olNamespace.CreateRecipient(selectedName) の部分では Set olRec = olNamespace.CreateRecipient("〇〇@outlook.jp") となる様に、selectedName に、メールアドレスを渡していたという事でしょうか? そうなのであれば、コード処理順として 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 の後で、 Set olRec = olNamespace.CreateRecipient(emailAddress) が実行される様にすれば良いでしょう。 引用:については、 Set olRec = olNamespace.CreateRecipient(selectedName) ローカルウィンドでは olRec の左に 「+」があります。そこを開くと中身が確認できます。 多分、Address プロパティーが、"" であり、Index も 0 だと思います。 Aさん のデータをExchange サーバーから取得できてない状態だと思われます。 この状態で、次の Set olFolder = olNamespace.GetShareDefaultFolder(olRec, olFolderCalendar) では、GetShareDefaultFolderメソッドにて、olRec を引数として渡していますから、 olRec が正しく参照できていないので、この行でエラーとなっているはず。 ここで止まっているので、olFolder は Nothing であり 停止している。 停止していて、次の行 Set colConItems = 〜 が実行されていないので、 colConItems も Nothing のまま。 という状態だと思われます。 ご自身で、希望の動作について、思い描いている内容と、実際の動作について違っていて その中身について、ローカルウィンドで調べるまではできていらっしゃる。 とても素晴らしいです。 そこを、質問する上では、実際の希望 の内容まで示して頂けないと、 回答者は予測して回答する事になり、その予測が外れると徒労で終わってしまうので そこまで提示頂けるとありがたいです。 (その予測を外さないのが回答者の手腕にもなるのですが・・) |
|
|
|
投稿日時: 25/07/27 17:58:24
投稿者: Suzu
|
|---|---|
|
推定した部分を踏まえ、コード全体の処理流れも考慮すると
Private Sub CommandButton1_Click()
Dim olApp As Outlook.Application
Dim olNamespace As Outlook.Namespace
Dim olFolder As Outlook.Folder
Dim olRec As Outlook.Recipient
Dim olConItems As Outlook.Items
Dim olItem As Outlook.AppointmentItem
Dim rc As Long 'String MsoBoxの戻り値は、Long型
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"
'順番移動
'ここの変数に何が入ってほしいのかにより
'以下 Select Case 〜 End Select の処理内容変わる
selectedName = Me.ComboBox1.Value
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
'以前の流れだと、No だった場合
' ・作成したオブジェクトは全て無駄になる
' ・コードの途中でユーザーの反応を待つのは、好ましくない
' ので、先にユーザー反応を得てから オブジェクト生成を行う様にする
rc = MsgBox("予定表へ登録しますか?", vbYesNo + vbQuestion, "確認")
If rc = vbYes Then
'順番移動ここまで
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
Set olNamespace = olApp.GetNamespace("MAPI")
Set olRec = olNamespace.CreateRecipient(emailAddress)
Set olFolder = olNamespace.GetShareDefaultFolder(olRec, olFolderCalendar)
Set olConItems = olFolder.Items
' どこにも使っていないので不要、宣言もされていない
' Set olAppointment = olApp.CreateItem(olAppointmentItem)
Set olItem = olConItems.Add()
With olItem
.Subject = Me.ComboBox2.Text & "の予定"
.Body = Me.ComboBox2.Text
.Start = Me.ComboBox3.Text & " " & Me.ComboBox4.Text
.End = Me.ComboBox3.Text & " " & Me.ComboBox5.Text
.Save
End With
End If
'各オブジェクト変数後始末
Set olItem = Nothing
Set olConItems = Nothing
Set olFolder = Nothing
Set olRec = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
End Sub
selectedName を コンボボックスにて取得していますから、 コンボボックスの 2列目以降に メールアドレスを表示するようにすれば 先に述べた「BoundColumn」を変える事により、コンボボックスの選択値から 直接 メールアドレスを取得できますから、Select Case 部分は不要になります。 実行ベースのコードでは、この他に ・コンボボックスの値に空白が入っていたら中止 ・olRec の 取得で、正しいオブジェクトが取得できているかの判定 は入れておいた方が良いでしょう。 |
|
|
|
投稿日時: 25/07/27 22:39:46
投稿者: miyuukate
|
|---|---|
|
詳しいアドバイスいただきましてありがとうございます。
引用: 登録ができたときはコンボボックスを使用せず、 Set olRec = olNamespace.CreateRecipient("〇〇@outlook.jp")としていました。 全般的に質問の記載内容がわかりにくくて申し訳ありませんでした。 にもかかわらず適格なアドバイスをいただきありがとうございます。 ComboBox1=selectedNameという考えにずっと捉われていて、 Set olRec = olNamespace.CreateRecipient(selectedName)を(emailadress)とする発想に辿り着ませんでした。質問してほんと良かったです。 olRecで正しく参照ができていないのでその後のolFolder,olConItems等が入らない理由も納得いたしました。 引用: 引用: 全く知らなかったのでSelect Caseを使用しなくてもできる方法があるということ…とても勉強になります。できるだけシンプルにしたいのでこの部分は変更してみようと思います。 まだ解決済みとしていませんが、Outlookが職場のexchange経由のものを使用するので、明日実際に職場で修正した部分が希望通りに動くか試してみます。そのうえで再度こちらに投稿したいと思います。 |
|
|
|
投稿日時: 25/07/28 20:09:04
投稿者: miyuukate
|
|---|---|
|
無事に希望通り、ComboBoxで選択した人のOutlook予定表に予定を登録することができました!
|
|



