大人になっても苦手な食べ物、ありますか?

いつも助けけていただいております。エクセル2013とエクセル2019を2台のPCで使い分けるために,
参照設定を,Workbook_Open() のサブの中で,エクセルのバージョンを確認したうえで,
2013と2019に応じて,「Outlook 15.0 Object Library」と「Outlook 16.0 Object Library」
の参照設定をSETしています。また,Workbook_BeforeClose()でその都度,参照を外し
ています。
今までは,問題なく使えてましたが,ユーザーフォームに,

Dim WithEvents mySentItems As Items

を使ったイベント処理を付け加えましたが,ここでエラーがでるようになりました。
原因は,参照設定のSETが終わらないうちに,ここが実行されるのが原因のようで,
参照設定でOutlook 1*.0 Object Libraryの項目にチェックが入りません。

このエラーをエラーを回避できる方法をアドバイスいただければありがたいです。
よろしくお願いいたします。

A 回答 (2件)

ご質問の趣旨をくみ取れなかったようですみません。


鶏が先か玉子が先か・・・

残念ですがお力になれそうもありません。
モーグさんでお尋ねになっては?
https://www.moug.net/
    • good
    • 0
この回答へのお礼

たびたびのご回答ありがとうございます。
モーグさんのご紹介もありがとうございます。

質問の仕方も,適切でなかったようなので,
質問方法を見直してみたいです。
マルチポストは,避けたいので,受付終了後,見てみたいと思います。

ありがとうございました。

お礼日時:2024/10/17 08:47

質問されてから時間がたっているので、もう用済みかもしれませんが


私だったら参照設定なしで考えるかなと。
以前(かなり前)にMS社のサイトにあったをチョッチ改変したものです。

Sub OutLookMailNoRef()
Const olMailItem As Integer = 0
Dim oOL As Object
Dim oDT As Object
Dim oAC As Object
Dim oACs As Object

Set oOL = CreateObject("Outlook.Application")
Set oDT = oOL.CreateItem(olMailItem)
Set oACs = oOL.Session.Accounts

For Each oAC In oACs 'oOL.Session.Accounts
'If oAccount.AccountType = olPop3 Then
If oAC.DisplayName = "Somebody跡example.jp" Then
With oDT
Set .SendUsingAccount = oAC '参照設定バージョンと比較
.Subject = "試験発信"
'oMail.Recipients.Add ("Somebody")
'oMail.Recipients.ResolveAll '←↑名前で指定
.To = "Somebody跡example.jp"
.cc = ""
.BCC = ""
.body = "------------------ " & Now
'.Attachments.Add '(添付ファイルをフルパス指定)"d:\t.txt"
.Display 'ユーザーにコントロールを渡す
'oDT.Send
End With

End If
Next

' If MsgBox("送信しますか?", vbOKCancel, "確認") = vbCancel Then
' GoTo EndProcess
' End If

'Office2010では送信フォルダに蓄積されるのではなく、即時送信可
'ただし、OutLook が立ち上がっていないとダメ
'oDT.send

'### 完了メッセージを表示、エラーの場合は?
MsgBox "送信完了です", vbInformation, "完了"

EndProcess:
Set oDT = Nothing: Set oOL = Nothing

End Sub

'Sub OutLookMailWithRef() ’MS社に有ったありバージョン
''http://msdn.microsoft.com/en-us/library/office/b …
' Dim oOL As Outlook.Application
' Dim oAC As Outlook.account
'
' Set oOL = New Outlook.Application
'
' For Each oAC In oOL.Session.Accounts
'
' 'If oAc.AccountType = olPop3 Then
' If oAC.DisplayName = "Somebody跡example.jp" Then
' Dim oMail As Outlook.MailItem
' Set oMail = oOL.CreateItem(olMailItem)
' oMail.Subject = "Sent using POP3 Account"
'' oMail.Recipients.Add ("Somebody跡example.jp")
'' oMail.Recipients.ResolveAll
' oMail.SendUsingAccount = oAC 'こっちはSET 不要
' oMail.Display
' 'oMail.Send
' End If
' Next
'End Sub
とか、

Excel VBAでOutlookメールを送る3
https://powervbadesktop.com/outlook3/
でどうでしょうかね?

現状の方向で行くなら・・・、
以下は未検証です。無駄骨かもしれません。
参照設定の変更は出来ているようなので
それをFunctionモジュールにして
Function SetRef()As Boolean
On Error goto ErrH

SetRef=true
Exit function
ErrH:
SetRef=False
End Function
で、Workbook_OpenSubモジュール中に
Dim i As Integer
Do Until SetRef=true
i=i+1
DoEvents
Sleep 500 '500ミリ秒待機
if 1>5 then '5回失敗したら諦める
Exit Sub
End If
※Sleep はWindows APIを使用しているので
標準モジュールの宣言部に
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

※ここのサイトはタブインデントが効かないので見づらくてゴメン。
「跡」はメアドチェックに引っかからないようにしてるので「@」に読み替えを。
繰り返しになりますが参照設定なしをお勧めしたい。
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。
ただ,ご回答いただいた内容は,私がお聞きしたことと多少違いがあるような気がします。
メールの送受信は,参照設定で,問題なく行えてます。

私がやりたかったのは,あるHPを参考にしましたが,

メールが送信済みアイテムに格納されたタイミングで実行される ItemAdd イベント取得するのに

mySentItems_ItemAdd(ByVal Item As Object)

のイベント処理をしたかったのです。そのために,

Dim WithEvents mySentItems As Items

を付け加えましたが,この一文を加えると,エクセルのファイルを開いた段階で,この部分でエラーになります。
もちろん,事前に,参照設定にチェックを入れておくと,エラーにはなりません。

Workbook_Open()の中で,参照設定のセットをしていますが,
このWorkbook_Open()内の処理が行われる前に,エラーチェックされるようで,参照設定がセットされずエラーになります。
このこのあたりの,エクセルが立ち上がり時に,VBAが実行されるまでの,機序というか,順番等アドバイスがいただただければと思ったのですが,いかがでしょうか。

お礼日時:2024/10/16 11:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A