質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

3回答

2499閲覧

VBAメール送信&PDF添付がうまくいきません。コードを見ていただけると助かります。

rotaww

総合スコア3

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2021/07/25 00:29

編集2021/07/25 02:39
Option Explicit Sub sendmail() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("mail") Dim OutApp As Outlook.Application Set OutApp = New Outlook.Application Dim R As Long, lastrow As Long lastrow = ws.Cells(2, 1).End(xlDown).Row For R = 3 To lastrow Dim OutMail As Outlook.MailItem Set OutMail = OutApp.CreateItem(olMailItem) Dim BodyOfMail As String BodyOfMail = CreateBodyOfMail(ws, R) 'PDFファイル名生成 Dim R As Cells, ws As Object, dt As Variant Set R = Cells(3, 7) Set ws = CreateObject("WScript.shell") dt = ws.SpecialFolders("Desktop") & "\" & "返信.pdf" With OutMail .SendUsingAccount = Session.Accounts(aaaaa@aaa.com) .To = ws.Cells(R, 5).Value .CC = ws.Cells(R, 6).Value & bbb@bbb.com & ccc@ccc.com & ddd@ddd.com .subject = Replace(ws.Cells(2, 10).Value, "コード", ws.Cells(R, 3).Value, "都道府県", ws.Cells(R, 2).Value) .body = BodyOfMail .Attachments.Add dt & " .pdf" End With OutMail.Save Set OutMail = Nothing Next R End Sub Function CreateBodyOfMail(ws As Worksheet, R As Long) As String Dim shimei As String, link As String shimei = ws.Cells(R, 4).Value shisetsu = ws.Cells(R, 2).Value Dim subject As String subject = ws.Cells(2, 2).Value subject = Replace(subject, "都道府県", todou) subject = Replace(subject, "コード", code) Dim body As String body = ws.Cells(3, 10).Value body = Replace(body, "名前", shimei) body = Replace(body, "都道府県", todou) body = body & vbCrLf CreateBodyOfMail = body End Function ```### 前提・実現したいこと メール一斉作成PDF添付付きのコードを作成しています。 件名はエクセルの(2,10)にあり、件名中の(コード:都道府県)の箇所にエクセルのコード→(R,3)、都道府県→(R,2)を挿入したいと考えています。 本文にも名前と都道府県を挿入したく、名前はsimei 都道府県はtodou と命名しています。 それぞれエクセルの箇所は、名前→(r,4) 都道府県→(R,2)にあります。 また、PDFはデスクトップに置き、返信.pdfの名前を付けて保存しております。 エラーメッセージが発生してしまい、困っております。

コンパイルエラー ユーザー定義型は定義されていません。

### 該当のソースコード R As Cells ```ここに言語名を入力 ソースコード

試したこと

いろいろ調べてみたのですが改善されず困っております。
具体的には調べたのですが、エラー箇所から進めず困っています。

補足情報(FW/ツールのバージョンなど)

あと、可能でありましたら本文中の氏名と都道府県を太字にしたいのですがこちらもうまくいきません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/07/25 00:36 編集

・コードは「コードの挿入」で記入してください。 ・エラー発生箇所はどこでしょうか? ・エラーメッセージを提示してください。 > いろいろ調べてみたのですが改善されず困っております。 具体的にお願いします。
sazi

2021/07/25 01:13

どのような参照設定を行っているのかも追記して下さい。
rotaww

2021/07/25 02:41

saziさん、本当に素人でネット検索にてコードを作成したので参照設定もよくわからないので教えていただけますでしょうか。すみません。
guest

回答3

0

エラーメッセージが発生してしまい、困っております。

ネット検索にてコードを作成したので参照設定もよくわからないので教えていただけますでしょうか。

単にコピペの継ぎはぎしてるからです。

参照設定をクリアしても、変数が重複したりもしてますので、同じコピペするにしても、一つずつエラーの無い状態にしてから、次のコピペを行うようにして下さい。

投稿2021/07/25 05:57

編集2021/07/25 06:08
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

まず、いきなりやみくもにコードをコピペして何とかしようとするのはやめましょう。
マクロで使用される VBA は「言語」です。
単語の意味や文法もわからずにコピペで作ったプログラムではまともに動作しないでしょうし、何か問題があっても自分ではどうにもできないでしょう。
以下の URL から VBA の言語に関するトピックにアクセスできますので、これらを一通り理解してマクロを作成してください。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/visual-basic-conceptual-topics

提示いただいたマクロをある程度動作するように修正したマクロは以下の通りです。
コメントで修正した内容について記載しています。

VBA

