いろいろ検索や質問をしてエクセルVBAで、下記のコードによりOutlookのメールを自動作成できるようになりました。

Sub TEST01()
Set oApp = CreateObject("Outlook.Application")
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0
strMOJI = "こんにちは!" & vbNewLine & "テストメールです。" & vbNewLine & "よろしくおねがいします。"
objMAIL.To = "XXXX@XXXXX.co.jp" '宛先
objMAIL.Subject = "テスト" '件名
objMAIL.Body = strMOJI '本文の代入
objMAIL.display '表示
End Sub

それで、実際にはstrMOJI に代入した文字列の下に、このマクロを記述してあるBOOKのSheets("Sheet1").Range("A1:D10")をコピーし、
「リッチテキスト形式」で貼り付けたいのです。
どのようなコードに変えればよいのか教えていただけると助かります。
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>ただ、マクロを2回以上走らせると、その都度いくつもOutlookが立ち上がってしまいます。


>これは解消できますか?
それは前回QAで手当て済みだったんですけどね。

Dim oApp    As Object
Dim objMAIL  As Object
Dim strMOJI(1) As String
Dim n     As Long

On Error Resume Next
Set oApp = GetObject(, "Outlook.Application")
On Error GoTo 0
If oApp Is Nothing Then
  Set oApp = CreateObject("Outlook.Application")
  oApp.GetNamespace("MAPI").GetDefaultFolder(6).display
End If

Set objMAIL = oApp.CreateItem(0)
strMOJI(0) = "こんにちは!" & vbCrLf & _
       "テストメールです。" & vbCrLf & _
       "よろしくおねがいします。" & vbCrLf
strMOJI(1) = "以上です。" & vbCrLf & _
       "EMAX株式会社" & vbCrLf & _
       "Emax"
objMAIL.To = "E-Mail_Address_Here"
objMAIL.Subject = "テスト"
objMAIL.BodyFormat = 2 'HTML形式
objMAIL.Body = strMOJI(0) & strMOJI(1)
objMAIL.display

n = Len(strMOJI(0))
ActiveSheet.Range("A1:D10").Copy
oApp.ActiveInspector.WordEditor.Range(n, n).Paste
Application.CutCopyMode = False

Set objMAIL = Nothing
Set oApp = Nothing

BodyFormatはHTML形式じゃないと書式が維持できないような感じです。
#バージョン、もしくは受信側のメーラーによるかもしれませんけど..
    • good
    • 2
この回答へのお礼

何から何までありがとうございます。
わからないことだらけですが、やりたいことができました。
感謝いたします。
これからもご指導賜りますようお願い申し上げます。

お礼日時:2012/08/17 17:58

>なお、エクセルのバージョンは2010、Outlookは2007です。


EnvelopeVisibleプロパティは同一バージョンでないとエラーになるようです。(by Google君)
次案ですが、Sendkeysはトばして..Outlookのオプションの「メール形式」のところで
「電子メールの編集に..Word..を使用する..」的なチェックがあったらチェック入れておいて下記試してみて下さい。
#Outlook2007持ってないのでアヤフヤ

Dim oApp  As Object
Dim objMAIL As Object
Dim strMOJI As String

Set oApp = CreateObject("Outlook.Application")
oApp.GetNamespace("MAPI").GetDefaultFolder(6).display
Set objMAIL = oApp.CreateItem(0)
strMOJI = "こんにちは!" & vbNewLine & _
     "テストメールです。" & vbNewLine & _
     "よろしくおねがいします。" & vbNewLine
objMAIL.To = "E-Mail_Address_Here"
objMAIL.Subject = "テスト"
objMAIL.BodyFormat = 3
objMAIL.Body = strMOJI
objMAIL.display
ActiveSheet.Range("A1:D10").Copy
With oApp.ActiveInspector.WordEditor.Range
  .Collapse 0
  .Paste
End With
Application.CutCopyMode = False
Set objMAIL = Nothing
Set oApp = Nothing
    • good
    • 1
この回答へのお礼

