エクセルVBAでメール本文を作成する方法の制限について

このQ&Aのポイント
  • エクセルVBAでメール本文を作成し、ハイパーリンクをセットする方法について考えています。
  • 現在のコードでは、変数に格納できる文字数の制限により、長い関数が途中で切れてしまう問題が発生しています。
  • さらに、作成したハイパーリンクをクリックすると正しいメール本文が立ち上がるようにすることも目指しています。
回答を見る
  • ベストアンサー

VBA 変数に格納できる文字数に制限が?

いつもお世話になります。 excel VBAで、エクセルの行を本文としたメールを作成するマクロを作りたいと考えています。 直接メーラーにデータを渡すプログラムは難しく、またサンダーバードなので対応しているか 分からないため、エクセル関数のハイパーリンクを使ってクリックでメーラーが立ち上がり 本文が入力されている...というものを作っています。 現在のコードは以下です。 ’範囲内のセル本文を改行つきで「linktext」へ格納する linktext = "" Do Until Sheets("sheet2").Range("B" & cnt).Value = "adress" linktext = linktext & "A" & cnt linktext = linktext & "&" linktext = linktext & """%0a""" linktext = linktext & "," cnt = cnt + 1 Loop 'ハイパーリンクとしてセルへセット finaltext = "=HYPERLINK(""" finaltext = finaltext & "mailto:""" finaltext = finaltext & "&""" finaltext = finaltext & meruado finaltext = finaltext & """&" finaltext = finaltext & """?subject=""" finaltext = finaltext & "&""" finaltext = finaltext & kenmei finaltext = finaltext & """&" finaltext = finaltext & """&body=""" & "&CONCATENATE(A12)," finaltext = finaltext & linktext finaltext = finaltext & ")," finaltext = finaltext & """" finaltext = finaltext & meruado finaltext = finaltext & """" & ")" Sheets("sheet2").Range("A1").Formula = finaltext 見よう見まねで作ったので、分割されていてすみません。 上記マクロを走らせ、できた関数は以下のようになります。 =HYPERLINK("mailto:"&"○○@hotmail.com"&"?subject="&""&"&body="&CONCATENATE(A10&"%0a",A11&"%0a",A12&"%0a",A13&"%0a",A14&"%0a"・・・以下続いていく) で、ここで問題が。 上記の関数が非常に長くなった場合、変数「linktext」「finaltext」への格納が途中で切れてしまうようなのです。 具体的には、おしりが「A35」になるあたりで止まっており、lenで調べると、609で止まっているようです。 もっと多くの文字数を一つの変数に格納することはできますでしょうか? また、さらにそれを使ってエクセルのセルにハイパーリンクをセットし、クリックして正しいメール本文が 立ち上がるようにすることはできるのでしょうか?

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

  • ベストアンサー
  • hogya
  • ベストアンサー率67% (49/73)
回答No.1

文字列型変数(String)に格納できるサイズは最大2GB(20億文字ぐらい)ぐらいですので6百いくつということはないです。 変数の定義に問題(固定長で宣言してあるとか)がなければ、プログラムのバグか元のデータのせいではないでしょうか。例えば、 Do Until Sheets("sheet2").Range("B" & cnt).Value = "adress" の条件に該当して途中でループを抜けているとか。 あと、直接は関係ないですが、例え希望の文字数が入ったとしてハイパーリンクの文字数制限に引っかかったりしませんか?

nama2007
質問者

お礼

ハイパーリンクの制限に引っかかりました... 別の方法を探しますが、教えていただいた事はそちらにも活かせそうです! ありがとうございました。

その他の回答 (1)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

とりあえず VB(VBA) の変数には問題なく5000文字入れられるテスト Sub test()   Dim finaltext As String   Dim i As Long   For i = 0 To 5000 - 1     finaltext = finaltext & "a"   Next   MsgBox Len(finaltext) End Sub Excel の仕様の方に最大 256 文字とか 512 文字とかたくさん あるので、Formula か HYPERLINK の制限に引っ掛かっているのだと 思われます。そういう長い文字列を使わなくても良いように工夫 しましょう。

nama2007
質問者

お礼

ハイパーリンクの制限に引っかかりました... 別の方法を探しますが、教えていただいた事はそちらにも活かせそうです! ありがとうございました。