1Option Explicit 2 3Sub sendmail() 4 Dim ws As Worksheet 5 Set ws = ThisWorkbook.Sheets("mail") 6 7 ' 参照設定がなくても以下なら動作します。 8 Dim OutApp As Variant ' Outlook.Application 9 ' 参照設定がなくても以下なら動作します。 10 Set OutApp = CreateObject("Outlook.Application") ' New Outlook.Application 11 12 Dim R As Long, lastrow As Long 13 lastrow = ws.Cells(2, 1).End(xlDown).Row 14 15 ' 3 で良いのでしょうか? 3 行目には本文があるのでは? 16 For R = 3 To lastrow 17 ' 参照設定がなくても以下なら動作します。 18 Dim OutMail As Variant 'Outlook.MailItem 19 ' 参照設定がなくても以下なら動作します。 20 Set OutMail = OutApp.CreateItem(0) ' olMailItem) 21 22 Dim BodyOfMail As String 23 BodyOfMail = CreateBodyOfMail(ws, R) 24 25 'PDFファイル名生成 26 ' R や ws ってすでに使ってますよね? 27 'Dim R As Cells, ws As Object, dt As Variant 28 Dim wShell As Object, dt As Variant 29 ' ここで設定した R の Cells(3, 7) の値って使ってないようです。 30 'Set R = Cells(3, 7) 31 32 Set wShell = CreateObject("WScript.shell") 33 ' パス区切りが全角バックスラッシュになってます 34 'dt = ws.SpecialFolders("Desktop") & "\" & "返信.pdf" 35 dt = wShell.SpecialFolders("Desktop") & "\" & "返信.pdf" 36 37 With OutMail 38 ' Session を直接使えたり、Accounts の Item を省略できるのは Outlook VBA の中だけです。 39 ' また、文字列は "" でくくる必要があります。 40 '.SendUsingAccount = Session.Accounts(aaaaa@aaa.com) 41 .SendUsingAccount = OutApp.Session.Accounts.Item("aaaaa@aaa.com") 42 .To = ws.Cells(R, 5).Value 43 ' 文字列は "" でくくる必要があり、複数アドレスを指定する場合はアドレス文字列の間に ; が必要です。 44 '.CC = ws.Cells(R, 6).Value & bbb@bbb.com & ccc@ccc.com & ddd@ddd.com 45 .CC = ws.Cells(R, 6).Value & ";bbb@bbb.com;ccc@ccc.com;ddd@ddd.com" 46 ' Replace 関数は一度に一つの文字列を置き換えます。複数の文字列を置き換えることはできません。 47 '.subject = Replace(ws.Cells(2, 10).Value, "コード", ws.Cells(R, 3).Value, "都道府県", ws.Cells(R, 2).Value) 48 .Subject = Replace(ws.Cells(2, 10).Value, "コード", ws.Cells(R, 3).Value) 49 .Subject = Replace(.Subject, "都道府県", ws.Cells(R, 2).Value) 50 .body = BodyOfMail 51 ' dt には既に拡張子 .pdf がついています 52 .Attachments.Add dt ' & " .pdf" 53 End With 54 55 OutMail.Save 56 Set OutMail = Nothing 57 Next R 58End Sub 59 60Function CreateBodyOfMail(ws As Worksheet, R As Long) As String 61 ' link って使ってませんよね? 62 Dim shimei As String ', link As String 63 shimei = ws.Cells(R, 4).Value 64 65 ' shisetsu って宣言してませんし、後でも使ってませんよね? 66 'shisetsu = ws.Cells(R, 2).Value 67 ' subject って結局この関数の中で使っているだけで実際の件名には使われてないですよね? 68 'Dim subject As String 69 'subject = ws.Cells(2, 2).Value 70 'subject = Replace(subject, "都道府県", todou) 71 'subject = Replace(subject, "コード", code) 72 73 ' 都道府県の取得の記述が必要です。 74 Dim todou As String 75 todou = ws.Cells(R, 2).Value 76 77 Dim body As String 78 body = ws.Cells(3, 10).Value 79 body = Replace(body, "名前", shimei) 80 body = Replace(body, "都道府県", todou) 81 body = body & vbCrLf 82 CreateBodyOfMail = body 83End Function 84

なお、氏名と都道府県を太字にしたいということになると、本文形式に HTML を使用する必要があります。
HTML の書き方がわからないようであれば素直にあきらめていただいたほうが良いです。
もし、HTML がわかるなら Cell(3, 19) の本文の内容を HTML で記述し、.body = BodyOfMail を .htmlbody = BodyOfMail としてください。

投稿2021/07/26 06:49

millefeuille

総合スコア226

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rotaww

2021/08/01 01:37

ありがとうございます。施設→都道府県に変更したのを失念しておりました。 勉強になりました。
rotaww

2021/08/08 10:58

millefeuille様、お世話になっております。度々で申し訳ごじざいません。この度はマクロのご教示をいただきありがとうございました。 教えていただいた、コードにて作成させていただいたのですが 送信元のみ変更できず苦戦しております。再度教えていただくことは可能でしょうか。
guest

0

わからないから聞いております。
どなたか親切な方教えていただけますと助かります。
ネットで調べたので切り貼りしているのは承知でございす。

投稿2021/07/25 08:46

rotaww

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2021/07/25 09:32 編集

同じ切り貼りするにしても、一度にではなく少しずつやってみて下さいと言っているんですが。 どのような動作するかは関係なく、コンパイルエラーにならないように教えるだけでいいんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問