ありがとうございます。
すごいです!

> 「電子メールの編集に..Word..を使用する..」的なチェックがあったらチェック入れておいて

見当たらないのでなにもしませんでしたがちゃんと出来ました。
ただ、マクロを2回以上走らせると、その都度いくつもOutlookが立ち上がってしまいます。
これは解消できますか?
また、ここまでできると欲が出てしまいました。
下記のように文字列の変数を2つもち、セル範囲を貼り付けた下にも文字列 strMOJI(1) を入れることは可能でしょうか?
勝手なことばかり言って申し訳ありません。

Sub twst02()
Dim oApp As Object
Dim objMAIL As Object
Dim strMOJI(1) As String

Set oApp = CreateObject("Outlook.Application")
oApp.GetNamespace("MAPI").GetDefaultFolder(6).display
Set objMAIL = oApp.CreateItem(0)
strMOJI(0) = "こんにちは!" & vbNewLine & _
"テストメールです。" & vbNewLine & _
"よろしくおねがいします。" & vbNewLine
strMOJI(1) = "以上です" & vbNewLine & _
"EMAX株式会社" & vbNewLine & _
"Emax"
objMAIL.To = "E-Mail_Address_Here"
objMAIL.Subject = "テスト"
objMAIL.BodyFormat = 3
objMAIL.Body = strMOJI(0)
objMAIL.display
ActiveSheet.Range("A1:D10").Copy
With oApp.ActiveInspector.WordEditor.Range
.Collapse 0
.Paste
End With
Application.CutCopyMode = False
Set objMAIL = Nothing
Set oApp = Nothing
End Sub

お礼日時:2012/08/16 18:10

HTML形式ではダメなんでしょうか。


こちらにサンプルが載ってますし
『Excel 2002 または Excel 2003 で Visual Basic for Applications を使用して電子メール メッセージでセル範囲を送信する方法』
http://support.microsoft.com/kb/816644/ja

上記例のままでも[この選択範囲を送信する]で送信。
必要なら新規Bookにコピーするように変更したり。
Sub try()
  Dim r As Range
  Set r = ActiveSheet.Range("A1:D10")
  With Workbooks.Add(xlWBATWorksheet)
    .EnvelopeVisible = True
    With .Sheets(1)
      With .MailEnvelope
        .Introduction = "こんにちは!" & vbNewLine & "テストメールです。" & vbNewLine & "よろしくおねがいします。"
        .Item.To = "E-Mail_Address_Here"
        .Item.Subject = "テスト"
        '.Item.Send
      End With
      r.Copy .Range("A1")
    End With
  End With
End Sub

他には
・不安定だけど妥協してSendkeysを使う。
・(Outlookメール編集にWordを使っている場合)OutlookのActiveInspector.WordEditor.Range.Pasteメソッドを使う。
・セル範囲をhtm形式に吐き出してHTMLBodyに読み込む。(HTML形式メール)
・Win32API関数を使ってクリップボードからHTML Formatを取り出してHTMLBodyに読み込む。(HTML形式メール)
などが考えられない事もないです。
    • good
    • 0
この回答へのお礼

end-uさん、前回もありがとうございました。
今回もさっそくありがとうございます。

試してみましたが、参考URLのものも、end-uさんご提示のものも

.EnvelopeVisible = True

のところで実行時エラー1004「EnvelopeVisibleメソッドは失敗しました。Workbookオブジェクト」となります。
なお、エクセルのバージョンは2010、Outlookは2007です。

> HTML形式ではダメなんでしょうか

貼り付けたあと、編集が可能ならOKです。

お礼日時:2012/08/16 14:36

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsheet1、sheet2の値をsheet3に集めたい。

エクセルについて教えてください。

山田君のテストの結果
sheet1に、中間テスト結果A1B1C1D1E1、
sheet2に、期末テスト結果A1B1C1D1E1があり、
sheet3のA1B1C1D1E1、A2B2C2D2E2に
移動させていと考えています。

