エクセルVBAでメール本文中に画像を挿入する方法

このQ&Aのポイント
  • エクセルVBAを使ってアウトルックメールにてメール送信するマクロを作成しています。
  • 本文中に画像を挿入する方法を調べていますが、添付ファイルではなく、本文と本文の間に画像を差し込む方法がわかりません。
  • メール送信先、本文は同じエクセルのContentsシートにあり、画像はPictシートに格納されています。
回答を見る
  • ベストアンサー

エクセルVBAでメール本文中に画像を挿入する方法

エクセルVBAを使ってアウトルックメールにてメール送信するマクロを作っています。 本文中に画像を挿入する方法をググってますがなかなか出てきません。添付ファイルではなく、本文と本文の間に画像を差し込むイメージです。 メール送信先、本文は同じエクセルのContentsシート、画像はPictシートに格納しています。 Option Explicit Sub SendMail_HTML() Dim contents As Worksheet Dim maillist As Worksheet Dim mailaddress As String, honbun1 As String, honbun2 As String, mailbody As String, strstyle As String Dim i As Long Set contents = ThisWorkbook.Worksheets("Contents") Set maillist = ThisWorkbook.Worksheets("List") ' Picture Dim pict_sheet As Worksheet Set pict_sheet = ThisWorkbook.Worksheets("pict_sheet") 'プログラム3|Outlookアプリケーションを起動 Dim outlookObj As Outlook.Application Dim myMail As Outlook.MailItem Set outlookObj = CreateObject("Outlook.Application") For i = 2 To 3 ' Email and name setting from Content Sheet client_name = maillist.Range("B" & i).Value mailaddress = maillist.Range("C" & i).Value Set myMail = outlookObj.CreateItem(olMailItem) 'Mail content setting myMail.BodyFormat = 2 myMail.To = mailaddress myMail.Subject = contents.Range("B3").Value honbun1 = Replace(contents.Range("B6").Value, vbLf, "<br>") Dim insp As Outlook.Inspector Set insp = myMail.GetInspector If insp.EditorType = olEditorWord Then Dim doc As Word.Document 'Microsoft Wordを参照 Set doc = insp.WordEditor Dim wrange As Word.Range Set wrange = doc.Range(0, 0) 'カーソルを先頭に 'wrange.Text = honbun1 wrange.MoveEnd Word.WdUnits.wdStory 'カーソルを最後に wrange.Start = wrange.End pict_sheet.Shapes("pict1").Copy 'Pict sheetに入っているpict1を指定 wrange.Paste End If honbun2 = Replace(contents.Range("B8").Value, vbLf, "<br>") myMail.HTMLBody = honbun1 & hoonbun2 myMail.Display 'Send mail 'mymail.Display 'メール表示(ここでは誤送信を防ぐために表示だけにして、メール送信はしない) myMail.Save '下書き保存 myMail.Send maillist.Range("D" & i).Value = "Sent:" & Now() ' Release object Set myMail = Nothing Next 'プログラム12|オブジェクト解放 Set myMail = Nothing Set outlookObj = Nothing End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1614/2453)
回答No.2

エクセルでBase64エンコードしてメールデータにつけるのは難しいような気もしますので OutlookのVBAでエクセルを操作する方法はいかがでしょう。 【Outlook VBA】メール本文にExcelの画像を挿入し作成/送信する方法! http://extan.jp/?p=6803

その他の回答 (2)

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.3

メールは、拡張仕様として「マルチパートメール」がサポートされています。 マルチパートとは、本文を複数のパートに分け、それぞれのパートに「バイナリ」や「テキスト」を置く事が出来ます。 補足にある Content-Type: application/octet-stream; は、「このパートがバイナリデータである」と指示しています。 name="image001.emz" は「このパートの名前」を指定しています。 Content-Description: image001.emz は、このパートの説明です。 Content-Disposition: inline; は、このパートをインラインにする(文字の中に配置する)という指定です。 filename="image001.emz"; は、このパートを保存する際のファイル名を指定しています Content-Transfer-Encoding: base64 というのは「このパートは、バイナリを『base64』という変換方法でテキスト化しています」という指示です。 このようにマルチパートで記述すると「テキスト、画像、テキスト」のように、本文の途中に画像などを置く(厳密には、画像含めて全てが本文、ですが)事が可能です。 なお、途中に画像を入れる場合でも、添付する場合でも「すべてテキストに変換して送信しないとならない」ので、送信前に「自分でbase64などでテキストに変換してメール本文に書き込む」必要があります。 つまり「バイナリデータを(無変換で)メールに挿入出来ない」のです(1つ前の回答の「バイナリは入れられない」は、そう言う意味です) 「マルチパートメールの作り方」や「base64のエンコード方法」でググると、貴方のやりたい事の答えが出てきます。

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.1

