• ベストアンサー
  • 困ってます

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に入っている文字列はすべてただの文字列とし、上記の例の場合にメールが途中で 途切れないようにする方法はありますでしょうか?

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数11771
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.2
  • end-u
  • ベストアンサー率79% (496/625)

>Bodyst = honbun >Shell sPath & "to=" & Mailad & "," & _ >       "subject=""" & Subjct & """," & _ >       "body=""" & Bodyst & """" Bodyst = Replace(honbun, "&", "&") Shell sPath & "mailto:" & Mailad & "?" & _        "subject=""" & Subjct & """&" & _        "body=""" & Bodyst & """" ..こんな感じではどうでしょう。 『&』つなぎにして、本文内に『&』があれば全角にしておく対処。 『,』と『&』とどちらが使用する頻度が高いかな、という点と 『,』と『&』全角にした時の違和感を考えて、そこは好みで 『,』でも構わないかと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 頂いたアドバイス通り、以下の構文で問題なく動作しました。 (&ではなく、カンマを全角にする対応としました) Bodyst = honbun Bodyst = Replace(honbun, ",", ",") Shell sPath & "to=" & Mailad & "," & _        "subject=""" & Subjct & """," & _        "body=""" & Bodyst & """"

関連するQ&A

  • VBA 実行時エラー1004(その2)

    毎度お世話になっております。 シート「sheet2」のA列のリスト内容を、シート「M_得意先」のリストからVLOOKUPして、指定のセルに書き出していくというコードを作成してみたのですが、VLOOKUPを実行する段階でエラーが出てしまいます。 少し変更して、同一シート内でのVLOOKUPは問題なく実行できたのですが...原因をご存知の方教えてください。 Dim b As String Dim endRcell2 As Long Dim cnt10 As long Sheets("sheet2").Select Sheets("sheet2").Range("A1").CurrentRegion.Select 'データ全体選択 Selection.SpecialCells(xlCellTypeLastCell).Select '最終行検出 endRcell2 = ActiveCell.Row cnt10 = 2 Do ↓実行時エラー1004が出る行 b = Application.WorksheetFunction.VLookup(Sheets("Sheet2").Range("A" & cnt10).Value, Sheets("M_得意先").Range(Cells(1, 1), Cells(endRcell, 2)), 2, False) ↑実行時エラー1004が出る行 Sheets("sheet2").Range("E" & cnt10).Value = b cnt10 = cnt10 + 1 Loop Until cnt10 = endRcell2

  • エクセルVBAで、Dim A As StringとA$

    変数を使用するにあたり、 Dim A As String A=Sheets("Sheet1").range("A1").Value MsgBox A という記述方と、 A$=Sheets("Sheet1").range("A1").Value MsgBox A$ という記述は同じ意味だと思うのですが、何か違いがあるのでしょうか? Stringなら「$」、Integerなら「%」で、いちいちDimで整数か文字列かを指定しなくていいだけ簡単だと思うのですが、わざわざDimを使う意味は何なのでしょうか?

  • VBA:実行時エラー1004

    VBAにて以下のコードを実行すると実行時エラー1004が出ます。 dim tokuisakicode as string If Not Sheets("sheet2").Range("A" & cnt2).Value = Sheets("sheet2").Range("A" & cnt2 - 1).Value Then  tokuisakicode = Sheets("Sheet2").Cells(cnt2, 1).Value ↓エラーが出る行  Sheets("A").Cells(1, cnt6).Value = tokuisakicode ↑エラーが出る行  cnt2 = cnt2 + 1  cnt6 = cnt6 + 1 Else  cnt2 = cnt2 + 1 End If エラー1004は自分の経験上記述ミスなどのケアレスミスが多いのですが、今回は原因がどうしてもわかりません。 お分かりの方みえたらお教えください。

その他の回答 (1)

  • 回答No.1

このページに詳しく書いてます https://developer.mozilla.org/ja/Command_Line_Options#Syntax_Rules 構文規則の項目を参照すると、 >複数のメッセージオプションは、例えば "to=foo@nowhere.net,subject=cool page" のように、カンマ (,) で切り離します。カンマの前後に空白 ( ) を入れてはいけません。 これに反応して切り離されているのでは? >ひとつの欄に複数の値を割り当てるには、"to='foo@nowhere.net,foo@foo.de',subject=cool page" のように引用符 (') でくくってください。 とありますので、「引用符 (') 」で本文を囲んではどうでしょうか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 頂いたアドバイスで、カンマを含む文字が切り離されずに入力できました。 ただ、当たり前ですが、メール本文に引用符(')がつくようになってしまいまして こいつを取り除きたいのですが、そんなことは可能でしょうか?

関連するQ&A

  • エクセルVBAマクロの質問です。

    マクロ初心者です。行き詰まってます。 sheet1には300件程度のデータがあります。 このデータの3列目の値を、VLOOKUPでsheet3のA1:B30範囲から参照します。そこで取得した回数分、sheet1の各行のデータをsheet2にコピーしたいんです。 そこで、コード文を作ってみましたが、マクロがうまく動きません。 すみませんが、お知恵を貸していただけないでしょうか? Dim Z as Long Dim L As Long Dim P As Long Dim Kensaku As String Dim M4 As Range Dim PRow As Long Dim i As Long Set M4 =Sheets(“sheet3”).Range(“A1:B30“) L = Sheets(“sheet1”).Range(“A1”).End(xlup).Row For Z = 1 to L-1 Kensaku = Sheets(“sheet1”).Cells(Z+1,3).Value P=Worksheetfunction.Vlookup(Kensaku,M4,2,False)    For i = 1 to P      Prow=Sheets(“sheet2”).Range("A1").End(xlDown).Row      Sheets(“sheet1”).Rows(Z+1).Copy Sheets(“sheet2”).Rows(Prow)    Nexti Next Z

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • VBA Do~Loopについて

    VBA勉強中です。 マクロの作成は完了しているのですが、処理効率について指摘を受け、 その際に助言もいただいたのですが、自身の勉強不足、理解不足で どのように変更すれば良いのか分からず、教えていただきたいです。 Do While Ax2 <= 30 で30回繰り返すのではなく (Cells(Ax2,"B").Value <> "" ) の間繰り返すように変更したいです。 ---------------- Sub test()  Dim File1(30) As string  Dim Sheet1(30) As string  Dim Sheet2(30) As string  Dim Cnt As Integer  Ax1=1  Ax2=7  Do While Ax2 <= 30    If Cells(Ax2, "B").Value <> "" Then     File1(Ax1) = Cells(Ax2, "B").Value     Sheet1(Ax1) = Cells(Ax2, "C").Value     Sheet2(Ax1) = Cells(Ax2, "D").Value     Cnt =Ax1    End If    Ax1 = Ax1 + 1    Ax2 = Ax2 + 1  Loop End Sub ---------------- お手数ですが、よろしくお願いいたします。

  • 実行時エラーの原因がつかめない(ExcelVBA)

    下記コードで実行時エラーの原因がつかめません。どなたか助けて ください。Sheet5のA,B列のデータを Sheet6 のA,B列に 一定の範囲で逆順にコピーする操作です。 Dim Dn As Integer, Zn As Integer Dn = Sheets("sheet1").Range("E37").Value / 8 + 0.5 Zn = Round(Dn) ‘ Sheets("Sheet6").Range("A1:A65536").ClearContents Xn2 = Sheets("Sheet3").Range("D65536").End(xlUp).Row - 5  Xn1 = Sheets("Sheet5").Range("A65536").End(xlUp).Row I = 0 Do Ix = I + 1 Iz = Xn1 - I Sheets("Sheet6").Range("A" & Ix & " : B" & Ix).Value _ Sheets("Sheet5").Range("A" & Iz & " : B" & Iz).Value I = I + 1 Loop Until I = Xn2 * Zn + 1

  • コンボボックスのvba 作成の仕方

    私は、月別にデータを作っています。なので、月ごとにデータを見られるようなボタンを作成したいです。 現在組んでいるマクロは、ボタン(普通の四角いもの)を押すごとに、翌月データをコピペするというものになっています。 (以下、現在のコード記載) Sub auto_open() Dim wkm As Long Dim wkn As Long Dim wkt As Variant Dim wks As Variant Dim dt As Date Dim mi As Integer dt = Date mi = Month(dt) wkt = Array(0, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9) wks = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) wkm = wkt(mi) Call Macro1(wkm) Sheets("住宅資金").Range("A3") = wks(mi) End Sub Sub Next_Month() Dim wks As Variant Dim dt As Date Dim mi As Integer wks = Array(0, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9) If Sheets("住宅資金").Range("A3") = 12 Then wkm = 10 Else wkm = wks(Sheets("住宅資金").Range("A3") + 1) End If Call Macro1(wkm) wks = Array(0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3) Sheets("住宅資金").Range("A3") = wks(wkm) End Sub Sub Macro1(ByVal wkm As Long) With Sheets("入力") Sheets("住宅資金").Range("D5:D23").Value = .Range("C5:C23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("J5:J23").Value = .Range("C28:C46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("P5:P23").Value = .Range("T28:T46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("O5:O23").Value = .Range("T5:T23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("F5:F23").Value = .Range("O5:O23").Value Sheets("住宅資金").Range("L5:L23").Value = .Range("O28:O46").Value End With With Sheets("目標") Sheets("住宅資金").Range("C5:C23").Value = .Range("B4:B22").Offset(, wkm - 1).Value Sheets("住宅資金").Range("I5:I23").Value = .Range("B27:B45").Offset(, wkm - 1).Value End With With Sheets("前年同期") Sheets("住宅資金").Range("H5:H23").Value = .Range("C5:C23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("N5:N23").Value = .Range("C28:C46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("Q5:Q23").Value = .Range("T5:T23").Offset(, wkm - 1).Value End With End Sub さて、現在作りたいと思っているものを以下に記述します。 普通の四角いボタンではなく、コンボボックスを使用して、矢印(▼)を押すことによってリストが表れ、 「1月」に合わせたら1月のデータがコピペされる、「8月」に合わせたら8月のデータがコピペされる、というものを作りたいと思っています。 以下のような空欄の表を作成したシートがあります。        A    B    C   D 1      目標  実績  …   … 2 ○支所   3 △支所 4  ・ 5  ・ 6  ・ 別のシートに、手入力した月別のデータがあります。 空欄のシートのどこかにコンボボックスを作り、別シートの○月のデータを貼り付けられるようにしたいと思っています。 コンボボックスの作り方がわからず、後一歩のところでつまずいてしまいました。 知恵をお貸しください。 よろしくお願いいたします。

  • エクセルVBAで範囲を変数で設定する方法?

    Dim i As Integer For i = 1 to 50 とした場合、 セルであれば Sheets("Sheet2").Cells(i, 2).Value = Sheets("Sheet1").Cells(i, 2) のように変数を使えますが、範囲に使う場合にはどう書けばいいのでしょうか? 例えば、 Sheets("Sheet2").Range("A1:G1").Value = Sheets("Sheet1").Range("A1:G1") のような式で、行数を変数にする場合です。 よろしくお願いします。

  • VBAについて

    こんばんは、下記のVBAについて質問をさせてください…! シートの名前と特定の列の名前が一致したらデータを引っ張ってくるというVBAなのですが、下記のVBAではもってくるデータはE列でおわりですが、もっと沢山列がある場合で、例えばDA列とかまである場合はどうすればよいのでしょうか…?! まさか「.Range("A" & cellCnt).&#65374;」というのを一つ一つ入力するわけではないと思うのですが、記述の方法が分からず困っています。 どなたかご教示いただけると大変助かります…! ' データをとってくるシートの行 Dim dataCnt As Integer ' 貼り付け先のシートの行 Dim cellCnt As Integer cellCnt = 1 For dataCnt = 1 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Sheets("Sheet1").Range("L" & dataCnt).Value = Sheets(sheetIdx).Name Then With Worksheets(sheetIdx) .Range("A" & cellCnt).Value = Worksheets("Sheet1").Range("A" & dataCnt).Value .Range("B" & cellCnt).Value = Worksheets("Sheet1").Range("B" & dataCnt).Value .Range("C" & cellCnt).Value = Worksheets("Sheet1").Range("C" & dataCnt).Value .Range("D" & cellCnt).Value = Worksheets("Sheet1").Range("D" & dataCnt).Value .Range("E" & cellCnt).Value = Worksheets("Sheet1").Range("E" & dataCnt).Value End With cellCnt = cellCnt + 1 End If Next

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

    当方エクセル2016使用しています。 エクセルのVBAで、outlookのメールを自動作成したいです。 エクセルの E2に宛先 E3に件名 E4&#65374;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

  • Function 構文のなかに変数をいれたい(VBA)

    お願いします。 エクセルVBAにて 下記のようなFunction構文内に変数を設定する方法を 教えてください。 この中で k以外にも a = Sheets("sheet1").Range("E27") b = Sheets("sheet1").Range("E27") この変数を扱いたいのですが。 もしかして他にもfunction構文が必要でしょうか。 Function data(k As Double) Dim sum As Double Dim ct As Integer Dim keisu As Integer Dim a As Double Dim b As Double a = Sheets("sheet1").Range("E27") b = Sheets("sheet1").Range("E27")  以下 略

  • VBAで差し込みシート作成はできないでしょうか?

    sb-yamatoと申します。よろしくお願いします。 ボランティア団体の登録者管理をしておりまして、エクセルVBAで人数分のシートを作成しながら差し込みができないかと悩んでいます。 イメージとしては、ワードの差し込み印刷をすると、人数分のページができると思います。それをエクセルシートでできないでしょうか? 自分なりに作ってはみたのですが、変数iの使い方が悪いのか、どうも上手くいきません。こんな感じです。 Sub シートの作成() Dim touroku As Long ←登録番号です。(8桁) Dim simei As String ←漢字氏名です。 Dim seinen As Date  ←生年月日です。 Dim i As Byte    ←150人までです。 i = 2        ←1行目はタイトル行です。 Worksheets("名簿").Activate Do While Cells(i, "B").Value <> "" touroku = Range(i, "B").Value simei = Range(i, "C").Value seinen = Range(i, "D").Value Worksheets("登録台帳(原本)").Copy After:=Worksheets(i) Range("AI2").Value = touroku Range("AJ2").Value = simei Range("AK2").Value = seinen ActiveSheets.Name = Range("AJ2").Value i = i + 1 Loop End Sub 名簿sheetのB列[変数i]行目をコピーしたsheetのセルAI2に貼り付けているつもりなのですが、反応してくれません。 皆様のお力添え、よろしくお願いいたします。