関連するQ&A

  • CONCATENATEで作った計算式を実行させたい

    こんばんわ CONCATENATEで作った計算式を実行させたいのですが、実行できず困っています。 HYPERLINKで、to/CC/件名/本文を指定したメールを起動したいと思っています。いつも同一の場合は、いろいろな方の情報を参考に作ることが出来たのですが、本文は毎回変更になるため、本文を関数で指定しようと思ったところで躓いています。 A1 本文A A2 本文B : A7 = A8 HYPERLINK("mailto:○○○@アドレス.ne.jp & cc=△△△@アドレ ス.ne.jp&subject=件名XXの件 &body= A9 +A1 A10 %0a A11 +A2 A12  ","エクセルで表示する文字列") A13 =CONCATENATE(A7,A8,A9,A10,A11,A12) といれるとA13は 「=HYPERLINK("mailto:○○○@アドレス.ne.jp & cc=△△△@アドレス.ne.jp&subject=件名XXの件 &body=本文A%0a本文B%0a ","エクセルで表示する文字列")」という値になるのですが、ここからこれをHYPERLINK関数として成り立たせる方法が分かりません。 CONCATENATEや&などを利用せず、そのまま上記A13の値をセルに入れると、正しいHYPERLINK関数になるのですが、ここからどのようにすれば上手くHYPERLINKが働いてくれるでしょうか? どうか宜しくお願いいたします。

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

  • エクセルからメール作成

    エクセルの関数を使ってメールを作成する方法について教えて下さい。 =HYPERLINK("mailto:"&A1"?cc="&A2&"; "&A3&"&subject="&A4&"&body="&A5,"セルの名称") にて指定したセルとクリックするとメールアドレス(to、cc)と件名、本文が入ったメールが作成されました。 ただ、本文(A5)が改行されず表示されます。 セルが分かれてもいいですので、改行する方法を教えて頂けますでしょうか? 【イメージ】 A5(改行) (改行) A6(改行) ・・・

  • mailto:の本文に文字数制限はありますか?

    こんにちは mailto: で、宛先、件名、本文を指定したメールを 起動しようとしていますが、 ?body="" 内に記載する文字が一定数を超えると、 メーラーを起動できなくなります。 body に記載できる文字数に制限はありますでしょうか。 また、これを回避する方法はありますでしょうか。 ご存知の方がいらっしゃいましたら、 よろしくご教示ください。 該当箇所は、以下のように記述しています。 <li>○○の場合は<a href="mailto:xxxxx@xx.xx.jp?subject=[xxxxx] xxx&cc=xxx@xx.xx.jp&body= ○○ご担当者さま%0d%0a .....<中略> ">こちら>></a></li> 文字数は、ざっと1200ワードです。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • VBA 印刷範囲設定がうまくいかない

    変数cntに値を代入し印刷範囲が変わるという事を、以下のコードで実行しようとしています。 Sub Macro1() cnt = 9 Sheets("A").Activate 範囲 = Sheets("A").Range(Cells(1, 1), Cells(33, cnt + 1)) ActiveSheet.PageSetup.PrintArea = 範囲 上記のコードですと、シート「A」のセルA1~J33までが印刷範囲になると思ったのですが、実行すると全く関係ないセルまで印刷範囲になってしまいます。 「A」シートには罫線やデータが入力されているセルが他にもあり、どうやらそれらのセルも同じく印刷範囲とされてしまっているようなのです。(例えばK列に罫線が引いてあり、セルに色がついているとK列まで印刷範囲になる) Sheets("A").Range(Cells(1, 1), Cells(33, cnt + 1)).select とすれば、望みどおりのセル範囲A1~J33がきちんと選択されるのですが、印刷範囲ではなぜこのようなことになってしまうのでしょうか。

  • VBAでメール本文へのハイパーリンク挿入

    すみませんが質問させて下さい。エクセルVBAにてセルの文章をメール本文へ転記させているのですが、その中の1行がURLとなりハイパーリンクにしたいと思っています。 例えばmailbody = Range("A1")で本文を挿入した場合、A1に”いつもお世話になっています。ファイルはhttp://xxxxxを参考下さい"のhttp://xxxxxの部分だけハイパーリンクにしたいのですがご教授頂けませんでしょうか。宜しくおねがいいたします。

  • VBAの配列の格納について

    エクセルのVBAで、セルのデータを配列に格納するスピードを向上したいと思います。 例えば、A1~A10000のセルにデータを書き出す場合、 For 行番号 = 1 To 10000 Cells(行番号, 1).Value = 1 Next よりも、一旦、配列に書き込んだ後、一気にセルに書き込んだ方法が早いのですが、 For 行番号 = 1 To 10000 HAIRETU(行番号, 1) = 1 Next Range("A1:A10000").Value = HAIRETU() 今度は、A1~A10000に書き込んだデータを、再度、配列に格納する場合、 For 行番号 = 1 To 10000 HAIRETU(行番号, 1) = Cells(行番号, 1).Value Next とすると時間がかかるので、 HAIRETU() = Range("A1:A10000").Value というような処理をしたいのですが、うまくいきません。 よい方法がありましたら、ご教授ください。 よろしくお願いします。

  • 色のついたセルと文字を両方数えられるVBA

    VBAの初心者です。 エクセルで文字の色でカウントする為に以下のVBAをこちらで教えていただきました。 順調に快適にエクセルを使えていたたのですが今回同じエクセル内で 文字ではなくセルに色付けしたものもカウントしなければならなくなりました。 以下のVBAがあるからかよく言われている4.0マクロ関数ではうまくいきません。 以下のVBAに何かを足せば一方では文字色をカウントし 一方ではセル色をカウントすると言う事は可能でしょうか? どなたか力を貸してください Function CCount(Rng As Range, idx) Dim R As Range Dim Cnt As Long Application.Volatile For Each R In Rng     If R.Font.ColorIndex = idx Then Cnt = Cnt + 1 Next R CCount = Cnt End Function

  • 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は自分の経験上記述ミスなどのケアレスミスが多いのですが、今回は原因がどうしてもわかりません。 お分かりの方みえたらお教えください。

  • Excelでセルの文字を繋げたいのに・・・

    Excelでセルの文字列を繋げたいと思います。 10セル位ならCONCATENATE関数を利用しても苦になりませんが、100セルともなると大変です。 =CONCATENATE(A1,B1,C1,D1,・・・100個も)   オートサムみたいに=SUM(A39:K39) ":"を入れてみましたがダメでした。 大量のセルを一つにまとめる時は何か書き方がありますか?