VBA コードは 1 つのシートで動作し、別のシートでは定義されていないユーザー定義型を返します。

VBA コードは 1 つのシートで動作し、別のシートでは定義されていないユーザー定義型を返します。

私は、かなりの時間を節約できるコードを作成中です。これは、ベンダーに同じ品目の見積もりを依頼するための複数の電子メールを作成するためのものです。

シート 1 には、ベンダー データ (名前、電子メール、およびベンダーにリクエストを送信するかどうかを示すマーク) があります。シート 2 には、必要な見積もりの​​詳細があります。これのさらに興味深い点は、テスト/改良した 1 つのワークシートでは機能するが、ホーム シートでは機能しないことです。情報を新しいシートにコピーしようとしましたが、同じエラーが発生します。原因はわかりません。

Public Sub RequestShippingQuote()
    Dim objOutlook As Outlook.Application
    Dim objMail As Outlook.MailItem
    Dim lCounter As Long
    Set objOutlook = Outlook.Application 'Set Objects
    Dim OutAccount As Outlook.Account
    Set OutAccount = objOutlook.Session.Accounts.Item(4)
    Dim mymsg As String
    For lCounter = 2 To 100
        If IsEmpty(Sheet1.Range("C" & lCounter).Value) = True Then 'Email if False
        Else
            Set objMail = objOutlook.CreateItem(olMailItem)
            objMail.To = Sheet1.Range("C" & lCounter).Value 'To
            objMail.Subject = "Quote Request" 'Subject
            mymsg = "Hello," & vbCrLf
            mymsg = mymsg & "Please provide freight quote for the following:" & vbCrLf
            mymsg = mymsg & "Commodity: " & Sheet2.Range("B7").Value & vbCrLf
            mymsg = mymsg & "" & Sheet2.Range("B9").Value & " info is as follows:" & vbCrLf
            mymsg = mymsg & "" & Sheet2.Range("B13").Value & " " & Sheet2.Range("B9").Value & vbCrLf
            mymsg = mymsg & "  " & Sheet2.Range("B18").Value & " W x " & Sheet2.Range("B19").Value & " L x " & Sheet2.Range("B20").Value & " H x " & vbCrLf
            mymsg = mymsg & "  " & Sheet2.Range("B15").Value & " lbs" & vbCrLf
            mymsg = mymsg & "From: " & vbNewLine & Sheet2.Range("B26").Value & vbCrLf
            mymsg = mymsg & "" & Sheet2.Range("B28").Value & vbCrLf & vbCrLf
            mymsg = mymsg & "" & Sheet2.Range("B30").Value & vbCrLf
            mymsg = mymsg & "" & Sheet2.Range("B32").Value & vbCrLf
            mymsg = mymsg & "" & Sheet2.Range("B34").Value & vbCrLf & vbCrLf
            mymsg = mymsg & "Pickup Hours: " & Sheet2.Range("B36").Value & vbCrLf & vbCrLf
            mymsg = mymsg & "Notes:" & vbNewLine & Sheet2.Range("B38").Value & vbCrLf
            mymsg = mymsg & "To:" & vbNewLine & Sheet2.Range("B41").Value & vbCrLf
            mymsg = mymsg & "" & Sheet2.Range("B43").Value & vbCrLf
            mymsg = mymsg & "Notes: " & vbNewLine & Sheet2.Range("B53").Value & vbNewLine & Sheet2.Range("B54").Value 'Email Body
            objMail.Body = mymsg

            'objMail.Close (olSave) 'Draft Email
            objMail.Display 'Display Email

            Set objMail = Nothing 'Close the object
    End If
    Next 'May need to be in the if statement, not sure
    MsgBox "Done", vbInformation
End Sub

このコードを実行しようとすると、「コンパイル エラー: ユーザー定義型が定義されていません。」というメッセージが表示されます。

ご協力いただければ幸いです。

答え1

OPTION EXPLICIT を有効にしていた場合、VBA は「olMailItem」などの変数の宣言に失敗したことを通知します。

これを見つけたときに停止しましたが、宣言されていない他の変数も存在する可能性があります。

答え2

あるシートでは意図したとおりに動作するのに、他のシートでは動作しない理由がわかりました。

私がテストした 1 つのシートでは、これを開発しようとしていたシートではアクティブではなかったライブラリがアクティブになっていました。各シートで他のシートとは別にライブラリをアクティブにする必要があることに気付かず、それがグローバル設定だと思っていました。

答えは、ツール > 参照 > Microsoft Outlook xx.x オブジェクト ライブラリのアクティブ化です。

今は意図したとおりに動作します。

関連情報