されに、小島さんのテスト
中間テスト結果が、sheet1のA2B2C2D2E2、
期末テスト結果が、sheet2のA2B2C2D2E2
にあり、それら2つを
sheet3のA3B3C3D3E3、A4B4C4D4E4
に続けて移動させたいです。

実際は、2人だけではなく、
約200人以上を続けてsheet3に集めたいと思っています。
連続的に集めるためには、
どうすればよいか教えてください。
よろしくお願いします。

Aベストアンサー

より簡単な方法はたとえばSheet1のF1セルに1、F2せるに3と入力してからF1とF2セルを選択して下方にオートフィルドラッグします。
これで番号が規則的に振られます。
次にSheet2でも同じようにF列で2,4と入力して下方にオートフィルドラッグします。
その後にSheet1 とSheet2をそれぞれコピーしたうえでSheet3にそれぞれ貼り付けます。
その後にF列を重点に昇順で並べ替えをすればよいでしょう。

Qマクロの質問ですが、複数有るシートの中のSheet1~Sheet54の

マクロの質問ですが、複数有るシートの中のSheet1~Sheet54のセルC14:E14,E12,C16:E46
だけ消したいのですが、どう書けばよろしいですか、シート名Sheetから、始まる物と別に
日本語のシート名の物がありますが 
よろしくお願いします。

Aベストアンサー

方法はいつくもありますが、、、

'-----------------------------------------
Sub Test()
 Dim i As Integer
 For i = 1 To Sheets.Count
   If Sheets(i).Name Like "Sheet*" Then
     Sheets(i).Range("C14:E14,E12,C16:E46").ClearContents
   End If
 Next i
End Sub
'----------------------------------------


また、Sheetを検出する部分は次のように
シート名の左から5桁が、"Sheet”だったらというふうにもかけます

  If Left(Sheets(i).Name, 5) = "Sheet" Then

以上です。
 

Qエクセルで”=Sheet1!A1”など、関数?を出力しているセルを、他

エクセルで”=Sheet1!A1”など、関数?を出力しているセルを、他のセルにコピーしたいのですがどうしたらいいのでしょう?
普通に、そのようなセル達をある範囲で選択してコピーしても、=Sheet1!#REF! となって、エラー?のようになります。。出力されたデータだけをそのままコピーしたいのです。(関数とかはコピー先には持って行きたくない)初心者で、伝わりにくいかもですが、どうぞよろしくお願い致しますm(_ _)m ちなみにOSはXPで、エクセルVerはエクセル2002SP3です。よろしくお願いします。

Aベストアンサー

セルをコピー後、貼り付け先を指定して右クリック。
「形式を選択して貼り付け」をクリックし、
表示されたダイアログで「値」を選んで「OK」します。

これで、コピー元に表示されている内容が貼り付けできます。

Q別のSubで宣言されている変数を別のSubで参照

よろしくお願いいたします。

環境:Excel2003

以下のようなイメージで別Sub内で宣言された変数を同じ変数名で別のSub内で参照したいです。

Sub hoge()
nn As Integer
nn = 1
End Sub

Sub hogehoge()
MsgBox (nn)
End Sub

Sub hogehogehoge()
Call hoge
Call hogehoge
End Sub

エラーが発生する為、typeについて検索をかけてみました所、以下のような変数参照方法は出てきましたが、別のSubで宣言されている変数を同じ変数名で別のSub内で参照する方法はないでしょうか?

Type PData
   hoge As String
   hogehoge As Long
End Type

Sub Sample1()
   Dim Pppp(5) As PData
End Sub

よろしくお願いいたします。

Aベストアンサー

初めのうちはグローバル変数を使う方法でもいいのですが、
慣れてきたらグローバル変数ではなく、
HogeHogeに引数を持たせる方法を使った方がいいでしょう。
なぜ?
それは慣れてくれば分かってきます。

'-----HogeHogeを引数付きでコールする------

Sub Hoge()
  Dim nn As Integer
  nn = 1
  Call HogeHoge( nn )
End Sub

'-----これに引数を持たせる-------

