選択範囲のセルを画像として保存する
やりたいのはエクセルのセルを画像として保存して、添付ファイルとしてメール送信です。mailItem.bodyには文字列しかセットできないのですが、セルの背景色情報がどうしても知りたいんです。特殊な条件で背景色を変更するようにセットしているからです。考えられる解決策は、① 画像ファイルとして保存して添付する ② HTMLフォーマットで記述してmailItem.HTMLBodyにセットする。今回は画像ファイルとして保存する方法を解説してみたいと思います。
世の中にはいろいろ知恵を絞ってる人がいるようで
mspaint.exeを立ち上げてSendKeys "^v", Trueすればいいじゃないかとか、ワークブックの実体はzipフォーマットなので拡張子を.zipに変えて、中にあるpngファイルを取り出せばいいとか、チャートに貼り付けてExportすれば10行でできるとか。
言うまでもなくチャートオブジェクトに貼り付けてjpgファイルとしてExportに決まりです。しかも、Pasteメソッドもあります。それにしてもチャートにそんなメソッドがあるとか知りませんでした。
デバッグモードでは問題ないが、普通に実行するとPasteが失敗する
xChart.Pasteするとチャートに何もペーストされないというバグでしばらく悩みました。デバッグモードではうまくいくのでさっぱり意味が分かりません。.CopyPictureしたシートにチャートオブジェクトを作らないとダメなのかと思いましたが、関係ありません。DoEventsを入れてみてもダメ。右クリックで出てくるポップアップメニューの貼り付けアイコンのあたりを上下に動かすと画像が出たり消えたりという不審な挙動があって、これがもしかしたら関係しているのかと思いましたが、関係なさそうです。
結局のところ.Selectで解決しました。全くの偶然で適当にやってみたらうまく行っただけの話でした。アクティブではないワークシートのセルを指定しても問題なく実行できるし、まぁ今回はこれでよしとしましょう。
Public Sub savePicture(pFileName As String, pRange As Excel.Range) Dim xChart As Excel.Chart Dim xSheet As Excel.Worksheet pRange.CopyPicture appearance:=xlScreen, Format:=xlPicture Set xSheet = pRange.Worksheet Set xChart = xSheet.ChartObjects.add(0, 0, pRange.Width, pRange.Height).Chart xChart.Parent.Select '<== これかよっ xChart.Paste xChart.Export Filename:=pFileName, filtername:="JPG" xChart.Parent.Delete End Sub
最後にファイル添付
Attachments.Add すればおしまいです。一応サンプルを載せておきます。
Private Sub SendMail() Dim oMail As Outlook.MailItem Dim oOutLook As Outlook.Application Dim xCell As Excel.Range Set oOutLook = New Outlook.Application Set oMail = oOutLook.CreateItem(olMailItem) oMail.Subject = "本日の途中経過 " & Format(Now, "MM/DD hh:mm") modUtil.savePicture ThisWorkbook.Path & "\tmp1.jpg", Sheet8.Range("AD2:AK7") modUtil.savePicture ThisWorkbook.Path & "\tmp2.jpg", Sheet8.Range("AM2:AT7") modUtil.savePicture ThisWorkbook.Path & "\tmp3.jpg", Sheet8.Range("AV2:BC7") oMail.Attachments.Add ThisWorkbook.Path & "\tmp1.jpg" oMail.Attachments.Add ThisWorkbook.Path & "\tmp2.jpg" oMail.Attachments.Add ThisWorkbook.Path & "\tmp3.jpg" oMail.body = "Hello Sam! How is your quest going?" oMail.To = "sam.bridges@central.knot.city.com" oMail.send End Sub