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

ExcelVBAでメールを作成してメーラーを起動するプログラムを作って

ExcelVBAでメールを作成してメーラーを起動するプログラムを作っているのですがうまくいかない点が2つほどあります。 (1)いろいろ条件によって文章を組み立てて、 Excelに一旦、本文を表示するところまで行ったのですが、 それをクリップボードにコピーして、 GetText関数でmailtoのbodyに渡し メーラーが起動されるのですが、 メール本文を見るとダブルコーテーションで囲われているところがいくつかあり、 (セル内改行があったところなどが 自動的に囲われてしまうみたいで) 改行もされず本文が全部つながってしまいます。 メール本文でダブルコーテーションなしにして元の改行を入れるにはどうしたらいいのでしょうか? (2) bodyの本文が長いとエラーになってしまい、 メーラーが起動されません。 2千文字くらいしか入らないみたいです。 入れなければならない文言が決まっているので、 文章の文字数を減らすことはできません。 ダブルコーテーションは消して、 改行をそのまま入れて、 文章の文字数はそのままで、メーラーからを送るにはどうしたらいいか何日か悩んだのですが解決できません。 ご教示お願いします。

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

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

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

>mailtoコマンド mailtoプロトコル...ですよねorz >CreateProcess関数を使うとできそうな記事もありますがちょっとハードルが高そうです。 VBA的には Shell関数を使えばいいのでそうでもないですか。 レジストリを見に行って、既定メーラーを取得して起動オプションに本文をくっつける感じ? Sub try_3()   Const HKEY = "HKEY_CLASSES_ROOT\mailto\shell\open\command\"   Dim Flg  As Boolean   Dim Arg  As String   Dim sPath As String   Dim i   As Long   Dim b()  As Byte   Dim tmp, ary   On Error GoTo errHandler   tmp = Selection.Value   If IsArray(tmp) Then     ReDim ary(1 To UBound(tmp))     For i = 1 To UBound(tmp)       ary(i) = Join(Application.Index(tmp, i, 0), "")     Next     Arg = Join(ary, vbLf)   Else     Arg = tmp   End If      '既定メーラー取得(WinXP)   With CreateObject("WScript.Shell")     sPath = .ExpandEnvironmentStrings(.RegRead(HKEY))   End With   sPath = Replace$(Replace$(sPath, """%1""", ""), "%1", "")   Flg = InStr(1, sPath, "thunderbird", vbTextCompare)      If Flg Then     'thunderbirdだと文字化けしたのでUTFエンコード     With CreateObject("ScriptControl")       .Language = "JScript"       Arg = .CodeObject.encodeURI(Arg)     End With   Else     '簡易的にSJISエンコード     b = StrConv(Arg, vbFromUnicode)     Arg = ""     For i = 0 To UBound(b)       Arg = Arg & "%" & Right$("0" & Hex$(b(i)), 2)     Next   End If      Arg = "mailto:メールアドレス?" & _      "subject=件名&" & _      "body=" & Arg   Shell sPath & Arg   Exit Sub errHandler:   MsgBox Err.Number & ":" & Err.Description End Sub とりあえずwinXPで Outlook/Outlook Express/thunderbird は動きました。 他環境だったりする場合、ここ http://jehupc.exblog.jp/9727243/ の情報が参考になると思います。 #個人的にはCDOをおすすめしますが

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

質問者からのお礼

ありがとうございます。 遅くなりましてすみません。 おかげさまで目的のものが作れました。 この方法でやってみたら最終的には、一応うまくいったのですが、 すいません、難しくて内容についてはあまりよく理解できていません。 処理の内容についてもう少し詳しく知りたいので説明して頂けたらありがたいのですが・・・ お願いできないでしょうか?

その他の回答 (4)

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

OS、メーラーの種類、どんな文字列をどのセルに配置してそういう現象が出るのか わからないと試しようもないし、答えようもありませんが、 >まったく同じように操作しているのに環境によって違うのでしょうか? 環境によってエラーが発生して動かなかったりする事は多々あります。 ダブルクォートが入ったりするかというのは、解かりません。 データによっては、あるのかもしれません。 必要なら ・OSの種類とバージョン ・Excelのバージョン(2003sp?) ・メーラーの種類とバージョン ・再現可能な最低限の文字列とセル位置情報 ・実際に実行したVBAコード を提示して新規に質問してみてください。 #環境的に私が試せない場合でも、他の方から回答あるかもしれません。

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

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

要件 1)クリップボード経由だとダブルクォートで囲まれる箇所がある 2)Bodyが改行されない 3)bodyが2,000文字くらいしか渡せない 4)メーラーを特定せず既定メーラーを起動したい 対応1) Clipboard経由で取得する時、セル内改行があるとダブルクォートで囲まれるのは仕様なので 配列から文字列を繋ぐ方式に変更。 選択セルValueを取得し、 >tmp = Selection.Value 配列の場合は >If IsArray(tmp) Then 縦方向(行数)分の配列aryを用意し >  ReDim ary(1 To UBound(tmp)) 複数列選択も考慮しApplication.Index関数を使って行ごとに文字連結する >  For i = 1 To UBound(tmp) >    ary(i) = Join(Application.Index(tmp, i, 0), "") >  Next 最後にaryを改行コードで連結 >  Arg = Join(ary, vbLf) 配列でない(単独セルの)場合はそのまま文字列として取得 >Else >  Arg = tmp >End If 対応2) mailtoプロトコルの起動オプションとしてBodyを渡す時、改行文字はURLエンコードする必要がある。 同時に、メーラーによっては文字化けするので条件分岐してSJIS/UTFエンコードする。 この辺り(も)、詳しくないので "VBA URLエンコード" などでGoogle検索などしてみてください。 http://orenolog.blogspot.com/2008/02/vbsvba-uri.html >Flg = InStr(1, sPath, "thunderbird", vbTextCompare) >If Flg Then >  'thunderbirdだと文字化けしたのでUTFエンコード >  With CreateObject("ScriptControl") >    .Language = "JScript" >    Arg = .CodeObject.encodeURI(Arg) >  End With >Else >  '簡易的にSJISエンコード >  b = StrConv(Arg, vbFromUnicode) >  Arg = "" >  For i = 0 To UBound(b) >    Arg = Arg & "%" & Right$("0" & Hex$(b(i)), 2) >  Next >End If 対応3) Shell関数を使えばmailtoプロトコルの起動オプションに2,000文字超渡せるみたい。 >Shell sPath & Arg この前に Debug.Print sPath & Arg としてイミディエイトウィンドウにShell関数に渡す文字列をチェックしてみてください。 例えば以下のような結果が出力されます。 "C:\Program Files\Mozilla Thunderbird\thunderbird.exe" -osint -compose mailto:メールアドレス?subject=件名&body=%E3%83%86%E3%82%B9%E3%83%88 対応4) (3)で指定する為に既定メーラーを取得する必要があります。(上記例ではthunderbird.exe) 既に紹介していますが http://jehupc.exblog.jp/9727243/ 既定メーラーはレジストリ値 "HKEY_CLASSES_ROOT\mailto\shell\open\command\" を見ると取得できるようです。 そこでWSHのRegReadメソッドとExpandEnvironmentStringsメソッドを利用して取得しています。 http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/ http://www.atmarkit.co.jp/fwin2k/operation/wsh07/wsh07_02.html >'既定メーラー取得(WinXP) >With CreateObject("WScript.Shell") >  sPath = .ExpandEnvironmentStrings(.RegRead(HKEY)) >End With 起動スイッチ『%1』『"%1"』は不要なので削除 >sPath = Replace$(Replace$(sPath, """%1""", ""), "%1", "") 以上のような感じで対応してます。更な詳細はVBA helpやweb検索などで調べてみてください。

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

質問者からのお礼

詳細な説明をわかりやすくしてくださりありがとうございます。 自分のExcel2007とOutlookの環境ではうまくいっていたのですが、昨日、他の人にも試してもらったらExcel2003で本文に一部ダブルクオートが入ってしまうと言われました。 まったく同じように操作しているのに環境によって違うのでしょうか?

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

ええと、現状のコード提示があればもっと適切なアドバイスができてたかもしれませんね。 >改行もされず本文が全部つながってしまい... >2千文字くらいしか入らないみたい... >通常使うメーラーが自動的に立ち上がるような形にしたい... との記述から推測するとmailtoコマンドを使ったものなのでしょう。 既定メーラーで、かつ改行問題までの対応なら Sub try_2()   Dim tmp, ary   Dim wrk As String   Dim i As Long   Dim x   If TypeName(Selection) <> "Range" Then Exit Sub   tmp = Selection.Value   If IsArray(tmp) Then     ReDim ary(1 To UBound(tmp))     For i = 1 To UBound(tmp)       ary(i) = Join(Application.Index(tmp, i, 0), vbTab)     Next     wrk = Join(ary, vbLf)   Else     wrk = tmp   End If   '改行処理   wrk = Replace$(wrk, vbLf, "%0a")   wrk = "mailto:メールアドレス?" & _      "subject=件名&" & _      "body=" & wrk   CreateObject("WScript.Shell").Run wrk   'ShellExecute 0&, "", wrk, "", "", vbNormalFocus End Sub こんな感じですが、2,000文字超だと無理です。 CreateProcess関数を使うとできそうな記事もありますがちょっとハードルが高そうです。 http://jehupc.exblog.jp/9751760/ #メーラーを起動させるところで止めるのなら #DataObjectを使って本文をClipboardにセットして[ctrl][v]でいいような気もしますけども。 ExcelVBAで送信までやるなら以下の方法が近道でしょう。 CDO.Message http://www.atmarkit.co.jp/fwin2k/win2ktips/428wshmail/wshmail.html http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_080.html BSMTP.dll http://www.hi-ho.ne.jp/babaq/index.html http://www.asahi-net.or.jp/~ef2o-inue/api/sub08_02_020.html

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

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

DataObject経由ではなく、配列から文字列を繋いでみたらどうでしょう。 メーラーが何かわからないですが、Outlookの場合は以下のような感じ。 Sub try()   Const olFolderInbox As Long = 6   Const olMailItem As Long = 0   Dim obj As Object   Dim i  As Long   Dim body, tmp      If TypeName(Selection) <> "Range" Then Exit Sub      With Selection     If .Columns.Count = 1 Then       body = Application.Transpose(.Value)     Else       tmp = .Value       ReDim body(1 To UBound(tmp))       For i = 1 To UBound(tmp)         body(i) = Join(Application.Index(tmp, i), vbTab)       Next     End If   End With      On Error Resume Next   Set obj = GetObject(, "Outlook.Application")   On Error GoTo 0   If obj Is Nothing Then     Set obj = CreateObject("Outlook.Application")     obj.GetNameSpace("MAPI").GetDefaultFolder(olFolderInbox).Display   End If      With obj.CreateItem(olMailItem)     .To = "メールアドレス"     .Subject = "件名"     .body = Join(body, vbLf)     .Display   End With   Erase body   Set obj = Nothing End Sub

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

質問者からのお礼

すみません、しばらく忙しくて体調も悪く、 おしえてgooにPCから投稿出来ない状態が続いていたのでお礼が遅くなってしまいました。 おしえていただいた方法でなんとか目的のものを作ることが出来ました。 まだちょっとよくわからないところもありますがありがとうございました。

質問者からの補足

数人で使おうと思っていますが、 人によってメーラーはまちまちで特に決まっていなくて、 できれば通常使うメーラーが自動的に立ち上がるような形にしたいと思っています。 ちょっとよく分かっていないのですが、 配列に入れれば問題は解決するのでしょうか?

関連するQ&A

  • Access から メーラーを起動してメール作成

    大変お世話になっております。 XP Pro + Access2000 でデータベースを作成しているのですが、少々困っております。 どうかご教示、もしくはアドバイスをお願いいたします。 ■Access2000より以下のスクリプトを使いメーラーを起動させメール雛形を自動作成させています。 Application.FollowHyperlink "mailto:" & Me.アドレス & _ "&subject=" & "コメントあり" & _ "&body=" & Me.コメント内容 & vbCrLf & vbCrLf メールの雛形自体はきちんと作成されるのですが、どうしても以下の2つの問題を解決する事ができません… (1) カーソルがsubjectの先頭にきてします。出来れば「コメント内容」の後にフォーカスさせたい (2) メーラーで自動署名をしているので「コメント内容」の後を改行して、署名を入れたい。 ※本文が例えば”テスト”ならこのようになってしまいます…   テスト山田太郎 これを…   テスト   山田太郎 どうかご教示、アドバイスの程よろしくお願いいたします。

  • メーラーの起動

    はじめまして。 ホームページ上からメールを送信できるようにしたいと思ってます。 クリックすると、雛形の文章があらかじめ表示された状態でメーラーが立ち上がってくるようにすることは可能なのでしょうか? (雛形メールはHTML形式の文章です。) HTMLのMailto:を使うと、テキスト形式の本文なら可能ですが、HTML形式の文章を本文としてセットすることはできないようなんです。。。 可能かどうかもよく分からない状態なので、行き詰っております。 ヒントでも良いので、詳しい方、回答お願いします。

  • メールのリンクタグについて

    メールにリンクするタグ<A HREF="mailto:・・・">でメーラーが起動できますが、この時<A HREF="mailto:・・・.jp ?body=">で本文の文字を打ち出せますが、件名も指定できるタグはあるものでしょうか?また本文に漢字を指定したら、文字化けします。これは英数字のみなのでしょうか?ご存知の方お教えくださいませ。

    • ベストアンサー
    • HTML
  • HTMLからメーラーを起動しメール送信

    こんにちわ。 ブラウザのフォームに入力された内容をメールで送信させたいと思っております。 開発しているサーバにはメールサーバソフトはいれてないので、メーラーを起動してメールを送ろうと考えております。(メールサーバはないことを前提にお願いします) そこで、<a href="mailto:・・・でメーラーの起動はできると思うのですが、ユーザーのオペレーションとして、メーラーの送信作業をせずに、メールを送ることは可能でしょうか。ブラウザであて先、タイトル、本文等を入力し、送信ボタンを押すだけで、ユーザー側のメーラーを起動し、送信させることはできないでしょうか。 よろしくお願いします。

  • 起動させたメールに件名や本文を入れる

    <A HREF="mailto:sample@tagindex.com?subject=お問い合わせ">メールはここへ</A> これで成功したのですが、 起動させたメールの本文を途中で改行させたいです。 <BR>をいれても意味がありませんでした。 どういう文字列をいれたら、改行されるのでしょうか?? ご存知の方がいらっしゃれば、是非教えて下さい。

    • ベストアンサー
    • HTML
  • EXCELでのメール作成

    EXCELを利用したメール作成で困っております。どなたか教示ください。 環境  OS:WinXP  EXCEL:2003  メール:Outlook mailtoを使用して下記のようにセルに記載してメール画面を起動しようとしています。 =HYPERLINK("mailto:"&A1&"?cc="&A2&"&subject="&A3&"&body="&A4,"あああ") A1・・・宛先のアドレス A2・・・CCで出したいアドレス A3・・・件名 A4・・・送りたい本文 本文例)  XX様    お世話になっております。  ご注文頂いたXXです。  下記日程で発送します。  XX月xx日  xx時着予定   ・   ・ ただ、EXCELの文字数制限(248文字?)により送信したい内容が本文に貼り付けられません。 送信したい内容には改行も含まれています。 なんとか貼り付ける方法はないでしょうか また SendMailを使って直接送ってしまうという方法は避けたいと思っています よろしくお願いいたします。

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

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

  • Excelからmailto:でメール送信

    セルを押せばクライアントのメールソフトが起動するよう mailto:でメール送信をさせたいです。 mailto:お名前?subject=例の件&body=あれはどうなった? と入れれば件名も本文もあらかじめ設定できますよね? そこで質問なんですが、 1.このままだと本文にはズラズラ一行しか入れることが  出来ません。改行して複数行の本文にしたい場合はどう  すればよいでしょうか? 2.bodyを別セル(例えばA2セルから)参照で拾いたい場合  はどうしたらよいでしょう?なるべくならマクロ化せず  ワークシート関数で済ませれたら嬉しいです。   如何でしょうか?

  • ノーツを起動すると、メーラーが普段使っているものから変わって困ってます。

    グループウェアとしてノーツを使っていますが、ノーツを起動したあと、通常使っているメーラー(ベッキー)からノーツメールへと「mailto:」で起動するメーラーが変わってしまいます。正直困っています。 なにとぞよろしくお願いします。

  • mailtoのメーラー起動型で、Subjectに日本語を入れるとメーラー起動後に文字化け。どうやったら治るでしょうか?

    HTMLのソース制作で、mailtoのメーラー起動型の問い合わせをつくらなければなりません。 ところが、以下のようにSubjectに日本語を入れてブラウザでHTMLを表示させて、このmailtoの電子メールリンクをクリックすると、メーラーが起動してメール作成画面に自動的に送信先とSubjectにHTMLで記述した情報が掲載されますよね。 mailto:info@mydomain.com?Subject=お問い合わせ(from ポップ素顔.jp) このSubjectの日本語の部分が何故か文字化けしてしまいます。 OutlookExpress、その他のメーラーでもそうなりました。 全部のメーラーには無理な理由が仮にあれば仕方ないですが、少なくともOutlookExpressでは化けないようにしたいです。 サイトが沢山あるので、どのサイトからの問い合わせなのか掴む必要があるし、サイトが日本語ドメインなので日本語のままでメーラーのメール作成画面のSubjectにできうる限り表示させたいのです。 どうやったら治るでしょうか?

    • ベストアンサー
    • HTML