プロが教えるわが家の防犯対策術!

TODO管理でoutlookでメールを送るVBAなんですが、2016では問題ないのに2013ではコンパイルエラー 「コンパイルエラー :ユーザ定義型は定義されていません」が表示されます。
2016で作成したのが問題かと思い2013で作り直してみましたが結果は同じです。何が問題でしょうか?
VBAは
シート1が
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRange As Range
Set myRange = Sheet1.ListObjects(1).ListColumns("ステータス").DataBodyRange
Dim r As Range
For Each r In Target
If Not Intersect(myRange, r) Is Nothing And r.Value = "完了" Then
Call ToDo完了メール送信(r.row)
End If
Next r
End Sub

標準モジュールは
Public Enum e
no = 1
記入日
タスク
期限
ステータス
End Enum
Sub ToDo完了メール送信(ByVal row As Long)

'各要素の作成
With Sheet1
Dim myNo As Long: myNo = .Cells(row, e.no).Value
Dim myTask As String: myTask = .Cells(row, e.タスク).Value
End With
Const MY_TO As String = "aaaaaa@yahoo.com"
Const RECIPIENT As String = "株式会社ABC"
Dim mySubject As String
mySubject = mySubject & "タスク完了メール: [" & myNo & "] " & myTask
Dim myBody As String: myBody = ""
myBody = myBody & RECIPIENT & "<br>"
myBody = myBody & "以下のタスクが完了しました<br>"
myBody = myBody & "[" & myNo & "] " & myTask
'メールの送信
Dim olApp As Outlook.Application: Set olApp = New Outlook.Application
Dim myMail As MailItem: Set myMail = olApp.CreateItem(olMailItem)
With myMail
.To = MY_TO
.Subject = mySubject
.Display
.HTMLBody = myBody & .HTMLBody
.Send
End With
End Sub

以上です!
わかる方よろしくお願いします。初心者なのでできればわかりやすくお願いします。

質問者からの補足コメント

  • 早速ご回答ありがとうございます。ご指摘の通り自身で作成したVBAではありません。参照設定については15.0に変更してやってみましたが同じ状況です。
    コンパイルエラーが出ると
    デバックで「Sub ToDo満了メール送信(ByVal row As Long)」が黄色く反転し
    「Dim olApp As Outlook.Application: Set olApp = New Outlook.Application」が青く反転します。
    いろいろネットで検索してもなかなか解決策が見つけられない状態です。
    何か解決策ありませんか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2019/07/22 06:12

A 回答 (3件)

どちらも所持していない(2007以降を持ってない)ので関係ないかも知れませんけど。



そのエラー箇所がどこで起きるのかわかりませんが、2013では無くてそれ以降に追加された関数等なのでは?
エラー箇所の関数を2013のオブジェクトブラウザで見つかるかどうかを調べてみては?

あとはテストPCの環境の違い(ソフトの有無など)とか?
    • good
    • 0
この回答へのお礼

何とか解決することができました。ありがとうございました。

お礼日時:2019/07/24 11:59

これで、初心者のコードだからと言われたら、私など回答者の立つ瀬がありません。

ご自身が作られたコードではありませんね。

要するに、そのエラーは、バージョンには関係がなく、
Dim olApp As Outlook.Application: Set olApp = New Outlook.Application
こういう書き方は、分かっている人が書くコードです。

参照設定の Microsoft Outlook が、おそらく登録されていないだけのことだと思います。

ツール-->参照設定
後は、Microsoft Outlook 15.0 Object Library
にチェックを入れてあるのか確認してください。以下は、Office 2016ですが、2013に読み替えてください。だめだったら、その旨を補足にでもしてください。
「excel2016では問題ないのがexc」の回答画像2
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。自分でもいろいろとテキストを購入しながら解決策を探しておりましたが、一つの原因としてMicrosoft Outlook 16.0 Object Library が2013には無いのでMicrosoft Outlook 15.0 Object Library に2013で変更する必要がありました。
あと単純なテキストミスがありました。
Sub ToDo完了メール送信(ByVal row As Long)

'各要素の作成
With Sheet1
Dim myNo As Long: myNo = .Cells(row, e.no).Value
Dim myTask As String: myTask = .Cells(row, e.タスク).Value

Sub ToDo完了メール送信(ByVal row As String)

'各要素の作成
With Sheet1
Dim myNo As String: myNo = .Cells(row, e.no).Value
Dim myTask As String: myTask = .Cells(row, e.タスク).Value
に変更してないということが分かりました。

ほんと最近VBAを始めたばかりなので、基本がわからず色々勉強しています。VBAは奥が深いですね。
またわからないことがありましたら、ここで質問させていただきますのでよろしくお願いいたします。

お礼日時:2019/07/24 11:57

>解決策が見つけられない状態です。


気になる部分がいくつかあるのですが、ひどく凝った内容だと思います。

ご質問の文面の中で不明な部分があります。
お使いのOutlook のバージョンはどちらでしょうか。まさか、Office 2016と2013 は混在していている場合でも、Outlook はひとつしかありません。2つのアプリが存在できません。

ひとつ試してみたいのは、

Dim olApp
の後、As を入れ、O と入れたら、"Outlook...." とインテリセンスが働きますでしょうか。

それがだめでしたら、

 Dim olApp As Object: Set olApp = CreateObject("Outlook.Application")

と書き換えてください。
    • good
    • 0
この回答へのお礼

いろいろアドバイスありがとうございました。

お礼日時:2019/07/24 11:59

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