Sub HogeHoge( nn As Integer)
  MsgBox nn
End Sub

'------Hogeだけをコールする-----

Sub HogeHogeHoge()
  Call Hoge
End Sub

'--------------------------------

以上ここまで。
 

QExcel2003 Sheet1とSheet2を比較して条件にあった処理を行いたいです。

先輩方、教えてください。
Excel2003ですが、
いろいろやってみましたがうまくいきません。
■前提
○sheet1とseet2に件数の異なる商品一覧シートがあります。

(Sheet1の方が数件多い)
○sheet1は、A列に商品コードのみ値が入っている。
○sheet2は、A列に商品コード、B列に商品名、C列に入数が入っている。
○結果が出せれば関数、VBAは問いません。

■行いたいこと
①A列にある商品コードをsheet1、sheet2から探し、sheet2にあるb列~c列をA列に繋げたい。
②Sheet1とSheet2の差異を分かる形で表示したい。(色替え、C列に何らかの表示等問いません。)
③できればヘッダーも表示させたい。
(例)
●Sheet1
商品コード
0001
0002
0003
0004

●Sheet2
商品コード,商品名,入数
0001,魚,2
0003,肉,5
0004,水,1

●求める結果
商品コード,商品名,入数,フラグ
0001,魚,2,○
0002,,,×
0003,肉,5,○
0004,水,1,○
どうぞ、ご教示のほど、よろしくお願いいたします。

先輩方、教えてください。
Excel2003ですが、
いろいろやってみましたがうまくいきません。
■前提
○sheet1とseet2に件数の異なる商品一覧シートがあります。

(Sheet1の方が数件多い)
○sheet1は、A列に商品コードのみ値が入っている。
○sheet2は、A列に商品コード、B列に商品名、C列に入数が入っている。
○結果が出せれば関数、VBAは問いません。

■行いたいこと
①A列にある商品コードをsheet1、sheet2から探し、sheet2にあるb列~c列をA列に繋げたい。
②Sheet1とSheet2の差異を分かる形で表示した...続きを読む

Aベストアンサー

VLOOKUP関数で拾ってきて、対象が無くてエラーになったら空白、そして「×」を表示させればよい。

>■行いたいこと
>①A列にある商品コードをsheet1、sheet2から探し、sheet2にあるb列~c列をA列に繋げたい。
 ↓
 ①sheet1のA列にある商品コードをsheet2から探し、該当する行のB列とC列の値をsheet1のB列とC列に表示したい。
だろうと脳内変換してみた。

sheet1のB列には、
 =VLOOKUP(A1,sheet2!A:A,2,0)
sheet1のC列には、
 =VLOOKUP(A1,sheet2!A:A,3,0)
の数式を基本とし、エラーに対する数式を加え、
 =IF(ERROR(VLOOKUP(A1,sheet2!A:A,2,0)),"",VLOOKUP(A1,sheet2!A:A,2,0))
 =IF(ERROR(VLOOKUP(A1,sheet2!A:A,3,0)),"",VLOOKUP(A1,sheet2!A:A,3,0))
とする。
sheet1のD列には、B列またはC列に価があれば「〇」なければ「×」を表示する数式をIF関数を使って記述すればよい。
(この数式は省略。簡単でしょ。)

VLOOKUP関数で拾ってきて、対象が無くてエラーになったら空白、そして「×」を表示させればよい。

>■行いたいこと
>①A列にある商品コードをsheet1、sheet2から探し、sheet2にあるb列~c列をA列に繋げたい。
 ↓
 ①sheet1のA列にある商品コードをsheet2から探し、該当する行のB列とC列の値をsheet1のB列とC列に表示したい。
だろうと脳内変換してみた。

sheet1のB列には、
 =VLOOKUP(A1,sheet2!A:A,2,0)
sheet1のC列には、
 =VLOOKUP(A1,sheet2!A:A,3,0)
の数式を基本とし、エラーに対する数式を加え、
 =I...続きを読む


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

人気Q&Aランキング

おすすめ情報