<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Outlook操作 | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<atom:link href="https://officevba.info/category/excelvba/outlook%e6%93%8d%e4%bd%9c/feed/" rel="self" type="application/rss+xml" />
	<link>https://officevba.info</link>
	<description>仕事の役に立つVBA・GAS・Pythonのコードを紹介していきます。</description>
	<lastBuildDate>Wed, 09 Jun 2021 08:13:26 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://officevba.info/wp-content/uploads/2017/04/cropped-Excel_1-32x32.jpg</url>
	<title>Outlook操作 | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<link>https://officevba.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBAでOutlookのメールを作成する際に署名を表示させる方法</title>
		<link>https://officevba.info/outlooksignatures/</link>
					<comments>https://officevba.info/outlooksignatures/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 06 Sep 2020 12:57:08 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<category><![CDATA[Outlook]]></category>
		<category><![CDATA[メール作成署名]]></category>
		<category><![CDATA[ユーザー定義関数]]></category>
		<category><![CDATA[差し込み]]></category>
		<guid isPermaLink="false">https://officevba.info/?p=2173</guid>

					<description><![CDATA[目次 Outlookの署名をVBAで自動追加する方法が案外難しい署名の内容の呼び出しと取り込み方法について署名を追加した状態でOutlookメールを作成するExcelVBA Outlookの署名をVBAで自動追加する方法 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Outlookの署名をVBAで自動追加する方法が案外難しい</a></li><li><a href="#toc2" tabindex="0">署名の内容の呼び出しと取り込み方法について</a></li><li><a href="#toc3" tabindex="0">署名を追加した状態でOutlookメールを作成するExcelVBA</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">Outlookの署名をVBAで自動追加する方法が案外難しい</span></h2>
<p>以前OutlookでメールをExcelVBAで大量に作成するコードを<a href="https://officevba.info/excelvbaoutlookmailpreparation4/">こちらの記事</a>でご紹介しました。</p>
<p>これは私が現在業務で最も使用しているコードの1つですが、使用した際に署名が反映されないという課題がありました。</p>
<p>この部分は手で付け足したり、もしくは本文に署名も付け加えていたりしたのですが、手で付け加えるのはそもそも面倒、本文に署名を付け加える場合、HTMLの仕様の問題だと思いますが、スペースの幅・数がずれることがありました。</p>
<p>そこで現在使用している署名を本文の下に追加した状態でメールを作成できるコードに改良してみました。</p>
<h2><span id="toc2">署名の内容の呼び出しと取り込み方法について</span></h2>
<p>署名はC:\ユーザー\[ユーザー名]\AppData\Roaming\Microsoft\Signaturesというフォルダにテキスト形式で保存されています。<br />
（AppDataが表示されない場合、隠しファイルを表示にチェックをして探してみてください。）</p>
<p>このファイルを読み込んで、内容を本文の下に追加するフローで署名を追加するコードを考えました。</p>
<h2><span id="toc3">署名を追加した状態でOutlookメールを作成するExcelVBA</span></h2>
<p>今回署名つきのコードを作成するにあたり、<a rel="noopener" href="https://www.it-swarm.dev/ja/vba/outlook%E3%81%A7%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E7%BD%B2%E5%90%8D%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/942649320/" target="_blank">こちら</a>のページを参考にさせていただきました。</p>
<p>もしかしたら外国の方が作成されているのかもしれません。<br />
少し日本語が変な気がするのでちょっと心配していましたが、きちんとした情報を提供してくださっていました。<br />
（疑ってスミマセン…）</p>
<p>メールを作成する部分のコードは以前ご紹介した<a href="https://officevba.info/excelvbaoutlookmailpreparation4/">Outlookの差し込みメールを作成するExcelVBA</a>を用いています。</p>
<div class="VBACode">Sub Outlook起動して署名つきメール作成する()<br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim oItem As Outlook.MailItem</span><br />
<br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<br />
<span class="VBA_Tab1">Dim 本文 As String, 件名 As String</span><br />
<span class="VBA_Tab1">Dim 宛先列番号 As Long</span><br />
<span class="VBA_Tab1">Dim i, k, x</span><br />
<br />
<span class="VBA_Tab1">i = 7</span><br />
<span class="VBA_Tab1"></span><br />
<span class="VBA_Tab1">Do Until Cells(i, 2) = &#8220;&#8221;</span><br />
<span class="VBA_Tab2">If Cells(i, 21) = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab3">件名 = Cells(2, 2).Text</span><br />
<span class="VBA_Tab3">本文 = Cells(3, 2).Text</span><br />
<span class="VBA_Tab3">k = 5</span><br />
<span class="VBA_Tab3">Do Until Cells(6, k) = &#8220;&#8221;</span><br />
<span class="VBA_Tab4">件名 = Replace(件名, &#8220;<" &#038; Cells(6, k) &#038; ">&#8220;, Cells(i, k))</span><br />
<span class="VBA_Tab4">本文 = Replace(本文, &#8220;<" &#038; Cells(6, k) &#038; ">&#8220;, Cells(i, k))</span><br />
<span class="VBA_Tab4">k = k + 1</span><br />
<span class="VBA_Tab3">Loop</span><br />
<br />
<span class="VBA_Tab3">本文 = 本文 &#038; vbLf &#038; vbLf &#038; 署名(&#8220;署名1.txt&#8221;)</span><br />
<span class="VBA_Tab3">本文 = Replace(本文, vbLf, &#8220;&lt;br /&gt;&#8221;)</span><br />
<br />
<span class="VBA_Tab3">Set oItem = oApp.CreateItem(olMailItem)</span><br />
<span class="VBA_Tab3"><span class="VBA_Comment">’oItem.SendUsingAccount = Session.Accounts(“指定する場合アカウント名を設定”)</span></span><br />
<br />
<span class="VBA_Tab3">oItem.To = Replace(Cells(i, 2), vbLf, &#8220;;&#8221;)</span><br />
<span class="VBA_Tab3">oItem.Subject = 件名</span><br />
<span class="VBA_Tab3">oItem.HTMLBody = &#8220;&#8221; &#038; 本文 &#038; &#8220;&#8221;</span><br />
<br />
<span class="VBA_Tab3">oItem.CC = Replace(Cells(i, 3), vbLf, &#8220;;&#8221;)</span><br />
<span class="VBA_Tab3">oItem.BCC = Replace(Cells(i, 4), vbLf, &#8220;;&#8221;)</span><br />
<span class="VBA_Tab3"><span class="VBA_Comment">’oItem.Importance = olImportanceHigh</span></span><br />
<br />
<span class="VBA_Tab3">Dim 添付()</span><br />
<span class="VBA_Tab3">x = 0</span><br />
<span class="VBA_Tab3">ReDim Preserve 添付(x)</span><br />
<span class="VBA_Tab3">添付(x) = Cells(i, 20).Text</span><br />
<br />
<span class="VBA_Tab3">If 添付(x) <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">Select Case InStr(添付(x), vbLf)</span><br />
<span class="VBA_Tab4">Case Is = 0</span><br />
<span class="VBA_Tab5">oItem.Attachments.Add DesktopPath &#038; &#8220;\&#8221; &#038; 添付(x)</span><br />
<span class="VBA_Tab4">Case Else</span><br />
<span class="VBA_Tab5">Do Until InStr(添付(x), vbLf) = 0</span><br />
<span class="VBA_Tab6">x = x + 1</span><br />
<span class="VBA_Tab6">ReDim Preserve 添付(x)</span><br />
<span class="VBA_Tab6">添付(x) = Mid(添付(x － 1), InStr(添付(x － 1), vbLf) + 1)</span><br />
<span class="VBA_Tab6">添付(x － 1) = Left(添付(x － 1), InStr(添付(x － 1), vbLf) － 1)</span><br />
<br />
<span class="VBA_Tab6">If 添付(x － 1) <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab7">oItem.Attachments.Add DesktopPath &#038; &#8220;\&#8221; &#038; 添付(x － 1)</span><br />
<span class="VBA_Tab6">End If</span><br />
<span class="VBA_Tab5">Loop</span><br />
<br />
<span class="VBA_Tab5">If 添付(x) <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab6">oItem.Attachments.Add DesktopPath &#038; &#8220;\&#8221; &#038; 添付(x)</span><br />
<span class="VBA_Tab5">End If</span><br />
<span class="VBA_Tab4">End Select</span><br />
<br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab3">oItem.Display <span class="VBA_Comment">’送信せずに画面を表示する</span></span><br />
<span class="VBA_Tab3"><span class="VBA_Comment">’oItem.Save ’下書き保存</span></span><br />
<span class="VBA_Tab3"><span class="VBA_Comment">’oItem.Close 0 ’閉じる</span></span><br />
<span class="VBA_Tab3"><span class="VBA_Comment">’oItem.Send ’送る場合</span></span><br />
<br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
End Sub<br />
<br />
Function 署名(ByVal 署名ファイル As String) As String<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<br />
<span class="VBA_Tab1">Dim 署名フォルダ As String</span><br />
<span class="VBA_Tab1">署名フォルダ = WSH.SpecialFolders(&#8220;AppData&#8221;) &#038; &#8220;\Microsoft\Signatures&#8221;</span><br />
<br />
<span class="VBA_Tab1">Dim ts As Object</span><br />
<span class="VBA_Tab1">Set ts = FSO.GetFile(署名フォルダ &#038; &#8220;\&#8221; &#038; 署名ファイル).OpenAsTextStream(1, -2)</span><br />
<br />
<span class="VBA_Tab1">署名 = ts.readall</span><br />
<span class="VBA_Tab1">ts.Close</span><br />
<br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<span class="VBA_Tab1">Set ts = Nothing</span><br />
<br />
End Function</div>
<p>テキストの内容を取得するためにはOpenAsTextStreamメソッドを使用しました。</p>
<p>引数の1つ目は「1」とすると読み取り専用で開きます。（2 = 書き込み用、8 = ファイルの末尾に書き込み用）<br />
引数の1つ目は「-2」とするとシステムの規定の設定でファイルを開きます。（-1 = Unicode形式、0 = Ascii形式）</p>
<p>どちらも意識せずに、OpenAsTextStream(1 , -2)で入力して良い気がします。</p>
<p>上記のコードを実行するとメールが作成され、署名が追加されていることを確認できました。<br />
下記に動作をキャプチャした動画を記載します。</p>
<div style="width: 1356px;" class="wp-video"><video class="wp-video-shortcode" id="video-2173-1" width="1356" height="763" preload="metadata" controls="controls"><source type="video/mp4" src="https://officevba.info/wp-content/uploads/2020/09/VBA151.mp4?_=1" /><a href="https://officevba.info/wp-content/uploads/2020/09/VBA151.mp4">https://officevba.info/wp-content/uploads/2020/09/VBA151.mp4</a></video></div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/outlooksignatures/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://officevba.info/wp-content/uploads/2020/09/VBA151.mp4" length="0" type="video/mp4" />

			</item>
		<item>
		<title>Outlookの予定表を削除するExcelVBAコード</title>
		<link>https://officevba.info/delete-outlookschedule/</link>
					<comments>https://officevba.info/delete-outlookschedule/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 08 Sep 2019 04:46:13 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1779</guid>

					<description><![CDATA[目次 Outlookの予定表を削除する手順は難しいOutlookの予定削除では全部の予定を順番に調べるOutlookの予定を削除するExcelVBAコード Outlookの予定表を削除する手順は難しい 前回Outlook [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Outlookの予定表を削除する手順は難しい</a></li><li><a href="#toc2" tabindex="0">Outlookの予定削除では全部の予定を順番に調べる</a></li><li><a href="#toc3" tabindex="0">Outlookの予定を削除するExcelVBAコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">Outlookの予定表を削除する手順は難しい</span></h2>
<p><a href="https://officevba.info/outlookschedule2/" target="_blank">前回</a>Outlookの予定表を登録するExcelVBAコードを紹介しました。</p>
<p>これは私の職場のように、課やグループ内ではExcelで外出や休み・内勤などの予定を把握しているものの、社内の他の部署に対してはOutlookの予定表でスケジュールを共有している場合、Excelで管理している予定を手間なくOutlookに登録することを想定して作成しました。</p>
<p>予定表登録は月に1回の登録を想定していたので、月内であまり予定が変更ない場合特に問題ないのですが、私の所属部署は月の中での予定変更がかなりあります。<br />
変更が生じた場合にOutlookの予定表登録を行っても以前の予定が削除されずに残った状態となり、どんどん古い予定が積み重なってしまう問題が生じていました。</p>
<p>今回はOutlook上の予定表を常に最新の状態に保つため、Outlookの予定表を削除するExcelVBAコードを考えましたので紹介します。</p>
<h2><span id="toc2">Outlookの予定削除では全部の予定を順番に調べる</span></h2>
<p>Outlookの予定は予定表のアイテムとして登録されています。<br />
予定表のアイテム自体の中で日付ごとの順序などは特にないようで、期間での絞り込みなどはできず、すべての予定を調べる必要があります。</p>
<p>よって今回は条件分岐を用いて対象の予定を削除するExcelVBAコードを考えました。</p>
<h2><span id="toc3">Outlookの予定を削除するExcelVBAコード</span></h2>
<p>予定表を登録した際のExcelシートが残っている場合、その情報を元に該当する予定を削除するExcelVBAコードは下記の通りです。</p>
<div class="VBACode">Sub Outlook予定表削除()<br />
<br />
<span class="VBA_Tab1">Dim i As Long, x As Long</span><br />
<span class="VBA_Tab1">Dim oApp <span class="VBA_Comment">’As Outlook.Application OutlookのApplication オブジェクトを入れる</span></span><br />
<span class="VBA_Tab1">Dim myNameSpace <span class="VBA_Comment">’As Outlook.NameSpace</span></span><br />
<span class="VBA_Tab1">Dim myFolder <span class="VBA_Comment">’As Outlook.Folder フォルダー指定</span></span><br />
<br />
<span class="VBA_Tab1">Set oApp = CreateObject(&#8220;Outlook.Application&#8221;)</span><br />
<span class="VBA_Tab1">Set myNameSpace = oApp.GetNamespace(&#8220;MAPI&#8221;)</span><br />
<span class="VBA_Tab1">Set myFolder = myNameSpace.GetDefaultFolder(9) <span class="VBA_Comment">’規定のフォルダー olFolderCalendar=9 指定</span></span><br />
<br />
<span class="VBA_Tab1">Dim aITEM <span class="VBA_Comment">’As Outlook.AppointmentItem</span></span><br />
<br />
<span class="VBA_Tab1">Dim タイトル As String, 場所 As String, 内容 As String</span><br />
<span class="VBA_Tab1">Dim 開始日 As Date, 開始時間 As Date, 終了日 As Date, 終了時間 As Date, 終日 As Boolean</span><br />
<br />
<span class="VBA_Tab1">i = 2</span><br />
<span class="VBA_Tab1">Do Until Cells(i, 1).Value = &#8220;&#8221;</span><br />
<br />
<span class="VBA_Tab2">タイトル = Cells(i, 1)</span><br />
<span class="VBA_Tab2">場所 = Cells(i, 2)</span><br />
<span class="VBA_Tab2">内容 = Cells(i, 3)</span><br />
<span class="VBA_Tab2">開始日 = Cells(i, 4)</span><br />
<br />
<span class="VBA_Tab2">If Cells(i, 8) <> &#8220;&#8221; Then  <span class="VBA_Comment">’終日のイベントかどうか判定</span></span><br />
<span class="VBA_Tab3">終日 = True</span><br />
<span class="VBA_Tab3">開始時間 = &#8220;0:00:00&#8221;</span><br />
<span class="VBA_Tab3">終了日 = 開始日 + 1  <span class="VBA_Comment">’終日イベントの終了日は開始日の翌日に設定</span></span><br />
<span class="VBA_Tab3">終了時間 = &#8220;0:00:00&#8221;</span><br />
<span class="VBA_Tab2">Else</span><br />
<span class="VBA_Tab3">終日 = False</span><br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’開始時刻記載有無の条件分岐</span></span><br />
<span class="VBA_Tab3">If Cells(i, 5).Text = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">開始時間 = &#8220;0:00:00&#8221;</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">開始時間 = Cells(i, 5)</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’終了日記載有無の条件分岐</span></span><br />
<span class="VBA_Tab3">If Cells(i, 6).Text = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">終了日 = 開始日</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">終了日 = Cells(i, 6)</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’終了時間記載有無の条件分岐</span></span><br />
<span class="VBA_Tab3">If Cells(i, 7).Text = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">終了時間 = &#8220;0:00:00&#8221;</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">終了時間 = Cells(i, 7)</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab2">For Each aITEM In myFolder.Items</span><br />
<span class="VBA_Tab3">If aITEM.AllDayEvent = True Then  <span class="VBA_Comment">’終日の場合</span></span><br />
<span class="VBA_Tab4">If aITEM.Start = 開始日 And aITEM.End = 終了日 And _</span><br />
<span class="VBA_Tab5">aITEM.Subject = タイトル And aITEM.Location = 場所 Then</span><br />
<span class="VBA_Tab5">aITEM.Delete</span><br />
<span class="VBA_Tab5">Exit For</span><br />
<span class="VBA_Tab4">End If</span><br />
<span class="VBA_Tab3">Else  <span class="VBA_Comment">’終日ではない場合</span></span><br />
<span class="VBA_Tab4">If aITEM.Start = 開始日 + 開始時間 And aITEM.End = 終了日 + 終了時間 And _</span><br />
<span class="VBA_Tab5">aITEM.Subject = タイトル And aITEM.Location = 場所 Then</span><br />
<span class="VBA_Tab5">aITEM.Delete</span><br />
<span class="VBA_Tab5">Exit For</span><br />
<span class="VBA_Tab4">End If</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab2">Next aITEM</span><br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
<span class="VBA_Tab1">Set aITEM = Nothing</span><br />
<span class="VBA_Tab1">Set myFolder = Nothing</span><br />
<span class="VBA_Tab1">Set myNameSpace = Nothing</span><br />
<span class="VBA_Tab1">Set oApp = Nothing</span><br />
<br />
End Sub</div>
<p>このVBAコードは該当する予定の絞り込みを日付・時間・タイトル・場所でかなり細かく行っているため、もともと登録した情報がExcelのシート上に残っている場合、誤って別の予定を削除してしまう可能性がないのが大きなメリットになります。</p>
<p>しかし、予定を記載したExcelのシートが残っていない場合、シートを作り直さなければならないデメリットがあります。<br />
この問題を解決するために下記のようなコードも考えてみました。</p>
<div class="VBACode">Sub Outlook予定表削除2()<br />
<br />
<span class="VBA_Tab1">Dim i As Long, x As Long</span><br />
<span class="VBA_Tab1">Dim oApp <span class="VBA_Comment">’As Outlook.Application OutlookのApplication オブジェクトを入れる</span></span><br />
<span class="VBA_Tab1">Dim myNameSpace <span class="VBA_Comment">’As Outlook.NameSpace</span></span><br />
<span class="VBA_Tab1">Dim myFolder <span class="VBA_Comment">’As Outlook.Folder フォルダー指定</span></span><br />
<br />
<span class="VBA_Tab1">Set oApp = CreateObject(&#8220;Outlook.Application&#8221;)</span><br />
<span class="VBA_Tab1">Set myNameSpace = oApp.GetNamespace(&#8220;MAPI&#8221;)</span><br />
<span class="VBA_Tab1">Set myFolder = myNameSpace.GetDefaultFolder(9) <span class="VBA_Comment">’規定のフォルダー olFolderCalendar=9 指定</span></span><br />
<br />
<span class="VBA_Tab1">myFolder.Display</span><br />
<span class="VBA_Tab1">oApp.ActiveWindow.WindowState = 2 <span class="VBA_Comment">’olNormalWindow=2 (olMaximized=0,olMinimized=1)</span></span><br />
<br />
<span class="VBA_Tab1">Dim aITEM <span class="VBA_Comment">’As Outlook.AppointmentItem</span></span><br />
<br />
<span class="VBA_Tab1">i = 2</span><br />
<span class="VBA_Tab1">Do Until Cells(i, 1).Value = &#8220;&#8221;</span><br />
<span class="VBA_Tab2"></span><br />
<span class="VBA_Tab2">For Each aITEM In myFolder.Items</span><br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’「開始日」と「本文の最初の4文字」で判定</span></span><br />
<span class="VBA_Tab3">If Int(aITEM.Start) = Cells(i, 1) And Left(aITEM.Body, 4) = &#8220;自動入力&#8221; Then</span><br />
<span class="VBA_Tab4">aITEM.Delete</span><br />
<span class="VBA_Tab3">End If</span><br />
<span class="VBA_Tab2">Next aITEM</span><br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
<span class="VBA_Tab1">Set myFolder = Nothing</span><br />
<span class="VBA_Tab1">Set myNameSpace = Nothing</span><br />
<span class="VBA_Tab1">Set oApp = Nothing</span><br />
<br />
End Sub</div>
<p>こちらは開始日と本文（内容）でのみの判定をする仕様となっています。</p>
<p>Excelのシート上のA列に削除したい予定表の日付を記入しておき実行することで、該当の日付で本文（内容）が「自動入力」から始まる予定表を削除します。</p>
<p><a href="https://officevba.info/wp-content/uploads/2019/09/128-1.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2019/09/128-1-300x139.jpg" alt="128-1" width="300" height="139" class="alignnone size-medium wp-image-1784" srcset="https://officevba.info/wp-content/uploads/2019/09/128-1-300x139.jpg 300w, https://officevba.info/wp-content/uploads/2019/09/128-1-320x148.jpg 320w, https://officevba.info/wp-content/uploads/2019/09/128-1.jpg 563w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>予定表を登録する際に削除するためのフラグとして本文（内容）の最初に「自動入力」を入力しておく必要があります。<br />
（予定表登録の自動化は<a href="https://officevba.info/outlookschedule2/" target="_blank">こちら</a>のページを参考にしてください。）</p>
<p>Int関数は数字から整数部分を抜き出す関数で、日付と時間の両方が格納されている値の場合、日付だけを抜き出すことが可能です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/delete-outlookschedule/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Outlookの予定表を登録するExcelVBAコード2（終日対応）</title>
		<link>https://officevba.info/outlookschedule2/</link>
					<comments>https://officevba.info/outlookschedule2/#comments</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Fri, 06 Sep 2019 14:15:26 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1767</guid>

					<description><![CDATA[目次 Outlookの予定表を削除する手順は難しい今回使用するワークシートについて以前の予定表作成から修正点2か所①終日イベントの設定②開始日時・終了日時の設定③分類項目の設定Outlookの予定表を自動入力するExce [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Outlookの予定表を削除する手順は難しい</a></li><li><a href="#toc2" tabindex="0">今回使用するワークシートについて</a></li><li><a href="#toc3" tabindex="0">以前の予定表作成から修正点2か所</a><ol><li><a href="#toc4" tabindex="0">①終日イベントの設定</a></li><li><a href="#toc5" tabindex="0">②開始日時・終了日時の設定</a></li><li><a href="#toc6" tabindex="0">③分類項目の設定</a></li></ol></li><li><a href="#toc7" tabindex="0">Outlookの予定表を自動入力するExcelVBAコードについて</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">Outlookの予定表を削除する手順は難しい</span></h2>
<p>以前に<a href="https://officevba.info/outlookschedule/" target="_blank">こちら</a>でOutlookの予定表を登録するExcelVBAコードを紹介したことがあります。</p>
<p>この時は終日のイベントを考慮していなかったこと、日付の設定の仕方があまり適切でなかったことがあり、今回修正案を作成することにしました。</p>
<h2><span id="toc2">今回使用するワークシートについて</span></h2>
<p>今回作成するExcelVBAを使用するにあたって使用するシートは下記の通りです。<br />
以前紹介した表の右端H列に「終日」の項目を用意しています。</p>
<p><a href="https://officevba.info/wp-content/uploads/2019/09/127-2.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2019/09/127-2-300x60.jpg" alt="127-2" width="300" height="60" class="alignnone size-medium wp-image-1774" srcset="https://officevba.info/wp-content/uploads/2019/09/127-2-300x60.jpg 300w, https://officevba.info/wp-content/uploads/2019/09/127-2-768x154.jpg 768w, https://officevba.info/wp-content/uploads/2019/09/127-2-700x140.jpg 700w, https://officevba.info/wp-content/uploads/2019/09/127-2-320x64.jpg 320w, https://officevba.info/wp-content/uploads/2019/09/127-2.jpg 1097w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h2><span id="toc3">以前の予定表作成から修正点2か所</span></h2>
<h3><span id="toc4">①終日イベントの設定</span></h3>
<p>Outlookの予定表アイテムを「aItem」とした場合、「aITEM.AllDayEvent = True」とすると終日のイベントとして登録することができます。</p>
<p>私の環境（Windows10+Office2016）だけのバグかもしれませんが、終日設定をする際に時間は事前に「0:00:00」としておかないとうまく登録されないようです。</p>
<h3><span id="toc5">②開始日時・終了日時の設定</span></h3>
<p>開始日時・終了日時を以前は文字列形式で設定しましたが、色々と不具合が生じる可能性があったので、日付型を用いるようにしました。</p>
<p>Outlookの予定表アイテムを「aItem」とした場合、開始日時・終了日時は下記のように設定しています。</p>
<li>aITEM.Start = 開始日 + 開始時間</li>
<li>aITEM.End = 終了日 + 終了時間</li>
<h3><span id="toc6">③分類項目の設定</span></h3>
<p>同僚から予定表登録時に色分けをしたいと要望があったため分類項目を設定できるようにしました。<br />
分類項目はアカウントごとに名称を自由に設定できてしまうため、項目名をセルに入力する仕様としています。</p>
<p>省略可能にしておいて、空欄のままだと分類項目を設定しないように設定しています。</p>
<h2><span id="toc7">Outlookの予定表を自動入力するExcelVBAコードについて</span></h2>
<p>今回作成したExcelVBAコードは下記の通りです。<br />
終日の処理だったり、終了日時未記載の場合の条件分岐が入っているのでコードは長いですが、簡単な繰り返しで作成できていると思います。</p>
<p>内容作成の時の「自動入力」の文字は削除する際のフラグとして入力しています。<br />
（詳細はこちらの記事参照）</p>
<div class="VBACode">Sub シートからアウトルック予定表入力()<br />
<br />
<span class="VBA_Tab1">Dim i As Long</span><br />
<span class="VBA_Tab1">Dim oApp <span class="VBA_Comment">’As Outlook.Application OutlookのApplication オブジェクトを入れる</span></span><br />
<span class="VBA_Tab1">Dim myNameSpace <span class="VBA_Comment">’As Outlook.NameSpace</span></span><br />
<span class="VBA_Tab1">Dim myFolder <span class="VBA_Comment">’As Outlook.Folder フォルダー指定</span></span><br />
<br />
<span class="VBA_Tab1">Set oApp = CreateObject(&#8220;Outlook.Application&#8221;)</span><br />
<span class="VBA_Tab1">Set myNameSpace = oApp.GetNamespace(&#8220;MAPI&#8221;)</span><br />
<span class="VBA_Tab1">Set myFolder = myNameSpace.GetDefaultFolder(9) <span class="VBA_Comment">’規定のフォルダー olFolderCalendar=9 指定</span></span><br />
<br />
<span class="VBA_Tab1">myFolder.Display</span><br />
<span class="VBA_Tab1">oApp.ActiveWindow.WindowState = 2 <span class="VBA_Comment">’olNormalWindow=2 (olMaximized=0,olMinimized=1)</span></span><br />
<br />
<span class="VBA_Tab1">Dim aITEM <span class="VBA_Comment">’As Outlook.AppointmentItem</span></span><br />
<br />
<span class="VBA_Tab1">Dim タイトル As String, 場所 As String, 内容 As String</span><br />
<span class="VBA_Tab1">Dim 開始日 As Date, 開始時間 As Date, 終了日 As Date, 終了時間 As Date</span><br />
<span class="VBA_Tab1">Dim 終日 As Boolean</span><br />
<span class="VBA_Tab1">Dim 分類項目 As String</span><br />
<br />
<span class="VBA_Tab1">i = 2</span><br />
<span class="VBA_Tab1">Do Until Cells(i, 1).Value = &#8220;&#8221;</span><br />
<br />
<span class="VBA_Tab2">タイトル = Cells(i, 1)</span><br />
<span class="VBA_Tab2">場所 = Cells(i, 2)</span><br />
<span class="VBA_Tab2">内容 = &#8220;自動入力&#8221; &#038; VbCrLf &#038; Cells(i, 3)</span><span class="VBA_Comment">’「自動入力」は削除したい時のフラグ</span><br />
<span class="VBA_Tab2">開始日 = Cells(i, 4)</span><br />
<br />
<span class="VBA_Tab2"><span class="VBA_Comment0">’分類項目</span></span><br />
<span class="VBA_Tab2">If Cells(i, 9) <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab3">分類項目 = Cells(i, 9)</span><br />
<span class="VBA_Tab2">Else</span><br />
<span class="VBA_Tab3">分類項目 = &#8220;&#8221;</span><br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab2">If Cells(i, 8) <> &#8220;&#8221; Then  <span class="VBA_Comment">’終日のイベントかどうか判定</span></span><br />
<span class="VBA_Tab3">終日 = True</span><br />
<span class="VBA_Tab3">開始時間 = &#8220;0:00:00&#8221;</span><br />
<span class="VBA_Tab3">終了日 = 開始日 + 1 <span class="VBA_Comment">’終日イベントの終了日は開始日の翌日に設定</span></span><br />
<span class="VBA_Tab3">終了時間 = &#8220;0:00:00&#8221;</span><br />
<br />
<span class="VBA_Tab2">Else  <span class="VBA_Comment">’終日のイベントではない場合</span></span><br />
<span class="VBA_Tab3">終日 = False</span><br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’開始時刻記載有無の条件分岐</span></span><br />
<span class="VBA_Tab3">If Cells(i, 5) = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">開始時間 = &#8220;0:00:00&#8221;</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">開始時間 = Cells(i, 5)</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’終了日記載有無の条件分岐</span></span><br />
<span class="VBA_Tab3">If Cells(i, 6).Text = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">終了日 = 開始日</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">終了日 = Cells(i, 6)</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’終了時間記載有無の条件分岐</span></span><br />
<span class="VBA_Tab3">If Cells(i, 7).Text = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">終了時間 = &#8220;0:00:00&#8221;</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">終了時間 = Cells(i, 7)</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab2">Set aITEM = oApp.CreateItem(1) <span class="VBA_Comment">’olAppointmentItem=1 1予定・アポを指定</span></span><br />
<span class="VBA_Tab2">aITEM.Display <span class="VBA_Comment">’編集画面表示</span></span><br />
<br />
<span class="VBA_Tab2">aITEM.Subject = タイトル</span><br />
<span class="VBA_Tab2">aITEM.Body = 内容</span><br />
<span class="VBA_Tab2">aITEM.Location = 場所</span><br />
<br />
<span class="VBA_Tab2">aITEM.Start = 開始日 + 開始時間</span><br />
<span class="VBA_Tab2">aITEM.End = 終了日 + 終了時間</span><br />
<br />
<span class="VBA_Tab2">If 終日 = False Then</span><br />
<span class="VBA_Tab3">aITEM.AllDayEvent = False</span><br />
<span class="VBA_Tab2">Else</span><br />
<span class="VBA_Tab3">aITEM.AllDayEvent = True</span><br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab2">If 分類項目 <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab3">aITEM.Categories = 分類項目</span><br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab2">aITEM.Save</span><br />
<span class="VBA_Tab2">aITEM.Close 0</span><br />
<span class="VBA_Tab2">Set aITEM = Nothing</span><br />
<br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
<span class="VBA_Tab1">Set myFolder = Nothing</span><br />
<span class="VBA_Tab1">Set myNameSpace = Nothing</span><br />
<span class="VBA_Tab1">Set oApp = Nothing</span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’oApp.Quit <span class="VBA_Comment">’登録後Outlookを終了する場合はチェックを外す</span></span><br />
<br />
End Sub</div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/outlookschedule2/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Outlookで添付ファイルを残した状態で返信メールを作成するExcelVBA</title>
		<link>https://officevba.info/outlookreply_attachmenthold/</link>
					<comments>https://officevba.info/outlookreply_attachmenthold/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 30 Jun 2019 09:45:23 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1746</guid>

					<description><![CDATA[目次 毎日のメール処理の時短ツールの紹介添付ファイルを残して返信したい添付ファイルを残した状態で返信メールを作成するExcelVBAコード①返信メールを作成→元のメールの添付をダウンロード→返信メールに添付②転送メールを [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">毎日のメール処理の時短ツールの紹介</a></li><li><a href="#toc2" tabindex="0">添付ファイルを残して返信したい</a></li><li><a href="#toc3" tabindex="0">添付ファイルを残した状態で返信メールを作成するExcelVBAコード</a><ol><li><a href="#toc4" tabindex="0">①返信メールを作成→元のメールの添付をダウンロード→返信メールに添付</a></li><li><a href="#toc5" tabindex="0">②転送メールを作成→宛先に元のメールの送信者とToを指定する</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">毎日のメール処理の時短ツールの紹介</span></h2>
<p>私の仕事の中で研修の申込書をメールで受け取って集計する業務があります。<br />
VBAで自動集計するため専用のExcelフォーマットをメールで送っていただく運用にし、受付専用のメールアドレスを指定しているのですが、申し込みをしてくる対象者が多いためか徹底されず違うメールアドレスに送ってくることが多くあります。</p>
<p>異なるアドレスに送られてきた申込書は受付しないで拒否する手もあるのですが、なるべく親切にしたいなという思いから、</p>
<li>①きちんと正しいアドレスに送るように連絡</li>
<li>②メールに添付されている申込書を正しいアドレスに転送</li>
<p>の流れで処理をしています。</p>
<p>このメールを2つ送る作業が何気に面倒で、前回は①の返信を自動で作成できるVBAコードを考えてみました。<br />
今回は②のメールに添付されている申込書を正しいアドレスに転送する部分を自動化したいと思いVBAコードを考えてみました。</p>
<h2><span id="toc2">添付ファイルを残して返信したい</span></h2>
<p>先ほどの②メールに添付されている申込書を正しいアドレスに転送に関して、単純に転送を用意するのでも良いのですが、どうせなら一度で済むように①の申込書の送信元に送るメールに添付を付けた状態にしておいて、CCに正しいアドレスを入力する方法を考えました。</p>
<p>ここで肝心なのが元のメールにある添付を残した状態で返信メールを作成することです。</p>
<p>通常Outlookの転送では添付そのまま残りますが、返信では添付がなくなります。<br />
これはいただいた添付を他の人に伝える目的の転送と異なり、送信者にそのままの状態で返信するケースが少ないからと推測されます。</p>
<p>実際Outlook以外のメーラーでも同様の挙動になると思います。</p>
<h2><span id="toc3">添付ファイルを残した状態で返信メールを作成するExcelVBAコード</span></h2>
<p>Outlookの標準の機能では返信メールに添付を残す方法がないようなので、VBAで機能を考える必要がありました。<br />
具体的な方法としては下記2通りを考えてみました。</p>
<li>①返信メールを作成→元のメールの添付をダウンロード→返信メールに添付</li>
<li>②転送メールを作成→宛先に元のメールの送信者とToを指定する（→おまけ：件名の「Fw」を「Re」に変更する）</li>
<p>これら2つのコードについて順にご紹介します。</p>
<p>なお、ベースとして前回ご紹介したExcelのワークシートに追加宛先・追加CC・件名・本文などの記入フォーマットを用意しています。</p>
<p><a href="https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113.jpg"><img fetchpriority="high" decoding="async" src="https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-300x192.jpg" alt="123-1Excel表" width="300" height="192" class="alignnone size-medium wp-image-1720" srcset="https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-300x192.jpg 300w, https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-768x493.jpg 768w, https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-700x449.jpg 700w, https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-320x205.jpg 320w, https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113.jpg 1219w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h3><span id="toc4">①返信メールを作成→元のメールの添付をダウンロード→返信メールに添付</span></h3>
<div class="VBACode">Sub 返信メール作成添付保持1()<br />
<br />
<span class="VBA_Tab1">Dim 本文</span><br />
<br />
<span class="VBA_Tab1">本文 = ActiveSheet.Cells(5, 2)</span><br />
<span class="VBA_Tab1">本文 = Replace(本文, vbLf, &#8220;&lt;br /&gt;&#8221;) <span class="VBA_Comment">’本文の改行文字をHTML用に</span></span><br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim objItem As Outlook.MailItem</span><br />
<span class="VBA_Tab2"><span class="VBA_Comment">’選択しているメールのMailItemオブジェクトを取得</span></span><br />
<span class="VBA_Tab2">Set objItem = oApp.ActiveExplorer.Selection.Item(1) <span class="VBA_Comment">’インデックスは1番から開始</span></span><br />
<br />
<span class="VBA_Tab1">Dim objReply As Outlook.MailItem</span><br />
<span class="VBA_Tab2"><span class="VBA_Comment">’ReplyAll→全員に返信、Reply→返信</span></span><br />
<span class="VBA_Tab2">Set objReply = objItem.ReplyAll</span><br />
<br />
<span class="VBA_Tab1">If Cells(6, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’送信アカウントの設定が必要な場合</span></span><br />
<span class="VBA_Tab2">objReply.SendUsingAccount = Session.Accounts(Cells(6, 2).Text)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">If Cells(2, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’Toの設定 置き換えではなく追加</span></span><br />
<span class="VBA_Tab2">objReply.To = objReply.To &#038; &#8220;; &#8221; &#038; Cells(2, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">If Cells(3, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’CCの設定 置き換えではなく追加</span></span><br />
<span class="VBA_Tab2">objReply.CC = objReply.CC &#038; &#8220;; &#8221; &#038; Cells(3, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">If Cells(4, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’件名の設定 置き換え</span></span><br />
<span class="VBA_Tab2">objReply.Subject = Cells(4, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">宛名 = objItem.SenderName &#038; &#8220;&lt;br /&gt;&#8221; &#038; &#8220;ご担当者さま&#8221;</span><br />
<br />
<span class="VBA_Tab1">objReply.HTMLBody = &#8220;&lt;font size=2.8&gt;&#8221; &#038; 宛名 &#038; &#8220;&lt;br /&gt; &#8220;&lt;br /&gt;&#8221; &#038; 本文 &#038; &#8220;</font size>&#8221; &#038; objReply.HTMLBody</span><br />
<br />
<span class="VBA_Tab1">Dim j</span><br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab2">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">Dim Path As String, WSH As Variant</span><br />
<span class="VBA_Tab2">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab2">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">Dim 一時フォルダ名</span><br />
<span class="VBA_Tab2">一時フォルダ名 = &#8220;一時フォルダ&#8221;</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’デスクトップに一時格納用のフォルダ作成</span></span><br />
<span class="VBA_Tab1">If FSO.FolderExists(DesktopPath &#038; &#8220;&#8221; &#038; 一時フォルダ名) = False Then</span><br />
<span class="VBA_Tab2">FSO.CreateFolder DesktopPath &#038; &#8220;&#8221; &#038; 一時フォルダ名</span><br />
<span class="VBA_Tab1">Else</span><br />
<span class="VBA_Tab2">MsgBox &#8220;一時フォルダが作成できないので中断します&#8221;</span><br />
<span class="VBA_Tab2">Exit Sub</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’作成したフォルダに添付ファイルをダウンロードしつつ返信メールに添付していく</span></span><br />
<span class="VBA_Tab1">For j = 1 To objItem.Attachments.Count</span><br />
<span class="VBA_Tab2">objItem.Attachments(j).SaveAsFile (DesktopPath &#038; &#8220;&#8221; &#038; 一時フォルダ名 &#038; &#8220;&#8221; &#038; objItem.Attachments(j).DisplayName)</span><br />
<span class="VBA_Tab2">objReply.Attachments.Add DesktopPath &#038; &#8220;&#8221; &#038; 一時フォルダ名 &#038; &#8220;&#8221; &#038; objItem.Attachments(j).DisplayName</span><br />
<span class="VBA_Tab2"><span class="VBA_Comment">’添付ファイルが同じ名前だった場合に上書きするのを防止する目的で削除しておく</span></span><br />
<span class="VBA_Tab2">FSO.DeleteFile DesktopPath &#038; &#8220;&#8221; &#038; 一時フォルダ名 &#038; &#8220;&#8221; &#038; objItem.Attachments(j).DisplayName</span><br />
<span class="VBA_Tab1">Next j</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’デスクトップの一時格納用フォルダの削除</span></span><br />
<span class="VBA_Tab1">FSO.DeleteFolder DesktopPath &#038; &#8220;&#8221; &#038; 一時フォルダ名</span><br />
<br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
<span class="VBA_Tab1">objReply.Display <span class="VBA_Comment">’画面を表示する</span></span><br />
<span class="VBA_Tab1">objReply.Save <span class="VBA_Comment">’下書き保存</span></span><br />
<span class="VBA_Tab1"><span class="VBA_Comment">’objReply.Close 0 <span class="VBA_Comment">’閉じる</span></span><br />
<br />
<span class="VBA_Tab1">Set objReply = Nothing</span><br />
<span class="VBA_Tab1">Set objItem = Nothing</span><br />
<br />
End Sub</div>
<p>元のメールの添付ファイルを一度ダウンロードし、返信メールに添付した後ダウンロードしたファイルを削除するフローで考えました。</p>
<p>デスクトップにフォルダを作成し、そのフォルダにダウンロードするのですが、同じ名前のフォルダがあると誤って削除しないように中断するようにしています。<br />
一時フォルダの名前を普段使わないような名称にすればカブることもないと思いますし、手順は回りくどいですが一応目的の機能は達しています。</p>
<h3><span id="toc5">②転送メールを作成→宛先に元のメールの送信者とToを指定する</span></h3>
<div class="VBACode">Sub 返信メール作成添付保持2()<br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’転送メールを作成した後、返信メールに変更する</span></span><br />
<span class="VBA_Tab1">Dim 本文, 件名</span><br />
<br />
<span class="VBA_Tab1">本文 = ActiveSheet.Cells(5, 2)</span><br />
<span class="VBA_Tab1">本文 = Replace(本文, vbLf, &#8220;&lt;br /&gt;&#8221;) <span class="VBA_Comment">’本文の改行文字をHTML用に</span></span><br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim objItem As Outlook.MailItem</span><br />
<span class="VBA_Tab2"><span class="VBA_Comment">’選択しているメールのMailItemオブジェクトを取得</span></span><br />
<span class="VBA_Tab2">Set objItem = oApp.ActiveExplorer.Selection.Item(1) <span class="VBA_Comment">’インデックスは1番から開始</span></span><br />
<br />
<span class="VBA_Tab1">Dim objForward As Outlook.MailItem</span><br />
<span class="VBA_Tab2">Set objForward = objItem.Forward</span><br />
<br />
<span class="VBA_Tab1">If Cells(6, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’送信アカウントの設定が必要な場合</span></span><br />
<span class="VBA_Tab2">objForward.SendUsingAccount = Session.Accounts(Cells(6, 2).Text)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">objForward.To = objItem.To &#038; &#8220;;&#8221; &#038; objItem.SenderEmailAddress <span class="VBA_Comment">’元のメールのToと差出人本人をToに設定（自分も追加される)</span></span><br />
<span class="VBA_Tab1">objForward.To = Replace(objForward.To, objForward.SendUsingAccount.SmtpAddress, &#8220;&#8221;)  <span class="VBA_Comment">’自分のメールアドレスは削除</span></span><br />
<br />
<span class="VBA_Tab1">If Cells(2, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’Toの追加がある場合</span></span><br />
<span class="VBA_Tab2">objForward.To = objForward.To &#038; &#8220;; &#8221; &#038; Cells(2, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">objForward.CC = objItem.CC <span class="VBA_Comment">’CCに元のメールのCCを設定</span></span><br />
<span class="VBA_Tab1">If Cells(3, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’CCの追加がある場合</span></span><br />
<span class="VBA_Tab2">objForward.CC = objForward.CC &#038; &#8220;; &#8221; &#038; Cells(3, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">objForward.Subject = Replace(objForward.Subject, &#8220;Fw&#8221;, &#8220;Re&#8221;) <span class="VBA_Comment">’件名の「Fw」を「Re」に変更する</span></span><br />
<span class="VBA_Tab1">If Cells(4, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’件名の設定 置き換え</span></span><br />
<span class="VBA_Tab2">objForward.Subject = Cells(4, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">宛名 = objItem.SenderName &#038; &#8220;&lt;br /&gt;&#8221; &#038; &#8220;ご担当者さま&#8221;</span><br />
<span class="VBA_Tab1">objForward.HTMLBody = &#8220;&lt;font size=2.8&gt;&#8221; &#038; 宛名 &#038; &#8220;&lt;br /&gt;&lt;br /&gt;&#8221; &#038; 本文 &#038; &#8220;&lt;/font size&gt;&#8221; &#038; objForward.HTMLBody</span><br />
<br />
<span class="VBA_Tab1">objForward.Display <span class="VBA_Comment">’画面を表示する</span></span><br />
<span class="VBA_Tab1">objForward.Save <span class="VBA_Comment">’下書き保存</span></span><br />
<span class="VBA_Tab1"><span class="VBA_Comment">’objForward.Close 0 <span class="VBA_Comment">’閉じる</span></span><br />
<br />
<span class="VBA_Tab1">Set objForward = Nothing</span><br />
<span class="VBA_Tab1">Set objItem = Nothing</span><br />
<br />
End Sub</div>
<p>転送メールを作成した後の宛先の作り方が難しく、届いたメールの宛先が複数ある場合で送信元とは別の宛先に送る場合にアカウント名で表示されているとうまくメールが送れなくなります。</p>
<p>宛先の作成は送信元のみにすればエラー回避できますが、複数の宛先に送れないという意味で機能が制限されています。</p>
<p>①の添付を後で作成する方が実用的な気がします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/outlookreply_attachmenthold/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Outlookの返信メールを作成するExcelVBAコード</title>
		<link>https://officevba.info/outlookreply/</link>
					<comments>https://officevba.info/outlookreply/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 09 Jun 2019 08:49:41 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1721</guid>

					<description><![CDATA[目次 届いたメールに対しての返信メールを作成するツールが欲しい返信メール作成ツールの条件返信メール作成ツールのワークシートについて返信メール作成ツールのExcelVBAコード 届いたメールに対しての返信メールを作成するツ [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">届いたメールに対しての返信メールを作成するツールが欲しい</a></li><li><a href="#toc2" tabindex="0">返信メール作成ツールの条件</a></li><li><a href="#toc3" tabindex="0">返信メール作成ツールのワークシートについて</a></li><li><a href="#toc4" tabindex="0">返信メール作成ツールのExcelVBAコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">届いたメールに対しての返信メールを作成するツールが欲しい</span></h2>
<p>以前からメールを一括作成して差し込み印刷のようにメールを送る方法をはじめ、Outlookを用いてメールを作成するVBAコードをいくつかご紹介していましたが、これらのコードはすべてメールを新規に作成するものでした。</p>
<p>私の職場は部署（営業所みたいな感じ）が多く、あちらこちらとやり取りをする必要があるためメールがかなり多いです。</p>
<p>同じような問い合わせのメールを何度も受けたり、あらかじめ決まったフォーマットを添付してもらうはずなのにメール本文にベタ打ちされていたりして、同じ内容の文言を何回も送ることに追われていました。</p>
<p>そこで今回は返信メールを作成するVBAコードを考えて少しでも作業負担を減らそうという試みです。</p>
<h2><span id="toc2">返信メール作成ツールの条件</span></h2>
<p>私が想定している返信メール作成ツールの条件は下記の通りです。</p>
<li>①返信したいメールを選択している状態で簡単に作成できること</li>
<li>②差出人名から宛名（メール本文の一番最初の「〇〇さん」と書く部分）を自動で作成すること</li>
<li>③返信メールの差出人のメールアカウントを選択できること（メールアカウントを使い分けたい）</li>
<li>④メール本文のパターンは複数登録でき、必要に応じて使い分けできること</li>
<p>当初ボタン1つですぐに実行できるようにOutlookVBAで作成しようかと考えていたのですが、メール本文を複数登録して使い分けできるようにすることを考えてExcelVBAを使用することにしました。</p>
<p>ユーザーフォームを使って作っても良かったのですが、本文の新規登録・修正にVBAの知識が必要になるのでExcelのワークシートを用いる方針にしました。<br />
他の条件を設定するのにもExcelのワークシートを用いるのが便利だし、複数の本文はシートをコピーして簡単に作成できます。<br />
やっぱりVBAの中でもExcelVBAは汎用性が高く使いやすいです。</p>
<h2><span id="toc3">返信メール作成ツールのワークシートについて</span></h2>
<p>返信メール作成ツールのワークシートは下記のように作成しました。</p>
<p><a href="https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113.jpg"><img loading="lazy" decoding="async" src="https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-300x192.jpg" alt="123-1Excel表" width="300" height="192" class="alignnone size-medium wp-image-1720" srcset="https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-300x192.jpg 300w, https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-768x493.jpg 768w, https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-700x449.jpg 700w, https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113-320x205.jpg 320w, https://officevba.info/wp-content/uploads/2019/06/11ac4d2b33c5695656386cd49b6ca113.jpg 1219w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>返信メールの作成に当たってパターンを分けたい内容に関してはワークシートに記載します。<br />
今回作成したシートでは「To」「CC」「件名」「本文」「差出人アカウント名」をパターン分けの項目として作成しています。</p>
<p>シートをコピーして本文を用意することで色々なパターンの返信を作成することが可能です。</p>
<h2><span id="toc4">返信メール作成ツールのExcelVBAコード</span></h2>
<p>返信メール作成VBAコードについては「ActiveExplorerメソッド」を使用します。</p>
<p>oApp.ActiveExplorer.Selection.Items(1)で選択しているメールの1つ目を指定します。<br />
インデックス番号は1から開始されるようです。</p>
<div class="VBACode">Sub 返信メール作成()<br />
<br />
<span class="VBA_Tab1">Dim 本文</span><br />
<br />
<span class="VBA_Tab1">本文 = ActiveSheet.Cells(5, 2)</span><br />
<span class="VBA_Tab1">本文 = Replace(本文, vbLf, &#8220;&lt;br /&gt;&#8221;) <span class="VBA_Comment">’本文の改行文字をHTML用に</span></span><br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim objItem As Outlook.MailItem</span><br />
<span class="VBA_Tab2"><span class="VBA_Comment">’選択しているメールのMailItemオブジェクトを取得</span></span><br />
<span class="VBA_Tab2">Set objItem = oApp.ActiveExplorer.Selection.Item(1) <span class="VBA_Comment">’インデックスは1番から開始</span></span><br />
<br />
<span class="VBA_Tab1">Dim objReply As Outlook.MailItem</span><br />
<span class="VBA_Tab2">Set objReply = objItem.Reply</span><br />
<span class="VBA_Tab2"><span class="VBA_Comment0">’Set objReply = objItem.ReplyAll ’全員へ返信の場合</span></span><br />
<br />
<span class="VBA_Tab1">If Cells(6, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’送信アカウントの設定が必要な場合</span></span><br />
<span class="VBA_Tab2">objReply.SendUsingAccount = Session.Accounts(Cells(6, 2).Text)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">If Cells(2, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’Toの設定 置き換えではなく追加</span></span><br />
<span class="VBA_Tab2">objReply.To = objReply.To &#038; &#8220;; &#8221; &#038; Cells(2, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">If Cells(3, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’CCの設定 置き換えではなく追加</span></span><br />
<span class="VBA_Tab2">objReply.CC = objReply.CC &#038; &#8220;; &#8221; &#038; Cells(3, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">If Cells(4, 2) <> &#8220;&#8221; Then <span class="VBA_Comment">’件名の設定 置き換え</span></span><br />
<span class="VBA_Tab2">objReply.Subject = Cells(4, 2)</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">宛名 = objItem.SenderName &#038; &#8220;&lt;br /&gt;&#8221; &#038; &#8220;ご担当者さま&#8221;</span><br />
<br />
<span class="VBA_Tab1">objReply.HTMLBody = &#8220;&lt;font size=2.8&gt;&#8221; &#038; 宛名 &#038; &#8220;&lt;br /&gt;&lt;br /&gt;&#8221; &#038; 本文 &#038; &#8220;&lt;/font size&gt;&#8221; &#038; objReply.HTMLBody</span><br />
<br />
<span class="VBA_Tab1">objReply.Display <span class="VBA_Comment">’画面を表示する</span></span><br />
<span class="VBA_Tab1">objReply.Save <span class="VBA_Comment">’下書き保存</span></span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’objReply.Close 0 <span class="VBA_Comment">’閉じる</span></span><br />
<br />
<span class="VBA_Tab1">Set objReply = Nothing</span><br />
<span class="VBA_Tab1">Set objItem = Nothing</span><br />
<br />
End Sub</div>
<p>Outlook Object Libraryの参照設定にチェック必要です。<br />
参照設定の手順は<a href="https://officevba.info/preparation-excelvba-outlook/" target="_blank">こちら</a>を参考にしてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/outlookreply/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>受信したメールを添付ファイル名に従って別のフォルダに移動するExcelVBA</title>
		<link>https://officevba.info/journal-attachments/</link>
					<comments>https://officevba.info/journal-attachments/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 14 Oct 2018 08:57:04 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1566</guid>

					<description><![CDATA[目次 仕訳ルールでは対応できない条件の設定添付ファイルのファイル名を調べて特定の文字を含むメールを他のフォルダに移動するExcelVBAコードメールの移動とコピーについて 仕訳ルールでは対応できない条件の設定 私の職場で [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">仕訳ルールでは対応できない条件の設定</a></li><li><a href="#toc2" tabindex="0">添付ファイルのファイル名を調べて特定の文字を含むメールを他のフォルダに移動するExcelVBAコード</a></li><li><a href="#toc3" tabindex="0">メールの移動とコピーについて</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">仕訳ルールでは対応できない条件の設定</span></h2>
<p>私の職場ではOutlookのメールのやり取りをすることが非常に多く、色々な報告書や申込書が送られてきます。</p>
<p>送られてきたメールは報告や申込の単位でフォルダ管理をしているのですが、同じ送信元でも色々なメールが来るため仕訳ルールを使っての分類ができなくて不便でした。</p>
<p>今回、送られてくるメールを自動で仕分けることができるように、添付ファイルに特定の文字を持つメールだけを別のフォルダに移動するExcelVBAコードを考えてみました。</p>
<h2><span id="toc2">添付ファイルのファイル名を調べて特定の文字を含むメールを他のフォルダに移動するExcelVBAコード</span></h2>
<p>今回作成したサンプルコードは受信トレイに入っているすべてのメールについて、1つ目の添付ファイルのファイル名を調べます。<br />
そして添付ファイルのファイル名に「11月申込書」という文字が入っていた場合、そのメールを移動先のフォルダに移動する（もしくはコピーする）VBAコードです。</p>
<p>メールの数をカウントして順に進めていきますが、フォルダを移動させるとメールの数が減り、後のメールのインデックス番号が変わってしまうため、繰り返しはインデックス番号の大きいものから順に行う流れにしています。</p>
<p>ExcelVBAで作成していますが、PowerPoint,Word,Accessなどでも動作すると思います。<br />
（OutlookVBAでは「oApp」の宣言など不要なコードが入っているのでそのままだと動作しません。）</p>
<div class="VBACode">Sub Outlook添付ファイル名でフォルダ移動()<br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim oAcct</span><br />
<span class="VBA_Tab1">Dim oStore</span><br />
<br />
<span class="VBA_Tab1">Dim 受信トレイ</span><br />
<span class="VBA_Tab1">Dim 移動先フォルダ</span><br />
<span class="VBA_Tab1">Dim n</span><br />
<br />
<span class="VBA_Tab1">Dim cITEM</span><br />
<br />
<span class="VBA_Tab1">Set oAcct = oApp.Session.Accounts(&#8220;アカウント名（メールアドレスなど）&#8221;)</span><br />
<span class="VBA_Tab1">Set oStore = oAcct.DeliveryStore</span><br />
<br />
<span class="VBA_Tab1">Set 受信トレイ = oStore.GetDefaultFolder(6)</span><br />
<span class="VBA_Tab1">Set 移動先フォルダ = 受信トレイ.Folders(&#8220;移動先フォルダ名&#8221;)</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’移動先フォルダ.Display <span class="VBA_Comment">’移動先フォルダを表示する場合このコードを実行</span></span><br />
<br />
<span class="VBA_Tab1">For n = 受信トレイ.Items.Count To 1 Step -1</span><br />
<br />
<span class="VBA_Tab2">Set cITEM = 受信トレイ.Items(n)</span><br />
<span class="VBA_Tab2">If cITEM.Attachments.Count <> 0 Then</span><br />
<span class="VBA_Tab3">If InStr(cITEM.Attachments(1).DisplayName, 月 &#038; &#8220;11月申込書&#8221;) >= 1 Then</span><br />
<span class="VBA_Tab4"><span class="VBA_Comment0">’cITEM.Copy <span class="VBA_Comment">’元のフォルダにアイテムを残しておきたい場合、このコードを有効にする</span></span><br />
<span class="VBA_Tab4">cITEM.Move 移動先フォルダ</span><br />
<span class="VBA_Tab3">End If</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab2">Set cITEM = Nothing</span><br />
<span class="VBA_Tab2">DoEvents</span><br />
<span class="VBA_Tab1">Next</span><br />
<br />
<span class="VBA_Tab1">Set 移動先フォルダ = Nothing</span><br />
<span class="VBA_Tab1">Set 受信トレイ = Nothing</span><br />
<span class="VBA_Tab1">Set oStore = Nothing</span><br />
<span class="VBA_Tab1">Set oAcct = Nothing</span><br />
<br />
End Sub</div>
<h2><span id="toc3">メールの移動とコピーについて</span></h2>
<p>Outlookを操作する際のコピーの機能はExcel上の操作と異なるり、「Paste（貼り付け）」がありません。<br />
「Copy（コピー）」を実行した段階でコピーが作成されるので慣れないとメールが大量にコピーされたり予想しない挙動を示すことがあります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/journal-attachments/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>下書き保存したメールを一括送信するExcelVBA</title>
		<link>https://officevba.info/draftbulk_transmission/</link>
					<comments>https://officevba.info/draftbulk_transmission/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Thu, 11 Oct 2018 13:10:28 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1561</guid>

					<description><![CDATA[目次 メール作成の自動化でのジレンマを解消するツールメールをたくさん作成した場合のその他の問題点一括メール送信のVBAコードについて メール作成の自動化でのジレンマを解消するツール 以前にこちらの記事でたくさんのメールを [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">メール作成の自動化でのジレンマを解消するツール</a></li><li><a href="#toc2" tabindex="0">メールをたくさん作成した場合のその他の問題点</a></li><li><a href="#toc3" tabindex="0">一括メール送信のVBAコードについて</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">メール作成の自動化でのジレンマを解消するツール</span></h2>
<p>以前に<a href="https://officevba.info/excelvbaoutlookmailpreparation4/" target="_blank">こちらの記事</a>でたくさんのメールを一度に作成するコードを紹介しました。</p>
<p>このメール作成機能は便利ですが、作成したメールを送信する手順は極端な2通りしかなく、1つは完全に自動で内容を見ずに送る方法、もう1つは内容をチェックした後に手で送信ボタンをクリックする方法で、他の方法はありませんでした。</p>
<p>できれば内容を確認したいのですが、手作業でたくさんのメールの送信ボタンを押し続けるのはかなり苦痛です。<br />
例えば50件くらいを1回送るだけならメールの送信ボタンを押し続けても良いのですが、100件以上を毎日送ると考えると多くの方は嫌になってしまうと思います。</p>
<p>だからと言って内容を全くチェックせずに自動で送信するのもできれば避けたいところでした。</p>
<p>今回はこのジレンマを解消するため、作成したメールの中身をある程度確認しつつ、一括でメールを送信する機能を考えてみました。</p>
<h2><span id="toc2">メールをたくさん作成した場合のその他の問題点</span></h2>
<p>たくさんのメールを作成した場合、送信のボタンを自分で押しまくるか、または全く内容を確認せずにメールを自動送信するかの判断に迫られること以外にも問題点があります。</p>
<p>それは作成したメールをすべて表示させたままにするとOutlookがフリーズすることがあります。<br />
私の職場のPC環境では作成するメールの数が3桁になると強制終了してしまうことがありました。</p>
<p>そのため、私は下記のコードを用いて、作成したメールを一度下書き保存して閉じるようにしました。</p>
<div class="VBACode">Sub メールを作成したあと下書き保存する()<br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim oItem As Outlook.MailItem</span><br />
<br />
<span class="VBA_Tab1">Dim oAcct</span><br />
<span class="VBA_Tab1">Dim oStore</span><br />
<br />
<span class="VBA_Tab1">Set oItem = oApp.CreateItem(olMailItem)</span><br />
<span class="VBA_Tab2">oItem.SendUsingAccount = Session.Accounts(&#8220;メールアドレス&#8221;)</span><br />
<span class="VBA_Tab2">oItem.To = &#8220;〇〇〇〇@gmail.com&#8221;</span><br />
<span class="VBA_Tab2">oItem.CC = &#8220;××××@yahoo.co.jp&#8221;</span><br />
<span class="VBA_Tab2">oItem.Subject = &#8220;件名を入力&#8221;</span><br />
<span class="VBA_Tab2">oItem.HTMLBody = &#8220;<font size=2.8>&#8221; &#038; &#8220;本文はこちら&#8221; &#038; &#8220;</font size>&#8220;</span><br />
<br />
<span class="VBA_Tab2">oItem.Display <span class="VBA_Comment">’送信せずに画面を表示する場合</span></span><br />
<span class="VBA_Tab2">oItem.Save  <span class="VBA_Comment">’下書き保存</span></span><br />
<span class="VBA_Tab2">oItem.Close 0   <span class="VBA_Comment">’閉じる</span></span><br />
<br />
<span class="VBA_Tab1">Set oItem = Nothing</span><br />
<br />
End Sub</div>
<p>このコードを使用すると作成したメールは下書きに保存され、閉じられるのでメール作成の動作が安定するようになりました。</p>
<h2><span id="toc3">一括メール送信のVBAコードについて</span></h2>
<p>今回作成したメールを一括送信する流れは、下書き保存したメールをいくつか目で見てチェックし、きちんとメールが作成されているか確認した後、下書き保存されているメールを一括で送信するという流れを想定しています。</p>
<p>VBAで実行する内容は「下書き保存したメールをすべて送信する」ことです。<br />
Excel上で下記のコードを実行すると下書き保存しているメールが順番に送信されます。</p>
<div class="VBACode">Sub 下書きメール全部送信()<br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab2">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">Dim Path As String, WSH As Variant</span><br />
<span class="VBA_Tab2">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<br />
<span class="VBA_Tab1">Dim oAcct</span><br />
<span class="VBA_Tab1">Dim oStore</span><br />
<br />
<span class="VBA_Tab1">Dim oFolder</span><br />
<span class="VBA_Tab1">Dim cITEM</span><br />
<span class="VBA_Tab1">Dim n As Integer, j As Integer, l As Integer</span><br />
<br />
<span class="VBA_Tab1">Set oAcct = oApp.Session.Accounts(&#8220;メールアドレス&#8221;)</span><br />
<span class="VBA_Tab1">Set oStore = oAcct.DeliveryStore</span><br />
<br />
<span class="VBA_Tab1">Set oFolder = oStore.GetDefaultFolder(16)</span><br />
<br />
<span class="VBA_Tab1">oFolder.Display</span><br />
<br />
<span class="VBA_Tab1">j = 0</span><br />
<span class="VBA_Tab1">l = 1</span><br />
<br />
<span class="VBA_Tab1">If oFolder.Items.Count = 0 Then</span><br />
<span class="VBA_Tab2">Exit Sub</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">For n = 1 To oFolder.Items.Count</span><br />
<span class="VBA_Tab2">Set cITEM = oFolder.Items(l)</span><br />
<span class="VBA_Tab2">On Error GoTo 次の下書きメール送信</span><br />
<span class="VBA_Tab3">cITEM.Display</span><br />
<span class="VBA_Tab3">cITEM.Send  <span class="VBA_Comment">’送る場合</span></span><br />
<span class="VBA_Tab3">Set cITEM = Nothing</span><br />
<span class="VBA_Tab2">On Error GoTo 0</span><br />
<br />
<span class="VBA_Tab1">Next</span><br />
<br />
<span class="VBA_Tab1">Set oFolder = Nothing</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
Exit Sub<br />
<br />
次の下書きメール送信:<br />
<br />
<span class="VBA_Tab1">cITEM.Close 0</span><br />
<span class="VBA_Tab1">l = l + 1</span><br />
<span class="VBA_Tab1">Resume Next</span><br />
<br />
End Sub</div>
<p>宛先の不備などで送信できないメールがあった場合は、エラー処理でメールをそのまま閉じて、次のメールを送信する流れにしています。</p>
<p>ExcelでOutlookの操作を行うには参照設定が必要です。<br />
参照設定の方法については<a href="https://officevba.info/preparation-excelvba-outlook/" target="_blank">こちらの記事</a>をご確認ください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/draftbulk_transmission/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>添付ファイルから特定の宛先に対してメールを作成するExcelVBA</title>
		<link>https://officevba.info/mail-attachmentsadd/</link>
					<comments>https://officevba.info/mail-attachmentsadd/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Mon, 08 Oct 2018 13:01:10 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1556</guid>

					<description><![CDATA[目次 Excelでの申請書・申込書などの集計に便利なツールの紹介申込書に組み込むExcelVBAコードOutlookで差し込み印刷のようにたくさんのメールを作成するExcelVBAと対になる機能 Excelでの申請書・申 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Excelでの申請書・申込書などの集計に便利なツールの紹介</a></li><li><a href="#toc2" tabindex="0">申込書に組み込むExcelVBAコード</a></li><li><a href="#toc3" tabindex="0">Outlookで差し込み印刷のようにたくさんのメールを作成するExcelVBAと対になる機能</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">Excelでの申請書・申込書などの集計に便利なツールの紹介</span></h2>
<p>Excelのファイルに内容を記載してメールに添付して送るという一連の流れは日常の業務でかなり多くの方が行うことだと思います。<br />
私の勤務している部署でも営業所から本社あてに申請書・申込書などがたくさん送られてきます。</p>
<p>メールにファイルを添付して申請や申込みを受け付けるのはハードやソフトの面でコストがかかりにくく、導入のハードルが低いのは大きなメリットですが、代わりにどこにどのような形式でいつ送るかというのを明確に定めていないとメールを受ける方が大変になってしまいます。</p>
<p>意図している宛先とは異なるところにメールを送られてしまったり、集計するのに必要な項目に不備があったり、きちんと受付されているか確認のメールがさらに届いたり、効率を下げてしまう色々な要因があります。</p>
<p>今回はExcelファイルの申請書・申込書を作成するにあたり、メールを起動するボタンを用意することで送信先を間違えるリスクを減らし、メール作成の時間を短縮するExcelVBAを考えてみましたのでご紹介します。</p>
<h2><span id="toc2">申込書に組み込むExcelVBAコード</span></h2>
<p>必要事項を記入後、すぐにOutlookを起動してメールを作成し、記入した申込書を添付するExcelVBAコードを考えてみました。</p>
<p>読み取り専用で開いていた場合は名前を付けて保存、読み取り専用でなければ上書き保存を行い、そのファイルをメールに添付します。</p>
<p>またメールに添付する際、ファイル名にアカウント名やファイル作成日時を追加するためにマイドキュメントにフォルダを作成し、ファイル名を変更したものを保存してから添付するというステップをはさんでいます。<br />
（エラーを起こさずに進めば、マイドキュメントのファイルは削除されます。）</p>
<p>下記のマクロを実行しやすくするために、私はワークシート上に「メール作成」と記載したボタンを用意して活用しています。</p>
<div class="VBACode">Sub メール作成ファイル添付()<br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim oItem As Outlook.MailItem</span><br />
<span class="VBA_Tab1">Dim 本文</span><br />
<br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab2">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab2">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab2">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">Dim DocumentPath As String</span><br />
<span class="VBA_Tab2">DocumentPath = WSH.SpecialFolders(&#8220;MyDocuments&#8221;)</span><br />
<br />
<span class="VBA_Tab1">Dim 日付</span><br />
<span class="VBA_Tab1">Dim 時間</span><br />
<span class="VBA_Tab1">Dim 日時</span><br />
<span class="VBA_Tab1">Dim rc</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’添付ファイル名に日付と時間を追加するための準備</span></span><br />
<span class="VBA_Tab1">日付 = Date</span><br />
<span class="VBA_Tab1">時間 = Time</span><br />
<span class="VBA_Tab1">日時 = Year(日付) &#038; Format(Month(日付), &#8220;00&#8221;) &#038; Format(Day(日付), &#8220;00&#8221;) &#038; _</span><br />
<span class="VBA_Tab5">    &#8220;_&#8221; &#038; Format(Hour(時間), &#8220;00&#8221;) &#038; Format(Minute(時間), &#8220;00&#8221;) &#038; Format(Second(時間), &#8220;00&#8221;)</span><br />
<br />
<span class="VBA_Tab1">Set oItem = oApp.CreateItem(olMailItem)</span><br />
<br />
<span class="VBA_Tab2">Dim 保存ファイル名</span><br />
<span class="VBA_Tab3">保存ファイル名 = DocumentPath &#038; &#8220;メール添付用_&#8221; &#038; 日時 &#038; &#8220;&#8221; &#038; oItem.Session.CurrentUser &#038; &#8220;_&#8221; &#038; Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, &#8220;.&#8221;) － 1) &#038; &#8220;_&#8221; &#038; 日時 &#038; &#8220;.xlsm&#8221;</span><br />
<br />
<span class="VBA_Tab2"><span class="VBA_Comment">’読み取り専用でなければ上書き保存して閉じる</span></span><br />
<span class="VBA_Tab2">If ActiveWorkbook.ReadOnly = False Then</span><br />
<span class="VBA_Tab3">rc = MsgBox(&#8220;ファイルを閉じて、メールに添付しますか？&#8221; &#038; vbCrLf &#038; &#8220;ファイルは上書き保存されます。&#8221;, vbOKCancel)</span><br />
<span class="VBA_Tab3">If rc = vbCancel Then</span><br />
<span class="VBA_Tab4">MsgBox &#8220;キャンセルしました。&#8221;</span><br />
<span class="VBA_Tab4">Exit Sub</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab3">ActiveWorkbook.Save</span><br />
<br />
<span class="VBA_Tab2"><span class="VBA_Comment">’読み取り専用なら保存先とファイル名を指定して保存してから次のステップに進む</span></span><br />
<span class="VBA_Tab2">Else</span><br />
<span class="VBA_Tab3">rc = MsgBox(&#8220;ファイルを閉じて、メールに添付しますか？&#8221; &#038; vbCrLf &#038; &#8220;添付する場合はファイルの保存先を選択してください。&#8221;, vbOKCancel)</span><br />
<span class="VBA_Tab3">If rc = vbCancel Then</span><br />
<span class="VBA_Tab4">MsgBox &#8220;キャンセルしました。&#8221;</span><br />
<span class="VBA_Tab4">Exit Sub</span><br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab3">FName = Application.GetSaveAsFilename(InitialFileName:=Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, &#8220;.&#8221;) － 1) &#038; &#8220;_&#8221; &#038; 日時 &#038; &#8220;.xlsm&#8221;, FileFilter:=&#8221;Excelマクロ有効ブック,*.xlsm&#8221;)</span><br />
<span class="VBA_Tab3">If FName <> &#8220;False&#8221; Then</span><br />
<span class="VBA_Tab4">ActiveWorkbook.SaveAs Filename:=FName</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">MsgBox &#8220;ファイル名を指定して保存してください。&#8221;</span><br />
<span class="VBA_Tab4">Exit Sub</span><br />
<span class="VBA_Tab3">End If</span><br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab2"><span class="VBA_Comment">’マイドキュメントの中に存在しない（と思われる）フォルダ「メール添付用_日時」を作成する</span></span><br />
<span class="VBA_Tab2">If FSO.FolderExists(DocumentPath &#038; &#8220;メール添付用_&#8221; &#038; 日時) = False Then</span><br />
<span class="VBA_Tab3">FSO.CreateFolder DocumentPath &#038; &#8220;メール添付用_&#8221; &#038; 日時</span><br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab2"><span class="VBA_Comment">’保存した添付ファイルをマイドキュメント下の「メール添付用_日時」の中にコピーする</span></span><br />
<span class="VBA_Tab2">FSO.CopyFile ThisWorkbook.FullName, 保存ファイル名</span><br />
<br />
<span class="VBA_Tab2">oItem.To = &#8220;宛先を記入&#8221;</span><br />
<span class="VBA_Tab2">oItem.Subject = oItem.Session.CurrentUser &#038; &#8220;_&#8221; &#038; Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, &#8220;.&#8221;) － 1) &#038; &#8220;_&#8221; &#038; &#8220;タイトルを記入&#8221;</span><br />
<br />
<span class="VBA_Tab2">本文 = &#8220;添付を確認の上送信してください。&#8221;</span><br />
<span class="VBA_Tab2">oItem.HTMLBody = &#8220;<font size=2.8>&#8221; &#038; 本文 &#038; &#8220;</font size>&#8220;</span><br />
<span class="VBA_Tab2">oItem.Attachments.Add 保存ファイル名  <span class="VBA_Comment">’マイドキュメント下の「メール添付用_日時」の中にコピーしたファイルを添付する</span></span><br />
<br />
<span class="VBA_Tab2">oItem.Display <span class="VBA_Comment">’送信せずに画面を表示する</span></span><br />
<br />
<span class="VBA_Tab1">FSO.DeleteFolder DocumentPath &#038; &#8220;メール添付用_&#8221; &#038; 日時</span><br />
<span class="VBA_Tab1">Set oItem = Nothing</span><br />
<br />
<span class="VBA_Tab1">Application.Quit</span><br />
<br />
End Sub</div>
<p>Outlookの操作が必要なので、「Outlook ×× Object Library」の参照設定をオンにしてください。<br />
参照設定の手順については<a href="https://officevba.info/preparation-excelvba-outlook/" target="_blank">こちらの記事</a>を参考にしてください。</p>
<p>宛先を都度変更して使いたい場合、非表示のシートを用意して、そのシート内に宛先を記入しておく方法もあります。<br />
VBAコードを編集しなくても宛先を変更できるようになるので、色々な人が使用することを前提に作成する場合におすすめです。</p>
<h2><span id="toc3">Outlookで差し込み印刷のようにたくさんのメールを作成するExcelVBAと対になる機能</span></h2>
<p>以前<a href="https://officevba.info/excelvbaoutlookmailpreparation4/" target="_blank">こちらの記事</a>で差し込み印刷のようにたくさんのメールを作成するExcelVBAコードを紹介しましたが、たくさんのメールを一括で作成する機能は「本社→多数の営業所」に一括でメールを送るのを助けるツールです。</p>
<p>それに対して、今回ご紹介した申請書・申込書の補助ツールは「多数の営業所→本社」に情報を送る際に使用するツールとなります。</p>
<p>営業所側はメールを作成する時間を短縮できて、かつ正確に相手に送信できるのが大きなメリットです。</p>
<p>一方、本社（メールの受け取り側）は決まったフォーマットのファイルが添付されたメールが正しい宛先に指定した件名で届くので集計に役立ちます。<br />
このツールは送り側と受け取り側のいずれにもメリットがあります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/mail-attachmentsadd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Outlookの差し込みメールを作成するExcelVBA（メール作成④）</title>
		<link>https://officevba.info/excelvbaoutlookmailpreparation4/</link>
					<comments>https://officevba.info/excelvbaoutlookmailpreparation4/#comments</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sat, 29 Sep 2018 09:53:35 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1547</guid>

					<description><![CDATA[目次 200906更新Outlookのメール作成ツールはかなり用途が広いOutlookの差し込みメール作成ツールについてOutlookのメール作成VBAの変更点は大きく5点①件名についても差し込みを実行する②宛先・CCを [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">200906更新</a></li><li><a href="#toc2" tabindex="0">Outlookのメール作成ツールはかなり用途が広い</a></li><li><a href="#toc3" tabindex="0">Outlookの差し込みメール作成ツールについて</a></li><li><a href="#toc4" tabindex="0">Outlookのメール作成VBAの変更点は大きく5点</a><ol><li><a href="#toc5" tabindex="0">①件名についても差し込みを実行する</a></li><li><a href="#toc6" tabindex="0">②宛先・CCを複数登録可能</a></li><li><a href="#toc7" tabindex="0">③添付ファイルの複数登録</a></li><li><a href="#toc8" tabindex="0">④送信しないフラグの設定</a></li><li><a href="#toc9" tabindex="0">⑤差し込み項目数を増やす</a></li></ol></li><li><a href="#toc10" tabindex="0">サンプルコード使用時の注意点</a></li><li><a href="#toc11" tabindex="0">Outlook差し込みメール作成ツール</a><ol><li><a href="#toc12" tabindex="0">①差し込みメール作成用Excelシート</a></li><li><a href="#toc13" tabindex="0">②差し込みメール作成のVBAコード</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">200906更新</span></h2>
<p><a href="https://officevba.info/outlooksignatures/">こちら</a>にこの記事で紹介しているコードのより新しいものをご紹介しています。<br />
ご興味あればご確認ください。</p>
<h2><span id="toc2">Outlookのメール作成ツールはかなり用途が広い</span></h2>
<p>以前に<a href="https://officevba.info/excelvbaoutlookmailpreparation3/" target="_blank">Outlookで差し込み印刷のようにメール本文を作成するExcelVBA（メール作成③）</a>で差し込み印刷のように複数のメールを作成するExcelVBAをご紹介しましたが、職場で同僚に使ってもらっていたところ修正案が出てきましたので更新してご紹介します。</p>
<h2><span id="toc3">Outlookの差し込みメール作成ツールについて</span></h2>
<p>このメール作成ツールはたくさんの宛先に内容をほんの少しだけ変えたメールを送る必要がある場合に使うツールです。</p>
<p>変更部分を<項目名>とした本文を作成し、表に差し込みたい内容を表に記載することで複数のメールを一括で作成できます。詳しい操作手順に関しては<a href="https://officevba.info/excelvbaoutlookmailpreparation3/" target="_blank">こちら</a>の記事をご確認ください。</p>
<h2><span id="toc4">Outlookのメール作成VBAの変更点は大きく5点</span></h2>
<p>今回追加した機能としては下記5点になります。</p>
<h3><span id="toc5">①件名についても差し込みを実行する</span></h3>
<p>前回の紹介したVBAコードでは本文のみを対象として差し込みを行っていましたが、件名についても差し込みできるように修正しました。</p>
<h3><span id="toc6">②宛先・CCを複数登録可能</span></h3>
<p>前回の記事では宛先・CCは1つだけを想定して作成していましたが、複数の宛先でも記載できるように修正しました。</p>
<h3><span id="toc7">③添付ファイルの複数登録</span></h3>
<p>前回の記事はセル1つに1つの添付ファイルを記載し、2列で合計2つのファイルを添付できる作りにしていましたが、複数の添付を想定し、1つのセルに記載することで完結できるように修正しました。</p>
<h3><span id="toc8">④送信しないフラグの設定</span></h3>
<p>リストをそのまま貼り付けて、そのうち一部は送信しなくても良いなどの場合、リストから行を削除するのではなく、送信しなくて済ませられるようにフラグを設定しました。</p>
<h3><span id="toc9">⑤差し込み項目数を増やす</span></h3>
<p>前回は差し込み内容が2つで作成しましたが、もっとたくさん使用できる方が都合が良いとのことで、項目数を15としました。</p>
<h2><span id="toc10">サンプルコード使用時の注意点</span></h2>
<p>今回ご紹介するExcelVBAコードは参照設定が必要になる部分があります。</p>
<p>Outlookに関するライブラリーを参照するので「Microsoft Outlook ○○ Object Library」（××はバージョンによって変わります。）を有効にしてください。手順が不明な場合は<a href="https://officevba.info/preparation-excelvba-outlook/" target="_blank">こちら</a>を確認してください。</p>
<p>（参照設定しなくても動くコードも方法もありますが、やっといて不便はないはずです。）</p>
<h2><span id="toc11">Outlook差し込みメール作成ツール</span></h2>
<h3><span id="toc12">①差し込みメール作成用Excelシート</span></h3>
<p>差し込みメール作成に使用するExcelのシートは下記のように準備しています。</p>
<p><a href="https://officevba.info/wp-content/uploads/2018/09/112-001.jpg"><img loading="lazy" decoding="async" src="https://officevba.info/wp-content/uploads/2018/09/112-001-700x372.jpg" alt="112-001" width="680" height="361" class="alignnone size-large wp-image-1546" srcset="https://officevba.info/wp-content/uploads/2018/09/112-001-700x372.jpg 700w, https://officevba.info/wp-content/uploads/2018/09/112-001-300x160.jpg 300w, https://officevba.info/wp-content/uploads/2018/09/112-001-768x408.jpg 768w, https://officevba.info/wp-content/uploads/2018/09/112-001-320x170.jpg 320w, https://officevba.info/wp-content/uploads/2018/09/112-001.jpg 1920w" sizes="(max-width: 680px) 100vw, 680px" /></a></p>
<p>本文中の<>で囲まれた部分が6行目E列からS列までの項目名と一致する部分について表の中の情報に置き換える仕様です。<br />
例えば件名に記載している<件名ヘッダー>は今回作成する2つのメールではそれぞれE列の7行目「該当者連絡」、8行目「業務連絡」という文言に置き換えられます。</p>
<p>また、左上にはメール作成の起動ボタンを用意していて、クリックすることでOutlookが起動するように設定しています。</p>
<h3><span id="toc13">②差し込みメール作成のVBAコード</span></h3>
<p>今回作成したVBAコードは以下のようになります。</p>
<div class="VBACode">Sub Outlook起動してメール作成する()<br />
<br />
<span class="VBA_Tab1">Dim oApp As New Outlook.Application</span><br />
<span class="VBA_Tab1">Dim oItem As Outlook.MailItem</span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’Microsoft Outlook ○○ Object Libraryの参照設定をしない場合/span></span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’Dim oApp As Object</span></span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’Set oApp = CreateObject(&#8220;Outlook.Application&#8221;)</span></span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’Dim oItem As Object</span></span><br />
<br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab2">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab2">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<br />
<span class="VBA_Tab1">Dim 本文 As String, 件名 As String</span><br />
<span class="VBA_Tab1">Dim 宛先列番号 As Long</span><br />
<span class="VBA_Tab1">Dim i, k, x</span><br />
<br />
<span class="VBA_Tab1">i = 7</span><br />
<span class="VBA_Tab1">Do Until Cells(i, 2) = &#8220;&#8221;</span><br />
<span class="VBA_Tab2">If Cells(i, 21) = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab3">件名 = Cells(2, 2).Text</span><br />
<span class="VBA_Tab3">本文 = Cells(3, 2).Text</span><br />
<span class="VBA_Tab3">k = 5</span><br />
<span class="VBA_Tab3">Do Until Cells(6, k) = &#8220;&#8221;</span><br />
<span class="VBA_Tab4">件名 = Replace(件名, &#8220;&lt;&#8221; &#038; Cells(6, k) &#038; &#8220;&gt;&#8221;, Cells(i, k))</span><br />
<span class="VBA_Tab4">本文 = Replace(本文, &#8220;&lt;&#8221; &#038; Cells(6, k) &#038; &#8220;&gt;&#8221;, Cells(i, k))</span><br />
<span class="VBA_Tab4">k = k + 1</span><br />
<span class="VBA_Tab3">Loop</span><br />
<span class="VBA_Tab3">本文 = Replace(本文, vbLf, &#8220;&lt;br /&gt;&#8221;)</span><br />
<br />
<span class="VBA_Tab3">Set oItem = oApp.CreateItem(olMailItem)</span><br />
<br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’送信元を変更する場合、下記の行を有効にしてアカウント名を入力（Microsoft Outlook ○○ Object Library」を有効必須</span></span><br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’oItem.SendUsingAccount = Session.Accounts(“アカウント名”)</span></span><br />
<span class="VBA_Tab3">oItem.To = Replace(Cells(i, 2), vbLf, &#8220;;&#8221;)</span><br />
<span class="VBA_Tab3">oItem.Subject = 件名</span><br />
<span class="VBA_Tab3">oItem.HTMLBody = &#8220;<font size=2.8>&#8221; &#038; 本文 &#038; &#8220;</font size>&#8220;</span><br />
<br />
<span class="VBA_Tab3">oItem.CC = Replace(Cells(i, 3), vbLf, &#8220;;&#8221;)</span><br />
<span class="VBA_Tab3">oItem.BCC = Replace(Cells(i, 4), vbLf, &#8220;;&#8221;)</span><br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’oItem.Importance = olImportanceHigh</span></span><br />
<br />
<span class="VBA_Tab3">Dim 添付()</span><br />
<span class="VBA_Tab3">x = 0</span><br />
<span class="VBA_Tab3">ReDim Preserve 添付(x)</span><br />
<span class="VBA_Tab3">添付(x) = Cells(i, 20).Text</span><br />
<br />
<span class="VBA_Tab3">If 添付(x) <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">Select Case InStr(添付(x), vbLf)</span><br />
<span class="VBA_Tab4">Case Is = 0</span><br />
<span class="VBA_Tab5">oItem.Attachments.Add DesktopPath &#038; &#8220;\&#8221; &#038; 添付(x)</span><br />
<span class="VBA_Tab4">Case Else</span><br />
<span class="VBA_Tab5">Do Until InStr(添付(x), vbLf) = 0</span><br />
<span class="VBA_Tab5">    x = x + 1</span><br />
<span class="VBA_Tab5">    ReDim Preserve 添付(x)</span><br />
<span class="VBA_Tab5">    添付(x) = Mid(添付(x － 1), InStr(添付(x － 1), vbLf) + 1)</span><br />
<span class="VBA_Tab5">    添付(x － 1) = Left(添付(x － 1), InStr(添付(x － 1), vbLf) － 1)</span><br />
<span class="VBA_Tab5">    If 添付(x － 1) <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab5">        oItem.Attachments.Add DesktopPath &#038; &#8220;\&#8221; &#038; 添付(x － 1)</span><br />
<span class="VBA_Tab5">    End If</span><br />
<span class="VBA_Tab5">Loop</span><br />
<span class="VBA_Tab5">If 添付(x) <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab5">    oItem.Attachments.Add DesktopPath &#038; &#8220;\&#8221; &#038; 添付(x)</span><br />
<span class="VBA_Tab5">End If</span><br />
<span class="VBA_Tab4">End Select</span><br />
<br />
<span class="VBA_Tab3">End If</span><br />
<br />
<span class="VBA_Tab3">oItem.Display <span class="VBA_Comment">’送信せずに画面を表示する</span></span><br />
<span class="VBA_Tab3"><span class="VBA_Comment">’oItem.Save  <span class="VBA_Comment">’下書き保存</span></span><br />
<span class="VBA_Tab3"><span class="VBA_Comment">’oItem.Close 0   <span class="VBA_Comment">’閉じる</span></span><br />
<span class="VBA_Tab3"><span class="VBA_Comment">’oItem.Send <span class="VBA_Comment">’送る場合</span></span><br />
<br />
<span class="VBA_Tab2">End If</span><br />
<br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
End Sub</div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/excelvbaoutlookmailpreparation4/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>ExcelVBAでOutlookを操作する際の参照設定</title>
		<link>https://officevba.info/preparation-excelvba-outlook/</link>
					<comments>https://officevba.info/preparation-excelvba-outlook/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Wed, 26 Sep 2018 14:15:46 +0000</pubDate>
				<category><![CDATA[Outlook操作]]></category>
		<category><![CDATA[VBA・マクロを使う事前準備]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1543</guid>

					<description><![CDATA[目次 Outlookのメール作成ツールには参照設定が必要Outlook Object Libraryの参照設定手順Outlook Object Libraryの参照設定時の注意点 Outlookのメール作成ツールには参照 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Outlookのメール作成ツールには参照設定が必要</a></li><li><a href="#toc2" tabindex="0">Outlook Object Libraryの参照設定手順</a></li><li><a href="#toc3" tabindex="0">Outlook Object Libraryの参照設定時の注意点</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">Outlookのメール作成ツールには参照設定が必要</span></h2>
<p>OutlookのメールをExcelVBAを用いて作成するツールはかなり便利で、私も事務仕事をする際によく使っています。</p>
<p>これまでにいくつかご紹介してきましたが、大事な参照設定について伝え忘れてしまっていたので今回手順をご紹介します。</p>
<h2><span id="toc2">Outlook Object Libraryの参照設定手順</span></h2>
<p>Outlook操作のVBAを記載するExcelのファイル開いて、「開発タブ」→「Visual Basic」を選択し、VBE（Visual Basic Editor）を起動します。</p>
<p>開発タブが非表示になっている方やショートカットを活用したい方は「Alt+F11」でもVBEを起動できます。</p>
<p><a href="https://officevba.info/wp-content/uploads/2018/09/111-001.jpg"><img loading="lazy" decoding="async" src="https://officevba.info/wp-content/uploads/2018/09/111-001-700x382.jpg" alt="" width="680" height="371" class="alignnone size-large wp-image-1540" srcset="https://officevba.info/wp-content/uploads/2018/09/111-001-700x382.jpg 700w, https://officevba.info/wp-content/uploads/2018/09/111-001-300x164.jpg 300w, https://officevba.info/wp-content/uploads/2018/09/111-001-768x419.jpg 768w, https://officevba.info/wp-content/uploads/2018/09/111-001-320x175.jpg 320w, https://officevba.info/wp-content/uploads/2018/09/111-001.jpg 1920w" sizes="(max-width: 680px) 100vw, 680px" /></a></p>
<p>開かれたVBEの画面で「ツール」→「参照設定」をクリックし、参照設定画面の一覧の中から「Microsoft Outlook ×× Object Library」（××はバージョンによって変わります。）のチェックを付けて「OK」をクリックします。</p>
<p><a href="https://officevba.info/wp-content/uploads/2018/09/111-002.jpg"><img loading="lazy" decoding="async" src="https://officevba.info/wp-content/uploads/2018/09/111-002-700x382.jpg" alt="" width="680" height="371" class="alignnone size-large wp-image-1541" srcset="https://officevba.info/wp-content/uploads/2018/09/111-002-700x382.jpg 700w, https://officevba.info/wp-content/uploads/2018/09/111-002-300x164.jpg 300w, https://officevba.info/wp-content/uploads/2018/09/111-002-768x419.jpg 768w, https://officevba.info/wp-content/uploads/2018/09/111-002-320x175.jpg 320w, https://officevba.info/wp-content/uploads/2018/09/111-002.jpg 1920w" sizes="(max-width: 680px) 100vw, 680px" /></a> <a href="https://officevba.info/wp-content/uploads/2018/09/111-003.jpg"><img loading="lazy" decoding="async" src="https://officevba.info/wp-content/uploads/2018/09/111-003-700x382.jpg" alt="" width="680" height="371" class="alignnone size-large wp-image-1542" srcset="https://officevba.info/wp-content/uploads/2018/09/111-003-700x382.jpg 700w, https://officevba.info/wp-content/uploads/2018/09/111-003-300x164.jpg 300w, https://officevba.info/wp-content/uploads/2018/09/111-003-768x419.jpg 768w, https://officevba.info/wp-content/uploads/2018/09/111-003-320x175.jpg 320w, https://officevba.info/wp-content/uploads/2018/09/111-003.jpg 1920w" sizes="(max-width: 680px) 100vw, 680px" /></a></p>
<p>この操作によってOutlook操作のためのコードが使用できるようになります。</p>
<h2><span id="toc3">Outlook Object Libraryの参照設定時の注意点</span></h2>
<p>他の参照設定でも同様ですが、Microsoft Outlook ×× Object Libraryのバージョンが変わった際、古いバージョンから新しいバージョンへは互換機能が働いて置き換えられますが、新しいバージョンから古いバージョンになるときにうまく移行しないことがあります。</p>
<p>その際は参照設定の表示が「参照不可：Microsoft Outlook ×× Object Library」と表示され、VBAコードがエラーになります。</p>
<p>職場と自宅のパソコンのバージョンが異なる場合、自宅のPCで作ったVBAが起動しなくなることがあるので覚えておいて損はないと思います。<br />
私はこの現象でせっかく作ったことがあり、原因がわからずすごく焦ったことがあります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/preparation-excelvba-outlook/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
