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

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

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

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

コードレビュー

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

Q&A

解決済

1回答

3928閲覧

Replace関数でメール文の文字を置換したいです。

harryban

総合スコア4

VBA

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

コードレビュー

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

0グッド

0クリップ

投稿2021/07/16 22:48

前提・実現したいこと

エクセルリストシート(Teilnehmerliste_eng)上の各メールアドレス宛に各々に作成したpdfを送信するシステムを作成しています。シート"MailTemplate"上にメールのテンプレートを記載しており、メール内容にはTeilnehmerliste_eng上の参加者名等をReplace関数にて挿入します。

自学しているもののマクロ初心者で、拙いコードで申し訳ないのですが、説明に不足がございましたら訂正、追記させていただきますので、どうか皆様のアドバイスをいただければ幸いです。

発生している問題・エラーメッセージ

pdf送信コードを作成し、作動させたところ、Run-time error"-2147024894 (80070002)" Cannot find this fileが表示されますが、pdfは問題なく送信されました。試しにOn Error GoTo ErrorHandlerで強制終了させたところ、エラー表示なくpdfそうしんできるようになりました。 しかしReplace関数を挿入したところ、どの文字も置換されないままテンプレート文が送信されてしまいます。

該当のソースコード

Sub sendpdf() Dim oApp Dim Wm_ITEM Dim Wm_TO Set oApp = GetObject(, "Outlook.Application") Dim folder As String Dim FileName As String Dim row As Long Dim shname As String Dim ListSheet As String '参加者リストTeilnehmerliste_engでは2行目から参加者情報が記載されているため、row=2としています。 row = 2 shname = "MailTemplate" ListSheet = "Teilnehmerliste_eng" On Error GoTo ErrorHandler Do Until row = ThisWorkbook.Sheets(ListSheet).Cells(Rows.Count, 1).End(xlUp).row 'open Outlook Set Wm_ITEM = oApp.CreateItem(0) Wm_TO = "" WS_OutLk = "" '参加者リストTeilnehmerliste_engでは3列目にメールアドレスが記載されているため、Cells(row,3)としています。メールテンプレートシートMailTemplateにはCells(1,2)に件名、Cells(2,2)にメールテンプレートが記載されています。 Wm_ITEM.To = ThisWorkbook.Sheets(ListSheet).Cells(row, 3) Wm_ITEM.Subject = ThisWorkbook.Sheets(shname).Cells(1, 2) Wm_ITEM.Body = ThisWorkbook.Sheets(shname).Cells(2, 2) 'メールテンプレートMailTemplate Cells(2,2)上の文字Attendantに参加者リスト上Cells(row, 2)の参加者名、<Title>に参加者リストCells(2,4)のタイトル、<Date>に参加者リストCells(2,5)の日付、<Formslink>に参加者リストCells(3,9)のリンクを挿入(置換)します。 Wm_ITEM.Body = Replace(ThisWorkbook.Sheets(shname).Cells(2, 2), "Attendant", ThisWorkbook.Sheets(ListSheet).Cells(row, 2)) Wm_ITEM.Body = Replace(ThisWorkbook.Sheets(shname).Cells(2, 2), "<Title>", ThisWorkbook.Sheets(ListSheet).Cells(2,4)) Wm_ITEM.Body = Replace(ThisWorkbook.Sheets(shname).Cells(2, 2), "<Date>", ThisWorkbook.Sheets(ListSheet).Cells(2,5)) Wm_ITEM.Body = Replace(ThisWorkbook.Sheets(shname).Cells(2, 2), " <Formslink>", ThisWorkbook.Sheets(ListSheet).Cells(3,9)) 'attach certificate FileName = ThisWorkbook.Path & "_" & ThisWorkbook.Worksheets(ListSheet).Cells(row, 2).Value & _ "_" & Format(Date, "yyyymmdd") & "_.pdf" Wm_ITEM.Attachments.Add FileName Wm_ITEM.display 'Draft mail & send Wm_ITEM.Save Wm_ITEM.Send row = row + 1 Loop MsgBox "Sent certificate" Exit Sub ErrorHandler: MsgBox "Sent certificate" End Sub

試したこと