メールプロトコルで送受信出来る物は、仕様上「テキストだけ」です。 「添付すれば画像や他の物も」と思うかも知れませんが、実は「バイナリデータをテキストデータ(文字列)に変換して、テキストとして送っている」のです。 なので、HTML形式のメールであっても「本文中に画像などのバイナリデータを挿入する事は不可能」なのです。 しかし「本文中に画像が挿入されているメールを良く見る」と思います。 あれは「バイナリデータを挿入している」のではなく「HTMLのIMGタグを挿入して、どこかのホームページに置いてある画像を引用しているだけ」なのです。 画像を表示するIMGタグも、実態は「画像のURLだけが書かれたテキスト(文字列)」なので、本文中の何処にでも設置できます。 そういう訳で「バイナリデータを直に埋め込む事は不可能」なので、当然、ググっても出てきません。 添付した(テキスト化されてる)画像にアンカーを付けて、そのアンカーを参照するようにURLで指定したIMGタグを本文に埋める事は可能ですが、最近は、そういうメールはセキュリティソフトで非表示にされてしまうので、お勧めできません。

kozy1974
質問者

補足

メールプロトコルに詳しいわけではありませんが、ウェブ上でどこにも置いていない画像をメール本文中に挿入して送ることが出来ています(例:画面のスクリーンショット等)。 実際送ってみた後、メールのソースを確認すると、画像の部分にこのように出ています。画像をURLで指定しているということはありません。 Content-Type: application/octet-stream; name="image001.emz" Content-Description: image001.emz Content-Disposition: inline; filename="image001.emz"; size=7445; creation-date="Thu, 17 Feb 2022 08:30:26 GMT"; modification-date="Thu, 17 Feb 2022 08:30:26 GMT" Content-ID: <image001.emz@01D8241B.76FA9440> Content-Transfer-Encoding: base64 そのため、本文中に画像を埋め込むことは可能だと考えています。

