2024年のうちにやっておきたいこと、ここで宣言しませんか?

outlook メール作成のVBAに関して
下記のコード(抜粋)にてメール作成してますが
bodyformat でHTML を選定すると改行幅が大きくなる(通常改行幅の2倍程度)ため
HTMLを選定しても通常の改行幅になるようにしたいです。
分かる方いらっしゃいましたらご教授下さい。
宜しくお願いします。



Private Sub CommandButton3_Click()
'If Label2.Caption = "" Then MsgBox ("宛先アドレスを設定してください。"): Exit Sub
Dim outlookObj As Outlook.Application
Dim mailObj As Outlook.MailItem
Set outlookObj = New Outlook.Application
Set mailObj = outlookObj.CreateItem(olMailItem)
M = Worksheets("メール内容").Cells(5, 2) '件名 選択
N = Worksheets("メール内容").Cells(9, 2) '本文 選択
'メール送信内容の作成
With mailObj
.To = NN 'メール宛先
.CC = MM 'メールCC
.Subject = M 'メール件名
.Body = N 'メール本文
.BodyFormat = 2 'メール形式設定
.Display
End With
Unload Me
End Sub

A 回答 (3件)

本文は今まで通り、B9で抽出時、文字を変更しては、どうでしょう。


メインプロシージャが分かり難くなると思いますので、Functionで分けるのが良いと思います。
サンプル
Private Sub CommandButton3_Click()
'If Label2.Caption = "" Then MsgBox ("宛先アドレスを設定してください。"): Exit Sub
Dim outlookObj As Outlook.Application
Private Sub CommandButton3_Click()
'If Label2.Caption = "" Then MsgBox ("宛先アドレスを設定してください。"): Exit Sub
Dim outlookObj As Outlook.Application
Dim mailObj As Outlook.MailItem
  Set outlookObj = New Outlook.Application
  Set mailObj = outlookObj.CreateItem(olMailItem)
  Dim N As String, M As String, NN As String, MM As String
  M = Worksheets("メール内容").Cells(5, 2)  '件名 選択
  N = Worksheets("メール内容").Cells(9, 2)  '本文 選択
  N = htmlTest(N)
  'メール送信内容の作成
  With mailObj
    .To = NN       'メール宛先
    .CC = MM       'メールCC
    .Subject = M     'メール件名
    .BodyFormat = 2   'メール形式設定
    .HTMLBody = N    'メール本文
    .Display
  End With
  'Unload Me
End Sub

Function htmlTest(strBody As String) As String
Dim strChk As String, strSet As String, strTmp As String
Dim i As Long
  strTmp = ""
  For i = 1 To Len(strBody)  '文字数分ループ
    strChk = Mid(strBody, i, 1)
    If Asc(strChk) = &HA Then  '改行
      strSet = "</p><p>"  '<br>変わり
    Else
      strSet = strChk
    End If
    strTmp = strTmp & strSet
  Next i
  htmlTest = "<html><body style=""line-height: 1em""><p>" & strTmp & "</p></style body></html>"
End Function

少し乱暴なFunctionです。
本来 HTMLへのエンコード変換は沢山あるので
IFでなくSelect Case などで条件分岐した方が良いと思います。また、Function内で
 htmlTest = "<html><body style=""line-height: 1em""><p>" & strTmp & "</p></style body></html>"
のようなコードにすると汎用性がなくなり、良くないですが、サンプルで加工している部分を見分けるため書きました。

Asc 関数、ASCIIコードについては、お調べください。
    • good
    • 2

.BodyFormaを変更すると書式が削除されてしまうので、改行も削除されます。


したがって、コードに改行を加える必要が発生します。HTMLで送信する必要が無ければ、通常テキストで使うのが良いと思いますよ。

本文をhtmlで書いている為、<br>タグや<p>タグを使って改行を加えます。<p>タグの方が良いかも
その為、htmlの知識が必要になると思います。さほど難しい事はしないと思うので、調べてみてはいかがでしょう。

また、Worksheets("メール内容").Cells(9, 2)のセル内にコード+本文を書いて.HTMLBody = N でも可能です。
なので、Cells(9, 2)のセル内の文字に対してVBAのReplaceや文字関数でhtml形式に書き換えるプロセスを入れのも良いかも知れません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
下記のようなやり方しかわからなかったのです。。。。。
他に画期的なコードの組み方はあるでしょうか?
セル1つ1つを改行していくと
改行幅が大きくなってしまいました。
お手数かけますがご教授下さい。

Dim outlookObj As Outlook.Application
Dim mailObj As Outlook.MailItem
Set outlookObj = New Outlook.Application
Set mailObj = outlookObj.CreateItem(olMailItem)
M = Worksheets("メール内容").Cells(5, 2) '件名 選択
Dim N As String: N = ""
N = N & Worksheets("メール内容").Range("B9").Value & "<P>" '本文 選択
N = N & Worksheets("メール内容").Range("B10").Value & "<P>" '本文 選択
N = N & Worksheets("メール内容").Range("B11").Value & "<P>" '本文 選択

'メール送信内容の作成
With mailObj
.To = NN 'メール宛先
.CC = MM 'メールCC
.Subject = M 'メール件名
'.Body = N 'メール本文
.BodyFormat = olFormatHTML 'メール形式設定
.HTMLBody = "<html><body style=""line-height: 1em"">" & N & "</style body></html>"
.Display
End With
End Sub

お礼日時:2020/05/19 21:57

こんな書き方で良ければ、



  With mailObj
    .To = NN       'メール宛先
    .CC = MM       'メールCC
    .Subject = M     'メール件名
  '.Body = N 'メール本文
    .BodyFormat = 2   'メール形式設定
    .HTMLBody = "<html><body style=""line-height: 1em"">" & N & "</style body></html>"
    .Display
  End With

1em 1行分
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
改行幅は直りました!!!
ありがとうございます!!!!

因みに元々は改行できていたのですが、上記コードだと改行しないのですが
何かわかりますでしょうか?

お礼日時:2020/05/19 16:47

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A