On Errorを消してDebug Step Intoを試したところ、Run-time error"-2147024894 (80070002)" Cannot find this fileが表示されますが、pdfは問題なく送信されます。

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

アドバイスいただきたい優先順位として①Replace関数がうまくいかない原因をご教授いただければ幸いです。もし可能であれば、②On Errorを使用しなくても良い方法、③現在vba実行に時間がかかっているので、コードを短縮できる方法もアドバイス頂けると非常に有難いです。

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

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

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

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

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

meg_

2021/07/16 23:53

> Run-time error"-2147024894 (80070002)" Cannot find this file エラーは何処で発生していますか?
m.ts10806

2021/07/17 00:10 編集

Replace後に全部上書きしてませんか。 > Wm_ITEM.Body = Replace(ThisWorkbook.Sheets(shname).Cells(2, 2), "Attendant", ThisWorkbook.Sheets(ListSheet).Cells(row, 2)) Wm_ITEM.Body = Replace(ThisWorkbook.Sheets(shname).Cells(2, 2), "<Title>", ThisWorkbook.Sheets(ListSheet).Cells(2,4)) Wm_ITEM.Body = Replace(ThisWorkbook.Sheets(shname).Cells(2, 2), "<Date>", ThisWorkbook.Sheets(ListSheet).Cells(2,5)) Wm_ITEM.Body = Replace(ThisWorkbook.Sheets(shname).Cells(2, 2), " <Formslink>", ThisWorkbook.Sheets(ListSheet).Cells(3,9)) hoge = "a" hoge = "b" hoge = "c" と書いたらhogeが保持するのは "c" だけですよね。
harryban

2021/07/17 00:45

お返事いただきありがとうございます。エラーはWm_ITEM.Attachments.Add FileNameで発生しています。Body内の4箇所を変換するためにWm_ITEM.Body = Replaceを4回に分けて記載したのですが、もし一回で書く方法があればご教授いただけますでしょうか。
m.ts10806

2021/07/17 01:03

1”行”は可能です。 一番中から実行されるので、Replaceの結果をReplaceの結果をReplace を繰り返した情報だけ設定する。
m.ts10806

2021/07/17 01:04

body = hoge(hoge(hoge(content)))
harryban

2021/07/17 02:16

アドバイスいただきありがとうございます。今回の場合ですと、myContent = Replace(Replace(Replace(Replace(myContent, "Attendant", ThisWorkbook.Sheets(ListSheet).Cells(row, 2), "<Title>", ThisWorkbook.Sheets(ListSheet).Cells(2,4), "<Date>", ThisWorkbook.Sheets(ListSheet).Cells(2,5), " <Formslink>", ThisWorkbook.Sheets(ListSheet).Cells(3,9))と1行にできるのですね。とても勉強になります。ありがとうございます。
m.ts10806

2021/07/17 02:35

入れ子にしまくると展開が見えづらくなるので、規則性があるなら設定値を配列(とかディクショナリー)にしてループさせるのもありです。 定量的な処理なら関数作って外出しするのもあり。 そこは要件と考え方次第
guest

回答1

0

ベストアンサー

【Replaceについて】
下記のような書き方ではどうでしょうか?

vba

1Dim myContent as String 2 3myContent = ThisWorkbook.Sheets(shname).Cells(2, 2) 4myContent = Replace(myContent, "Attendant", ThisWorkbook.Sheets(ListSheet).Cells(row, 2)) 5myContent = Replace(myContent, "<Title>", ThisWorkbook.Sheets(ListSheet).Cells(2,4)) 6myContent = Replace(myContent, "<Date>", ThisWorkbook.Sheets(ListSheet).Cells(2,5)) 7myContent = Replace(myContent, " <Formslink>", ThisWorkbook.Sheets(ListSheet).Cells(3,9)) 8Wm_ITEM.Body = myContent 9

投稿2021/07/17 00:08

meg_

総合スコア10760

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

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

harryban

2021/07/17 00:59

いただいた書き方を試したところ、うまく置換されました。また、繰り返し記載しているThisworkbook箇所を代数に置き換えることも学ぶことができました。丁寧かつ迅速なご回答本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問