関連するQ&A

  • VBA サンダーバードのメール自動作成

    いつもお世話になってます。 サンダーバードでメールを自動作成しようと思い、回答者さんのアドバイスで以下のコードを 作成しました。 【仕様】 sheet2のA列に、メールの宛先と本文の文字列が下方向に並んでおり、ループしながら宛先と本文を新規メールに送っていく。 Dim sPath As String Dim Mailad As String Dim Subjct As String Dim Bodyst As String Do Until Sheets("sheet2").Range("J" & cnt).Value = syuryono + 1 If Sheets("sheet2").Range("I" & cnt).Value = "アドレス" Then 'メルアドを取得 meruado = Sheets("sheet2").Range("A" & cnt).Value cnt = cnt + 1 'メルアドから下の行を本文として取得 honbun = "" Do honbun = honbun & Sheets("sheet2").Range("A" & cnt).Value honbun = honbun & "%0a" cnt = cnt + 1 Loop Until Sheets("sheet2").Range("I" & cnt - 1).Value = "エンド" '文字数カウント a = Len(honbun) 'メール作成 sPath = """C:\Program Files\Mozilla Thunderbird\thunderbird.exe"" -compose " Mailad = meruado Subjct = Sheets("説明").Range("A7").Value Bodyst = honbun Shell sPath & "to=" & Mailad & "," & _ "subject=""" & Subjct & """," & _ "body=""" & Bodyst & """" Else cnt = cnt + 1 End If Loop で、質問なんですが、 'メルアドから下の行を本文として取得 honbun = "" Do honbun = honbun & Sheets("sheet2").Range("A" & cnt).Value honbun = honbun & "%0a" cnt = cnt + 1 Loop Until Sheets("sheet2").Range("I" & cnt - 1).Value = "エンド" 上記の部分で本文を作っていくときに、本文中に「,」が入っていると、そこで本文が途切れてしまいます。 例えば、A2セルに「りんご」A3セルに「みかん」とある場合、変数honbunは「りんご%0aみかん」となり メール本文は「りんご(改行)みかん」となりますが、A2セルが「りんご」A3セルが「み,かん」の場合 メール本文が「りんご(改行)み」で終わってしまいます。 正規表現?的な文字が入っていると、メーラーのbodyに渡す時に途切れちゃうのかなという感じです。 変数honbunに入っている文字列はすべてただの文字列とし、上記の例の場合にメールが途中で 途切れないようにする方法はありますでしょうか?

  • VBAでエクセルの文をメールに転記

    当方エクセル2016使用しています。 エクセルのVBAで、outlookのメールを自動作成したいです。 エクセルの E2に宛先 E3に件名 E4~E6に本文が入っており、 下記VBAでoutlookに各データが入る様にはできました。 しかしエクセルでは文字のサイズや色が異なっているものが、 outlook本文に反映されません。 (1行単位だったり、文字単位だったりでサイズや色が異なる) エクセルに表示されているそのままを outlook本文に表示させるにはどうしたら良いでしょうか。 ******************************** Sub Macro1() Dim toaddress As String Dim subject As String Dim mailbody As String Dim outlookObj As outlook.Application Dim mailItemObj As outlook.mailItem toaddress = Range("E2").Value subject = Range("E3").Value mailbody = Range("E4").Value mailbody = mailbody & vbCrLf & Range("E5").Value mailbody = mailbody & vbCrLf & Range("E6").Value Set outlookObj = CreateObject("Outlook.Application") Set mailItemObj = outlookObj.CreateItem(olMailItem) mailItemObj.BodyFormat = olFormatHTML mailItemObj.To = toaddress mailItemObj.subject = subject mailItemObj.body = mailbody mailItemObj.display Set outlookObj = Nothing Set mailItemObj = Nothing End Sub

  • Excel VBA Outlook送信済メール削除

    お世話になります。 現在、Excel VBA(Excel2010)で、Outlook2010を立ち上げて、添付のExcelの表のE列【GL承認日】に日付を入れると、日付書式を確認して、メールが送信されるVBAを作成しています。 そこで、下記のVBAの下の方にある「myMail.Send」でメールが送信されるようになっていて、メールが送信された後、Outlookの【送信済みフォルダ】に送信済みメールが入ります。 その送信済みメールを【送信済みフォルダ】に入ったら、完全に削除するようにしたいのですが、どのようにVBAを追加すれば宜しいでしょうか? ご存知の方、是非ご教示宜しくお願い致します。 ↓該当のExcel VBAです。 ---------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim myOL As Object Dim myMail As Object Dim myBody As String Dim n As Long Dim mDate As Variant On Error Resume Next 'GL承認日の列の日付書式指定 mDate = Array("yyyy/mm/dd") 'GL承認日の該当セルの日付書式を確認 For Each wz In mDate 'GL承認日の該当セルが空白でない場合は以下を処理 If Cells(Target.Row, Target.Column).Value <> "" Then If InStr(Cells(Target.Row, Target.Column).NumberFormatLocal, wz) > 0 Then 'メールアプリケーションをOutlookに指定 Set myOL = GetObject(, "Outlook.Application") On Error GoTo 0 If myOL Is Nothing Then Set myOL = CreateObject("Outlook.Application") myOL.getnamespace("MAPI").GetDefaultfFolder(6).display End If Set myMail = myOL.CreateItem(0) 'B、C行のセル位置を数値で取得 n = Cells(Target.Row, Target.Column).Row 'メール本文 myBody = "振替伝票入力のGL承認が " & Format(Cells(Target.Row, Target.Column).Value, "yyyy/mm/dd") _ & " に完了しました。" & vbNewLine & vbNewLine _ & "●振替伝票No: " & Range("C" & n).Value & vbNewLine & vbNewLine _ & "================================" & vbNewLine _ & " ▲▲部 ××グループ" & vbNewLine _ & "================================" If Range("B" & n).Value = "ooo" Then myMail.to = "ooo@***.co.jp" 'ElseIf Range("B" & n).Value = "qqq" Then ' myMail.To = "qqq@***.co.jp" End If 'メールのタイトル、本文、本文の形式を指定 myMail.Subject = "【振替伝票 GL承認完了通知】" myMail.Body = myBody myMail.BodyFormat = 1 'テキスト形式 'メールを送信 myMail.Send        (↑此処でメールが【送信済みフォルダ】に入りますが、このタイミングで【送信済みフォルダ】に入ったメールを完全削除したいです。) '変数をリセット Set myMail = Nothing Set myOL = Nothing Else Exit Sub End If End If Next Exit Sub End Sub

  • マクロ Outlook送信メールにエクセルの表を貼り付ける方法

    こんにちは。 送りたいメールの形は 数行の文章のあとに、表を貼り付け、また数行の文章という形式です。 Outlookメールでメールを立ち上げて Comment1と2は文章ですのでエクセルのコラムを引っ張ってくるようにしているのですが、 Comment3部分に別のエクセルにある表をメタ貼りし、Comment4でまた文書を引っ張ってくるとさせたいのですが Comment3部分の動きが出来ません。 Dim OlApp As Outlook.Application Dim mItem As Outlook.MailItem Dim cell As Range Dim Subj As String Dim EmailAddr As String Dim Recipient As String Dim Msg As String Dim Message As String Dim Sender As String Dim Comments As String Dim Comments2 As String Dim report As String '日付の設定 DMY = Range("b_date") DM = Format(Range("b_date").Value, "mmdd") Worksheets("mail").Activate 'Create Outlook object Set OutlookApp = New Outlook.Application 'Get the data Subj = Range("B69") & "_" & DM EmailAddr = Range("B63") CCAddr = Range("B66") Comment1 = Range("H63").Value Comment2 = Range("H65").Value Comment3 = この辺りがわかりません Comment4 =Range("H67").Value 'Compose message Msg = "<font face=""Arial""><font size=2>" Msg = Msg & Comment1 & "<BR><BR><BR>" Msg = Msg & Comment2 & "<BR><BR><BR>" Msg = Msg & Comment3 & "<BR><BR><BR>" Msg = Comment4 & "<BR><BR><BR><BR>" Msg = Msg & "Best regards," & "<BR><BR>" Msg = Msg & "</font></font>" 'Create Mail Item Set mItem = OutlookApp.CreateItem(olMailItem) With mItem .To = EmailAddr .CC = CCAddr .BCC = BCCAddr .Subject = Subj .HTMLBody = Msg .Display End With End Sub どなたかご存知ではないでしょうか? 毎回で申し訳ございませんが、どうぞ宜しくお願い致します。

  • Excel VBAでセルに書いた時刻を取得したいのに・・・

    ExcelのVBAで、OnTimeを使い、 定時に印刷させるプログラムを組んでいます。 今までOnTimeの時刻設定に直接時刻を入れ込んでいたのですが、 ワークシートに登録した時刻を使うようにしたいと思い、 次のようにしたのですが、 Setのところの変数名で「オブジェクトが必要です」エラーが出ます。 ・・・何が悪いのでしょうか? Dim routinetime1 As String Dim routinetime2 As String Dim routinetime3 As String Set routinetime1 = Range("A1").Value Set routinetime2 = Range("B2").Value Set routinetime3 = Range("C3").Value Application.OnTime TimeValue(routinetime1), "印刷プロシージャ" Application.OnTime TimeValue(routinetime2), "印刷プロシージャ" Application.OnTime TimeValue(routinetime3), "印刷プロシージャ" よろしくお願いいたします。

  • メール本文に段落を設ける。

    OUTLOOKのSENDメソッドを使って、メールを自動送信する際、次の構文では、本文がだらだらするので、段落を設けたいのですがどのようにすればいいか教えて下さい。 Dim AAA, BBB, CCC As Object Set AAA = CreateObject("OUTLOOK.APPLICATION") Set BBB = AAA.CREATEITEM(OLMAILITEM) BBB.To = "宛先" BBB.Subject = "用件名" BBB.BODY = Range("I2").Value & " " & Range("I3").Value & " " & Range("I4").Value & " " & Range("I5").Value & " " & Range("I6").Value Set CCC = BBB.ATTACHMENTS CCC.Add "添付ファイル名" BBB.SEND Set BBB = Nothing Set CCC = Nothing Set AAA = Nothing

  • Excelマクロでメールを送る時

    いつもお世話になっております。 EXCELで、ワークシートのある部分に"MAILADDRESS"という名前を付け、 そこにメールアドレスを入れます。 同じブック内の別ワークシートをcsv形式で保存して、"MAILADDRESS"に入力されている メールアドレスにおくるというVBAの命令を書いて下記の通りとしてみました。 プログラムはエラーの表示がされず終わるのですが、メールを送ってくれません。 何故でしょうか?教えて下さい。 MAILADDRESSのセルはデータの最後に"EOL"という文字列を入力しています。 Dim R As Range For Each R In Range("MAILADDRESS") If R.Value <> "EOL" Then ActiveWorkbook.SendMail Recipients:=R.Value End If Next R Excelのバージョンは2002 SP3です。

  • ExcelのVBAについて(勉強中のです。)

    ExcelのVBAについて(勉強中のです。) ここからコード3以降に入力したコードを抜き出してデータ表を作成しそれを保存するコードを作成したいです。例えばCSV形式にするとか? データ表は1日分の表示で、保存して週間や月間または統計データまでを視野にいれています。今回は保存する所です。。 利用しやすい状態と保存形式で、よろしくお願いします。データは生活記録みたいなものです。何したどうしたどうなった? ※大分分岐する予定で、作成中であり、今回はコードの整理は不要です。 '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If Next i '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws1.Activate End Sub

  • VBA エクセル メール送信 ハイパーリンクの貼り方

    お世話になります。 首題の通り、エクセルに記述したマクロを使いメールを送りたいのですが、その際に文章の記述にハイパーリンクを張りたいのです。 例えば下記のモジュールですと、文章のBODYの部分には「OKWAVE」とだけ表示されますが、これをクリックすると[http://okwave.jp/]が開くようにしたいのですが、どのように記述すればよろしいのでしょうか?よろしくご指南くださいませ。 Sub test() Dim strBody As String Filename = "ハイパーリンクの貼り方???" strBody = "OKWAVE" Set myOL = CreateObject("Outlook.Application") Set myMAIL = myOL.CreateItem(0) With myMAIL .to = "123@123.GOM" .Subject = Filename .body = strBody .display '.send End With Set myMAIL = Nothing Set myOL = Nothing End Sub

  • EXCEL、VBAについて

    ' GLOBAL変数の定義 Dim CurrentDir As String '現在のディレクトリ Dim ThisBook As String '現在のブック名 Dim WorkSheetName1 As String Dim WorkSheetName2 As String Dim ConfigSheetName As String Dim ListSheetName1 As String Dim ListSheetName2 As String Dim ListSheetName3 As String Dim ListSheetName4 As String Dim ListSheetName5 As String Dim ListSheetName6 As String Dim ListSheetName7 As String Dim ErrorFlag As Integer 'エラーフラグ 0:正常 1:エラー Sub 初期設定() CurrentDir = ActiveWorkbook.Path '現在のディレクトリ ThisBook = ActiveWorkbook.Name '現在のブック名 WorkSheetName1 = "work1" WorkSheetName2 = "work2" ConfigSheetName = "設定" ListSheetName1 = "****" ListSheetName2 = "****" ListSheetName3 = "****" ListSheetName4 = "****" ListSheetName5 = "****" ListSheetName6 = "****" ListSheetName7 = "****" Application.DisplayAlerts = False 'EXCELの警告を無視する End Sub Sub CSV取り込み() Dim LoadBook As String '読み込みブック名 Dim DataMaxCol As Integer '読み込みデータ有効最大カラム数 Dim WorkStartRow As Integer 'workシート開始行 Dim WorkEndRow As Integer 'workシート終了行 Dim ListMaxCol As Integer '一覧シート有効最大カラム数 Dim ListStartRow As Integer '一覧シート開始行 '初期設定コール Call 初期設定 'workシートをクリア DataMaxCol = Sheets(ConfigSheetName).Range("F2").Value WorkStartRow = Sheets(ConfigSheetName).Range("F3").Value WorkEndRow = Sheets(ConfigSheetName).Range("F4").Value Sheets(WorkSheetName1).Select Range(Cells(WorkStartRow, 1), Cells(WorkEndRow, DataMaxCol)).ClearContents '受注データファイルを選択しオープン SelectedPath = Application.GetOpenFilename("CSVファイル (*.csv), *.csv") If SelectedPath <> "False" Then Workbooks.Open Filename:=(SelectedPath) Else 'キャンセル時は終了 Exit Sub End If LoadBook = ActiveWorkbook.Name '現在のブック名 '受注データの開始行をチェック I = WorkStartRow '受注データの最終行をチェック Do Until ActiveCell.Value = "" I = I + 1 Cells(I, 1).Select Loop WorkEndRow = I - 1 '受注データをコピー Range(Cells(WorkStartRow, 1), Cells(WorkEndRow, DataMaxCol)).Select Selection.Copy 'workシートへペースト Windows(ThisBook).Activate Sheets(WorkSheetName1).Select Range("A1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False '受注データファイルをクローズ Windows(LoadBook).Close End Sub このマクロを実行するとインデックスが有効範囲にありませんとなりエラーとなってしまいます。 あと最後のデータファイルをクローズできればOKなのですが・・。 どこがいけないんでしょうか?

専門家に質問してみよう