VBAでOutlookメールのフォントを変更する
まあ、ぐだぐだと愚痴も書いていきますが、本題から書いておきます
Sub FontTest()
Dim myOutlook As Object
Set myOutlook = CreateObject("outlook.application")
Dim myItem As Object
Set myItem = myOutlook.CreateItem(olMailItem)
Dim myDoc As Word.Document
Set myDoc = myItem.GetInspector().WordEditor
myItem.Body = "hogehoge"
myDoc.Content.Font.Name = "Meryo UI"
myItem.Display
End Sub
こういうのってブログに載せる際の作法とかあるのかな?
まあ、よくわからないので気にしないでおきます。
エクセルVBAから新規にOutlookメールを作成するというのは
以前にやったことありまして、
今回、同僚が、私が以前作成したものを改変して作ったけど、
添付ファイルの前後でフォントが違ってしまう、との相談。
正直、なぜそうなったのか原因不明だし、私の環境じゃ
その現象の再現もできなかったんですが、
フォントを全部変更しちゃえばいいでしょとか、
軽く答えてみたが、その方法がよくわからなかったわけです。
VBAでOutlookのメール本文を編集しようとすると、
ものすごくめんどくさいんですよね。
メールがテキスト形式なら、bodyを適当に置き換えてやれば済みますけど、
HTML形式やリッチテキスト形式だと、
何が何だかわからない感じになります。
まあ、それはさておき、フォントの変更ですが、
ネットで検索するとなかなか答えが見つからず、
特にリッチテキスト形式のフォント変更の方法が見つけられませんでした。
リッチテキスト形式では変更できないから、
HTML形式にしてstyleタグを付け足せというものと、
一旦HTML形式に変換してフォント変更してから、
リッチテキスト形式に戻せというものがありました。
しかし、先ほどの相談内容からわかる通り、文章の途中に
添付ファイルを挟んでいる状態のメールです。
HTML形式にすると、添付ファイルは文中には置けないので、
リッチテキスト形式に戻そうとするとかめんどくさすぎてやりたくない。
だいたい、リッチテキスト形式だとフォントの変更ができないとか
そんなことあるわけない、ってことで自分で試して
上記のものになりました。
というわけで、自分なりの解説です
①Outlookオブジェクトを作成
他の方が書かれているVBAからのメール作成の方法ですが、
Outlookのライブラリを参照設定しておいてから
Dim myOutlook As New Outlook.Application
Dim myItem As Outlook.MailItem
Set myItem = myOutlook.CreateItem(olMailItem)
とやるように書かれていたんですが、
私の職場の環境では Set~ の行でエラーが出て動きませんでした。
理由はよくわからないですが、遅延バインディングで記述しています
なお、OutlookのライブラリとWordのライブラリを参照設定したうえで
動かしましたが、
Dim myDoc As Word.Document を
Dim myDoc As Object に変更すれば参照設定しなくても動作しますね。
②GetInspector().WordEditor
まあ、このあたりからよくわかってないけど、こう書けば大丈夫なはず
っていう状態になります。
Outlookオブジェクトからではメール本文の編集などができないので、
Wordライブラリを使って内容を編集するということなのだろう、
と思います。多分。
③フォントを変更
Word.Documentオブジェクトまでくれば
ドキュメント内の変更したい部分を指定して
~.Font.Name = "****" で、フォントの変更ができます。
myDoc.Content なら本文全体を変更できるようです
※参照設定したことで表示されるプロパティやメソッドを眺めて、
多分これだろうとContentを選んでやってみたらできたというものなので、
まあ、正直よくわかっていません
もちろん、myDoc.Range(0, x).Font.Name という書き方もできるんですが、
このRangeもどう設定したものかよくわかりづらいので、
あまり使いたくありません。
多分 myDoc.Range(0, Len(myDoc.Content)).Font.Name
みたいな感じでうまくいきそうな気もします。(試してない)
Len(myItem.body) と Len(myDoc.Content) では微妙に数値が違ってくるのが
ややこしくて困ってしまいます
コメント
コメントを投稿