<?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/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Excel | 文系出身のSEですが、何か</title>
	<atom:link href="https://loosecarrot.com/tag/excel/feed/" rel="self" type="application/rss+xml" />
	<link>https://loosecarrot.com</link>
	<description>文系(国際系)出身でSE就職のサラリーマンが プログラミング・海外旅行・語学・健康などに関する情報を発信します</description>
	<lastBuildDate>Fri, 22 Sep 2023 13:50:21 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.8</generator>

<image>
	<url>https://loosecarrot.com/wp-content/uploads/2020/08/cropped-8214a4f1973e7caf419465b3dcc3ffd7-32x32.png</url>
	<title>Excel | 文系出身のSEですが、何か</title>
	<link>https://loosecarrot.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">151273272</site>	<item>
		<title>VBAで例外をcatchする書き方</title>
		<link>https://loosecarrot.com/2023/08/03/6633/</link>
					<comments>https://loosecarrot.com/2023/08/03/6633/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Thu, 03 Aug 2023 10:09:25 +0000</pubDate>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[Excel]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=6633</guid>

					<description><![CDATA[<p>VBAでもユーザに利用してもらう場合などは、例外が発生しても落ちないように考慮が必要です。 そこで、簡易的に例外を捕まえてメッセージを表示するVBAを使っているので紹介します。 実際に作ったファイルはこちらから無料でダウ</p>
The post <a href="https://loosecarrot.com/2023/08/03/6633/">VBAで例外をcatchする書き方</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-6645" src="https://loosecarrot.com/wp-content/uploads/2023/09/VBAで例外をcatchする書き方_0.jpg" alt="" width="800" height="400" />
<p>VBAでもユーザに利用してもらう場合などは、例外が発生しても落ちないように考慮が必要です。</p>
<p>そこで、簡易的に例外を捕まえてメッセージを表示するVBAを使っているので紹介します。</p>
<p>実際に作ったファイルはこちらから<a href="https://www.dropbox.com/scl/fi/c0olwqdz0krg391nmei1r/VBA.zip?rlkey=wpi0ual87bketgr4ah7f34jhq&amp;dl=1">無料でダウンロード</a>できます。</p>
<h2>エクセルの仕様</h2>
<img decoding="async" class="alignnone size-full wp-image-6642" src="https://loosecarrot.com/wp-content/uploads/2023/09/VBAで例外をcatchする書き方_1.jpg" alt="" width="800" height="400" />
<p>仕様は、「あ、い、う、え、お」と<span style="color: #ff0000;">本当は</span>出力したいです。</p>
<p>ただ、一部存在しないシート名を指定していることで、<span style="color: #ff0000;">例外</span>が起こるようになっています。</p>
<h3>マクロが無効にされる場合</h3>
<p>ダウンロードすると、以下のような警告が表示されることがあります。</p>
<img decoding="async" class="alignnone size-full wp-image-6636" src="https://loosecarrot.com/wp-content/uploads/2023/09/使い方_1.jpg" alt="" width="654" height="131" />
<p>ファイルを右クリックして、プロパティから「許可する」にチェックを入れて下さい。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-6637" src="https://loosecarrot.com/wp-content/uploads/2023/09/使い方_2.jpg" alt="" width="421" height="542" />
<h2>コードの解説</h2>
<h3>コード</h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">'==============================
'目的       ：
'==============================
Sub test_Click()

    '------エラー時はErrCatchラベルへ------
    On Error GoTo ErrCatch
    
    'ファイルパスの書き込みエリアをクリアする
    ThisWorkbook.Sheets("Sheet1").Columns("D").ClearContents
    
    'D1～5のセルに数字を記載する
    ThisWorkbook.Sheets("Sheet1").Range("D1") = "あ"
    ThisWorkbook.Sheets("Sheet1").Range("D2") = "い"
    ThisWorkbook.Sheets("Sheet1").Range("D3") = "う"
    ThisWorkbook.Sheets("Sheet20").Range("D4") = "え"    '存在しないシートを指定
    ThisWorkbook.Sheets("Sheet1").Range("D5") = "お"
    
    MsgBox "完了しました。"
    
'エラーキャッチ
ErrCatch:

    ' エラーの場合、エラーメッセージを表示する
    Call ShowErrMsg
    
End Sub

'==============================
'目的       ：エラーの場合、エラーメッセージを表示する
'==============================
Public Sub ShowErrMsg()

    'エラーがあればメッセージ表示
    If Err.Number &lt;&gt; 0 Then
        MsgBox "想定外のエラーが発生しました。" &amp; vbCrLf + _
                "エラー番号：" + CStr(Err.Number) &amp; vbCrLf + _
                "エラーの種類：" + Err.Description
    End If

End Sub</pre><p></p>
<h3>解説</h3>
<p>7行目で、例外があった場合、「<span class="crayon-v">ErrCatch</span>」というラベルに移動するようになっています。</p>
<p>13行目～17行目で「あいうえお」と書き込むように書いています。</p>
<p>ただ、16行目は存在しないシート名「sheet20」が指定されているため例外が発生します。</p>
<p>32行目でエラー時のメソッドが記載してあります。</p>
<p>例外があった場合、<span class="crayon-v">Err</span><span class="crayon-sy">.</span><span class="crayon-v">Numberが0以外となります。</span></p>
<p>0以外(エラーがあった)場合、エラー内容をメッセージ表示させています。</p>The post <a href="https://loosecarrot.com/2023/08/03/6633/">VBAで例外をcatchする書き方</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2023/08/03/6633/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6633</post-id>	</item>
		<item>
		<title>ツール作成の問合せ こんなのあったらいいな</title>
		<link>https://loosecarrot.com/2020/06/13/4252/</link>
					<comments>https://loosecarrot.com/2020/06/13/4252/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Sat, 13 Jun 2020 14:05:51 +0000</pubDate>
				<category><![CDATA[SE(システムエンジニア)]]></category>
		<category><![CDATA[Access]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[プログラミング独学]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=4252</guid>

					<description><![CDATA[<p>「こんなのあったらいいな」の声をお届けください！ ・いろんな方に役立つツールを作ってみようと思います。 ・対応できないこともあるとは思いますが、ご相談ください。 ・ツール作成以外のお問合せは回答いたしません。</p>
The post <a href="https://loosecarrot.com/2020/06/13/4252/">ツール作成の問合せ こんなのあったらいいな</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4253" src="https://loosecarrot.com/wp-content/uploads/2020/06/2ec5db26024ef075d5f7ec80491db176.png" alt="" width="800" height="400" />
<p>「こんなのあったらいいな」の声をお届けください！</p>
<div class="concept-box1">
<p><strong>・いろんな方に役立つツール</strong>を作ってみようと思います。</p>
<p>・<span style="color: #ff0000;">対応できないことも</span>あるとは思いますが、ご相談ください。</p>
<p>・ツール作成以外のお問合せは回答いたしません。</p>
</div>
[contact-form-7]The post <a href="https://loosecarrot.com/2020/06/13/4252/">ツール作成の問合せ こんなのあったらいいな</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2020/06/13/4252/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4252</post-id>	</item>
		<item>
		<title>C# エクセル(Office)にdatatableの中身を出力 色、罫線付き</title>
		<link>https://loosecarrot.com/2020/03/03/4105/</link>
					<comments>https://loosecarrot.com/2020/03/03/4105/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Tue, 03 Mar 2020 12:43:55 +0000</pubDate>
				<category><![CDATA[C#/VB.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Excel]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=4105</guid>

					<description><![CDATA[<p>エクセルをC#で処理するときにMicrosoft.Office.Interop.Excelを参照追加して処理することが今のところは主流です。 ここで面倒なことがあります。 プロセスが残らないよう制御が面倒です。 いちいち</p>
The post <a href="https://loosecarrot.com/2020/03/03/4105/">C# エクセル(Office)にdatatableの中身を出力 色、罫線付き</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4116" src="https://loosecarrot.com/wp-content/uploads/2020/03/43b2cf1d315b5e0ee8ba6ed327d78ebf.jpg" alt="" width="800" height="400" />
<p>エクセルをC#で処理するときに<strong>Microsoft.Office.Interop.Excel</strong>を参照追加して処理することが今のところは主流です。</p>
<p>ここで面倒なことがあります。</p>
<div class="simple-box1">
<p>プロセスが残らないよう制御が面倒です。</p>
<p>いちいちエクセルを開くので時間がかかる。</p>
</div>
<p>ということで、エクセルを開かず、読込む方法を紹介します。</p>
<div class="simple-box3">
<p>実際に作ったファイルは<a href="https://base-shop.loosecarrot.com/items/26809452" target="_blank" rel="noopener noreferrer">こちらからダウンロード</a>できます。</p>
<p>データテーブルの準備などをしているので、ダウンロード後、そのまま実行できます。</p>
</div>
<p>デモンストレーションで動かした動画を載せておきます。</p>
<p><iframe loading="lazy" title="C# エクセルOfficeにdatatableの中身を出力 色、罫線付き" width="500" height="375" src="https://www.youtube.com/embed/bo6b3lYHg3k?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>&nbsp;</p>
<h2>Datatableをエクセルのシートに出力するコード</h2>
<p>Datatableの中身をエクセルのシートオブジェクトに出力するメソッドを作りました。</p>
<p>色や罫線も付けています。</p>
<p>取込むデータテーブルは以下です。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4115" src="https://loosecarrot.com/wp-content/uploads/2020/03/fed17600cd678e7422eff4f7a5cb018b.jpg" alt="" width="379" height="368" />
<p>流れとしては以下です。</p>
<div class="simple-box3">
<p>①エクセルのシートに列名を出力</p>
<p>②Datatableの中身をエクセルのシートに出力</p>
<p>この時、「女」セルがあれば、<span style="color: #ff0000;">フォントを赤</span>にしています。</p>
<p>③出力した範囲に罫線を引く</p>
<p>④列に色を付ける</p>
</div>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">using ClosedXML.Excel;

/// &lt;summary&gt;
/// データテーブルにデータをエクセルシートにセットする
/// &lt;/summary&gt;
/// &lt;param name="dataTable"&gt;データテーブル&lt;/param&gt;
/// &lt;param name="workSheet"&gt;シート&lt;/param&gt;
/// &lt;returns&gt;データテーブルを出力したシートを返す&lt;/returns&gt;
public IXLWorksheet outPutDataTableToExcel(DataTable dataTable, IXLWorksheet workSheet)
{

    IXLRange objRrange = null;                            //rangeオブジェクト

    //-----------------エクセルにデータテーブルの中身をセット-----------------
    //列をエクセルにセット
    for (int col = 1; col &lt;= dataTable.Columns.Count; col++)
    {
        workSheet.Cell(1, col).Value = dataTable.Columns[col -1].ColumnName;
    }

    //datatableをシートにセットする
    //行数分ループ(ヘッダの次の行から出力開始)
    for (int row = 0; row &lt;= dataTable.Rows.Count -1; row++)
    {
        //列数分ループ
        for (int col = 1; col &lt;= dataTable.Columns.Count; col++)
        {
            workSheet.Cell(row + 2, col).Value = dataTable.Rows[row][col - 1];

            //性別が「女」の場合、フォントを赤にする
            if(dataTable.Rows[row][col - 1].ToString() == "女")
            {
                workSheet.Cell(row + 2, col).Style.Font.FontColor = XLColor.Red;
            }
        }
    }
    //-----------------エクセルにデータテーブルの中身をセット-----------------
    

    //-----------------シートに罫線を引く-----------------
    //罫線を引く範囲をセット
    objRrange = workSheet.Range(workSheet.Cell(1, 1), workSheet.Cell(dataTable.Rows.Count +1, dataTable.Columns.Count));

    //罫線を引く
    objRrange.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
    objRrange.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
    //-----------------シートに罫線を引く-----------------


    //-----------------列に色を付ける-----------------
    objRrange = workSheet.Range(workSheet.Cell(1, 1), workSheet.Cell(1, dataTable.Columns.Count));
    objRrange.Style.Fill.BackgroundColor = XLColor.LightBlue;

    //-----------------列に色を付ける-----------------
    
    return workSheet;

}</pre><p></p>
<h2>解説</h2>
<h3>列名を出力</h3>
<p>16行目～18行目で列を出力しています。</p>
<p>Cell(1,col)で1行目かあから順に出力しています。</p>
<p>Datatableの列の開始は<span style="color: #ff0000;">0列目</span>から始まりますが、エクセルは<span style="color: #ff0000;">1列目</span>です。</p>
<p>なので、col-1でエクセルとDatatableの列を合せています。</p>
<h3>Datatableの中身を出力</h3>
<p>23行目～36行目でDatatableの中身を出力しています。</p>
<p>ここもDatatableの行、列のかいしは０からですが、エクセルは1から始まることを考慮しています。</p>
<p>行は列の次の行なので、2行目です。</p>
<p>⇒row+2をして合せています。</p>
<p>また、この時、IF文を使ってDatatableの値が「<strong>女</strong>」の場合、フォントを<span style="color: #ff0000;">赤</span>にしています。</p>
<h3>罫線、背景色</h3>
<p>それぞれ、列数と行数をDatatableのrows.countとcolumns.countで取得し、</p>
<p>線と色をセットする範囲を指定しています。</p>
<p>_</p>
<p>&nbsp;</p>
<h2><span id="Closed_XML">Closed XMLの参照設定追加</span></h2>
<p>ClosedXMLで参照追加が必要です。</p>
<p>手順は以下の通りです。</p>
<h3><span id="i">パッケージマネージャコンソールを開く</span></h3>
<p>「ツール」→「NuGetパッケージマネージャ」→「パッケージマネージャコンソール」の順で開きます。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4095" src="https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b.jpg" sizes="(max-width: 1152px) 100vw, 1152px" srcset="https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b.jpg 1152w, https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b-300x115.jpg 300w, https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b-1024x393.jpg 1024w, https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b-768x295.jpg 768w" alt="" width="1152" height="442" />
<h3><span id="i-2">インストール実行</span></h3>
<p>その後、Install-Packageコマンドを実行して完了です。</p><pre class="urvanov-syntax-highlighter-plain-tag">Install-Package ClosedXML</pre><p></p>
<div id="crayon-5e5d1515081dd863678102" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main"></div>
</div>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4094" src="https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb.jpg" sizes="(max-width: 1114px) 100vw, 1114px" srcset="https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb.jpg 1114w, https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb-300x173.jpg 300w, https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb-1024x590.jpg 1024w, https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb-768x443.jpg 768w" alt="" width="1114" height="642" />
<p>&nbsp;</p>
<p>&nbsp;</p>The post <a href="https://loosecarrot.com/2020/03/03/4105/">C# エクセル(Office)にdatatableの中身を出力 色、罫線付き</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2020/03/03/4105/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4105</post-id>	</item>
		<item>
		<title>C# エクセルを開かずにDatatbleに取込み(Closed XML)</title>
		<link>https://loosecarrot.com/2020/03/01/4091/</link>
					<comments>https://loosecarrot.com/2020/03/01/4091/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Sun, 01 Mar 2020 08:07:45 +0000</pubDate>
				<category><![CDATA[C#/VB.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Excel]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=4091</guid>

					<description><![CDATA[<p>エクセルをC#で処理するときにMicrosoft.Office.Interop.Excelを参照追加して処理することが今のところは主流です。 https://loosecarrot.com/2020/02/17/3971</p>
The post <a href="https://loosecarrot.com/2020/03/01/4091/">C# エクセルを開かずにDatatbleに取込み(Closed XML)</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<p>エクセルをC#で処理するときに<strong>Microsoft.Office.Interop.Excel</strong>を参照追加して処理することが今のところは主流です。</p>
<p>https://loosecarrot.com/2020/02/17/3971/</p>
<p>ここで面倒なことがあります。</p>
<div class="simple-box1">
<p>プロセスが残らないよう<span style="color: #ff0000;">制御が面倒</span>です。</p>
<p>いちいちエクセルを開くので<span style="color: #ff0000;">時間がかかる</span>。</p>
<p>Excel(Office)がインストールされていない端末では<span style="color: #ff0000;">使えない</span></p>
</div>
<p>ということで、エクセルを開かず、読込む方法を紹介します。</p>
<p>デモンストレーションで動かした動画を載せておきます。</p>
<p><span style="color: #ff0000;">officeがインストールされていない端末</span>でデモをしています。</p>
<p><iframe loading="lazy" title="C# エクセルを開かずにDatatbleに取込みClosed XML" width="500" height="375" src="https://www.youtube.com/embed/nljVrgJMotQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<h2>Closed XMLの参照設定追加</h2>
<p>ClosedXMLで参照追加が必要です。</p>
<p>手順は以下の通りです。</p>
<h3>パッケージマネージャコンソールを開く</h3>
<p>「ツール」→「NuGetパッケージマネージャ」→「パッケージマネージャコンソール」の順で開きます。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4095" src="https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b.jpg" alt="" width="1152" height="442" srcset="https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b.jpg 1152w, https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b-300x115.jpg 300w, https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b-1024x393.jpg 1024w, https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b-768x295.jpg 768w, https://loosecarrot.com/wp-content/uploads/2020/03/7bbb9f137a127156ebbbdac2726d064b.jpg 856w" sizes="(max-width: 1152px) 100vw, 1152px" />
<h3>インストール実行</h3>
<p>その後、<span style="color: #ff0000;">Install-Package</span>コマンドを実行して完了です。</p><pre class="urvanov-syntax-highlighter-plain-tag">Install-Package ClosedXML</pre><p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4094" src="https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb.jpg" alt="" width="1114" height="642" srcset="https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb.jpg 1114w, https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb-300x173.jpg 300w, https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb-1024x590.jpg 1024w, https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb-768x443.jpg 768w, https://loosecarrot.com/wp-content/uploads/2020/03/a84525e3df29b0f32ba7580e1373a6cb.jpg 856w" sizes="(max-width: 1114px) 100vw, 1114px" /></p>
<h2>Close XMLを使ってエクセルを読み込むコード</h2>
<p>コードは以下の通りです。</p><pre class="urvanov-syntax-highlighter-plain-tag">/// &lt;summary&gt;
/// 取込みボタンクリック時
/// &lt;/summary&gt;
/// &lt;param name="sender"&gt;&lt;/param&gt;
/// &lt;param name="e"&gt;&lt;/param&gt;
private void import_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();                     //エクセルシートのデータを格納
    DataRow dr = null;                                  //エクセルのデータを(1行分)格納
    string filePath = "";                               //エクセルのパスを格納
    int lastRow = 0;                                    //最終行番号を格納
    int lastColumn = 0;                                 //最終列番号を格納

    XLWorkbook objWorkBook = null;                        //workbookオブジェクト
    IXLWorksheet objSheet = null;                         //シートオブジェクト
    IXLRange objRrange = null;                            //rangeオブジェクト

    
    //ダイアログでファイルパスを取得
    filePath = getExcelPath();

    //エクセルをインスタンス化
    objWorkBook = new XLWorkbook(filePath);

    //シートを取得
    objSheet = objWorkBook.Worksheet(1);

    //最終行、列を取得
    lastRow = objSheet.LastRowUsed().RowNumber();
    lastColumn = objSheet.LastColumnUsed().ColumnNumber();

    //シートのデータをrangeに取込む
    objRrange = objSheet.Range(objSheet.Cell(1, 1), objSheet.Cell(lastRow, lastColumn));


    //datatableに列を作成(列数分ループ)
    for (int col = 1; col &lt;= lastColumn; col++)
    {
        dt.Columns.Add(objSheet.Cell(1, col).Value.ToString());
    }


    //シートをdatatableに取込む
    //行数分ループ(ヘッダの次の行から開始)
    for (int row = 2; row &lt;= lastRow-1; row++)
    {
        //行を作成
        dr = dt.NewRow();

        //Datarowに列ごとのデータをセット
        for (int col = 1; col &lt;= lastColumn; col++)
        {
            dr[col-1] = objSheet.Cell(row, col).Value;
        }

        //datatableにDatarowを挿入
        dt.Rows.Add(dr);

    }            

    //データグリッドビューにセット
    dataGridView1.DataSource = dt;

    MessageBox.Show("完了");
    
}
/// &lt;summary&gt;
/// ファイルパスを返す
/// &lt;/summary&gt;
/// &lt;returns&gt;&lt;/returns&gt;
public string getExcelPath()
{
    string path = "";

    //ファイルダイアログを生成する
    OpenFileDialog op = new OpenFileDialog();
    op.Title = "ファイルを開く";
    op.Filter = "すべてのファイル(*.*)|*.*";
    op.FilterIndex = 1;

    //オープンファイルダイアログを表示する
    DialogResult dialog = op.ShowDialog();

    //「開く」ボタンが選択された時の処理
    if (dialog == DialogResult.OK)
    {
        path = op.FileName;
    }
    //「キャンセル」時の処理
    else if (dialog == DialogResult.Cancel)
    { }

    return path;
}</pre><p></p>
<h2>2007以降、エクセルはXMLで作られている</h2>
<p>実はエクセルは2007年以降XMLで作られています。</p>
<blockquote><p>Excel 2007では、データの保存形式がXMLに変更されたため&#8230;.</p>
<p><a href="https://xtech.nikkei.com/it/pc/article/NPC/20060629/242158/" target="_blank" rel="noopener noreferrer">新しい標準ファイル形式「XML」（第2回）　より</a></p></blockquote>
<p>なので、Close XMLで処理できるのは拡張子が新しいものだけです。</p>
<p><span style="color: #ff0000;"><strong>対象の拡張子はxlsx、xlsm、xltm</strong></span>です。</p>
<p>毎回エクセルを立ち上げることもないので早く処理できます。</p>The post <a href="https://loosecarrot.com/2020/03/01/4091/">C# エクセルを開かずにDatatbleに取込み(Closed XML)</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2020/03/01/4091/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4091</post-id>	</item>
		<item>
		<title>C# エクセル取込みしてSQLでデータ更新</title>
		<link>https://loosecarrot.com/2020/02/19/3988/</link>
					<comments>https://loosecarrot.com/2020/02/19/3988/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Wed, 19 Feb 2020 13:28:24 +0000</pubDate>
				<category><![CDATA[C#/VB.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[プログラミング独学]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=3988</guid>

					<description><![CDATA[<p>C#などで開発する時にエクセルの一括取込み機能を作るときがあると思います。 いちいち調べて、プログラムを組んでと言うのが面倒なので備忘録として残しておきます。 機能としては「検索」と「エクセル取込更新」の二つの機能があり</p>
The post <a href="https://loosecarrot.com/2020/02/19/3988/">C# エクセル取込みしてSQLでデータ更新</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<p>C#などで開発する時にエクセルの一括取込み機能を作るときがあると思います。</p>
<p>いちいち調べて、プログラムを組んでと言うのが面倒なので備忘録として残しておきます。</p>
<p>機能としては「検索」と「エクセル取込更新」の二つの機能があります。</p>
<p>実際に作ったファイルは<a href="https://base-shop.loosecarrot.com/items/26554369" target="_blank" rel="noopener noreferrer">こちらからダウンロード</a>できます。</p>
<p>データベース(SQLite)と取り込み用のエクセルも入っているのでダウンロードしてもらえればすぐに実行して試すことができます。</p>
<p>デモンストレーションで動かした動画を載せておきます。</p>
<p><iframe loading="lazy" title="C# エクセル取込みしてSQLでデータ更新のデモ" width="500" height="375" src="https://www.youtube.com/embed/gp2DAJtgPQg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<h2>開発環境</h2>
<p>開発環境はVisualStudio2015</p>
<p>データベースはSQLiteです。</p>
<h3><span id="VisualStudio2015">VisualStudio2015のインストール</span></h3>
<p>開発環境はVisualStudio2015なのでインストールが必要です。</p>
<p>設定は特に必要なく、標準インストールで良いです。</p>
<p>1時間くらいかかります。</p>
<p>こちらからダウンロードできます。</p>
<p><a href="https://www.dropbox.com/s/61n8o9i00syjdge/vs_community.exe?dl=1" target="_blank" rel="noopener noreferrer">Visual Studio 2015(Community)</a></p>
<h3><span id="DBBrowserforSQLite">DB.Browser.for.SQLiteのインストール</span></h3>
<p>SQLiteは専用ソフトがないとデータベースを開いて中を見ることができません。</p>
<p>開くとこんな感じで見ることができます。</p>
<img loading="lazy" decoding="async" class="alignnone wp-image-3886" src="https://loosecarrot.com/wp-content/uploads/2019/11/SQLite-DBBrowse.png" sizes="(max-width: 525px) 100vw, 525px" srcset="https://loosecarrot.com/wp-content/uploads/2019/11/SQLite-DBBrowse.png 688w, https://loosecarrot.com/wp-content/uploads/2019/11/SQLite-DBBrowse-300x189.png 300w" alt="" width="525" height="331" />
<p>こちらからダウンロードできます。</p>
<p><a href="https://www.dropbox.com/s/k0ccf1ax222w6c2/DB.Browser.for.SQLite-3.9.1-win64.exe?dl=1" target="_blank" rel="noopener noreferrer">SQLite DB.Browser</a></p>
<h2>エクセル取込み更新のコード</h2>
<p>フォーム画面のプログラムは以下です。</p>
<div class="concept-box2">
<p><span style="color: #ff0000;">※以下のソースはここでは書いていませんので、必要あれば、ダウンロードをお願いします。</span></p>
<p>・DBを更新や検索するSQLのファイル</p>
<p>・SQLiteのDBへアクセスしたり、更新する部品を書いたファイル</p>
</div>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">using System.Data.OleDb;
using System.IO;

---------------------------
/// &lt;summary&gt;
/// 検索ボタンクリック時
/// &lt;/summary&gt;
/// &lt;param name="sender"&gt;&lt;/param&gt;
/// &lt;param name="e"&gt;&lt;/param&gt;
private void buttonSearch_Click(object sender, EventArgs e)
{
    DataSet ds = new DataSet();                    //datatableを格納用
    DataTable dt = new DataTable();                //データを格納
    DataAccess dataAccess = new DataAccess();      //インスタンス化

    //データを取得
    ds.Tables.Add(dataAccess.getSupplierAll().Copy());

    //データグリッドビューにセット
    dataGridView.DataSource = ds.Tables["Supplier"];
}


/// &lt;summary&gt;
/// エクセル取込更新ボタンクリック時
/// &lt;/summary&gt;
/// &lt;param name="sender"&gt;&lt;/param&gt;
/// &lt;param name="e"&gt;&lt;/param&gt;
private void buttonUpdateByExcel_Click(object sender, EventArgs e)
{
    DataSet dsExcelSheets = new DataSet();              //エクセルシートごとのdatatableを格納用
    DataTable dtSheet = new DataTable();                //エクセルシートのデータを格納
    DataAccess dataAccess = new DataAccess();           //インスタンス化
    string filePath = "";                               //エクセルのパスを格納
    

    //ダイアログでファイルパスを取得
    filePath = getExcelPath();

    //エクセルをDatatableに取込む
    dsExcelSheets.Tables.Add(getDataTableFromExcel(filePath, "Supplier", true, true).Copy());
    
    //Datatableの内容でDBを更新
    //Datatableの行数分ループ
    foreach (DataRow dr in dsExcelSheets.Tables[0].Rows)
    {
        dataAccess.updateSupplier(dr);
    }
    
    //Supplierというdatatableがあれば削除
    if(dsExcelSheets.Tables.Contains("Supplier"))
    {
        dsExcelSheets.Tables.Remove("Supplier");
    }

    //データを取得
    dsExcelSheets.Tables.Add(dataAccess.getSupplierAll().Copy());

    //データグリッドビューにセット
    dataGridView.DataSource = dsExcelSheets.Tables["Supplier"];


    MessageBox.Show("エクセル更新完了");
    
}

/// &lt;summary&gt;
/// ファイルパスを返す
/// &lt;/summary&gt;
/// &lt;returns&gt;&lt;/returns&gt;
public string getExcelPath()
{
    string path = "";

    //ファイルダイアログを生成する
    OpenFileDialog op = new OpenFileDialog();
    op.Title = "ファイルを開く";
    op.Filter = "すべてのファイル(*.*)|*.*";
    op.FilterIndex = 1;

    //オープンファイルダイアログを表示する
    DialogResult dialog = op.ShowDialog();

    //「開く」ボタンが選択された時の処理
    if (dialog == DialogResult.OK)
    {
        path = op.FileName;
    }
    //「キャンセル」時の処理
    else if (dialog == DialogResult.Cancel)
    { path = ""; }

    return path;
}

/// &lt;summary&gt;
/// シートをdatatableに格納
/// &lt;/summary&gt;
/// &lt;param name="strFilePath"&gt;&lt;/param&gt;
/// &lt;param name="strSheetName"&gt;&lt;/param&gt;
/// &lt;param name="isInHeader"&gt;&lt;/param&gt;
/// &lt;param name="isAllStrColum"&gt;&lt;/param&gt;
/// &lt;returns&gt;&lt;/returns&gt;
public DataTable getDataTableFromExcel(string excelFilePath, string strSheetName, Boolean isInHeader = true, Boolean isAllStrColum = true)
{
    DataTable dt = new DataTable();
    string strInHeader = isInHeader ? "YES" : "NO";        // ヘッダー設定
    string strIMEX = isAllStrColum ? "IMEX=1;" : "";       // 文字列型設定
    string strFileEx = Path.GetExtension(excelFilePath);   // ファイル拡張子
    string strExcelVer = "Excel ";                         // Excelファイルver確認

    //テーブル名をセット
    dt.TableName = strSheetName;

    //拡張子ごとにエクセルのバージョンを取得
    if (strFileEx == ".xls")
    {
        strExcelVer += "8.0;";
    }
    else if (strFileEx == ".xlsx" || strFileEx == ".xlsm")
    {
        strExcelVer += "12.0;";
    }
    else
    {
        return null;
    }

    //コネクションストリングを作成
    String strCon = "Provider=Microsoft.ACE.OLEDB.12.0;"            // プロバイダ設定
                                                                    //= "Provider=Microsoft.Jet.OLEDB.4.0;"
                        + "Data Source=" + excelFilePath + "; "     // ソースファイル指定
                        + "Extended Properties=\"" + strExcelVer    // Excelファイルver指定
                        + "HDR=" + strInHeader + ";"                // ヘッダー設定
                        + strIMEX                                   // フィールドの型を強制的にテキスト
                        + "\"";
    OleDbConnection con = new OleDbConnection(strCon);
    String strCmd = "SELECT * FROM [" + strSheetName + "$]";

    // 読み込み
    OleDbCommand cmd = new OleDbCommand(strCmd, con);
    OleDbDataAdapter adp = new OleDbDataAdapter(cmd);
    adp.Fill(dt);

    return dt;
}</pre><p></p>
<h2>解説</h2>
<h3>エクセルをdatatableに取込み</h3>
<p>41行目でエクセルを読み込んで、datatableに取込んでいます。</p>
<p>58行目の<span class="crayon-e" style="color: #0000ff;">getDataTableFromExcel</span>メソッドでエクセルの内容をSELECT * で全件取得し、datatableに格納させています。</p>
<div class="concept-box2">
<p>以下のエラーが出る可能性があります。</p>
<p><span style="color: #ff0000;">&#8216;Microsoft.ACE.OLEDB.12.0&#8217; プロバイダーはローカルのコンピューターに登録されていません。</span></p>
</div>
<p>AccessDatabaseEngine_X64.exeをダウンロードしてインストールしてください。</p>
<p>こちらからダウンロード可能です。</p>
<p><a href="https://www.microsoft.com/ja-jp/download/details.aspx?id=13255" target="_blank" rel="noopener noreferrer">https://www.microsoft.com/ja-jp/download/details.aspx?id=13255</a></p>
<p>参考サイト：<a href="https://qiita.com/nakashima_bike/items/8eb5e6443ef17a3f0274" target="_blank" rel="noopener noreferrer">Microsoft.ACE.OLEDB.12.0プロバイダーはローカルコンピュータに登録されていません</a></p>
<p>原因は32ビットのofficeを動かしているため、64ビットようを使う必要があるからだそうです。</p>
<p>&nbsp;</p>
<p>エクセルを立上げずに読取る方法も紹介しています。</p>
<p>https://loosecarrot.com/2020/03/01/4091/</p>
<h3>datatableのデータを使ってDB更新</h3>
<p>45行目～48行目でdatatableのレコード分ループして更新しています。</p>
<p>1行ずつdatarowに入った値を元にDBを更新するSQLを発行しています。</p>
<p><span class="crayon-v">dataAccess</span><span class="crayon-sy">.</span><span class="crayon-e">updateSupplier</span><span class="crayon-sy">(</span><span class="crayon-v">dr</span><span class="crayon-sy">)</span><span class="crayon-sy">;メソッドの中身は以下のように記載しています。</span></p><pre class="urvanov-syntax-highlighter-plain-tag">/// &lt;summary&gt;
/// supplier_cdをキーにSupplierへ更新
/// &lt;/summary&gt;
/// &lt;param name="drArg"&gt;&lt;/param&gt;
/// &lt;returns&gt;&lt;/returns&gt;
public int updateSupplier(DataRow drArg)
{
    int updateCount = 0;                                                                //更新件数を格納
    DbHelper = new SQLiteDBHelper(localDBPath);                                         //インスタンス化
    StringBuilder sb = new StringBuilder();                                             //クエリ格納用

    //パラメータをセット
    SQLiteParameter[] parameters = new SQLiteParameter[]
    {
            new SQLiteParameter("@supplier_cd",drArg.ItemArray[0]),
            new SQLiteParameter("@supplier_name",drArg.ItemArray[1]),
            new SQLiteParameter("@addr",drArg.ItemArray[2]),
            new SQLiteParameter("@post_num",drArg.ItemArray[3]),
            new SQLiteParameter("@tel",drArg.ItemArray[4]),
            new SQLiteParameter("@fax",drArg.ItemArray[5])
    };


    sb.AppendLine("UPDATE Supplier SET");
    sb.AppendLine("	supplier_name         = @supplier_name,");
    sb.AppendLine("	addr                  = @addr,");
    sb.AppendLine("	post_num              = @post_num,");
    sb.AppendLine("	tel                   = @tel,");
    sb.AppendLine("	fax                   = @fax");
    sb.AppendLine("WHERE supplier_cd      = @supplier_cd");

    //更新
    updateCount = DbHelper.ExecuteNonQuery(sb.ToString(), parameters);

    return updateCount;
}</pre><p></p>
<h3>更新後のデータを表示</h3>
<p>56行目～60行目で更新後のデータを検索し、表示しています。</p>
<h2>更新結果</h2>
<p>更新前の状態で検索をすると以下の状態です。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-3997" src="https://loosecarrot.com/wp-content/uploads/2020/02/073b65fc228e0a756b9fb0b49a579edc.png" alt="" width="637" height="525" />
<p>以下の内容で<strong><span style="color: #ff0000;">tel列</span></strong>と<strong><span style="color: #ff0000;">fax列</span></strong>をエクセル更新します。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-3998" src="https://loosecarrot.com/wp-content/uploads/2020/02/b8b0a43a5b04b0b9e8e54b4f36fa8ddc.png" alt="" width="806" height="432" />
<p>エクセル取込更新ボタン後は以下が表示されます。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-3999" src="https://loosecarrot.com/wp-content/uploads/2020/02/bfd1b7b7e7eab4632d9893b06a92015c.png" alt="" width="634" height="521" />
<h2>参照設定</h2>
<h3>SQLite</h3>
<p>SQLite.dllがあるので、参照設定追加をしてください。</p>
<p>dllは「<span style="color: #ff0000;">～UpdateDatabaseByExcel\SQLite\System.Data.SQLite.dll</span>」のパスに配置されています。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-3990" src="https://loosecarrot.com/wp-content/uploads/2020/02/ae669210e6567258649d469d616d8e39.png" alt="" width="800" height="552" />
<p>https://loosecarrot.com/2019/11/25/3860/</p>The post <a href="https://loosecarrot.com/2020/02/19/3988/">C# エクセル取込みしてSQLでデータ更新</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2020/02/19/3988/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3988</post-id>	</item>
		<item>
		<title>C# エクセルをDatatble,Datagridviewに取込み(複数シート)</title>
		<link>https://loosecarrot.com/2020/02/17/3971/</link>
					<comments>https://loosecarrot.com/2020/02/17/3971/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Sun, 16 Feb 2020 15:00:13 +0000</pubDate>
				<category><![CDATA[C#/VB.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[プログラミング独学]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=3971</guid>

					<description><![CDATA[<p>C#でエクセルをdatatableに取込むことはたまにあると思います。 備忘録として残しておきます。 実際に作ったファイルはこちらからダウンロードできます。 エクセルをDatatbleに取込み、Datagridviewに</p>
The post <a href="https://loosecarrot.com/2020/02/17/3971/">C# エクセルをDatatble,Datagridviewに取込み(複数シート)</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<img loading="lazy" decoding="async" class="alignnone size-full wp-image-3973" src="https://loosecarrot.com/wp-content/uploads/2020/02/13fda7d6d4577527d02c5f23842a9056.png" alt="" width="800" height="400" />
<p>C#でエクセルをdatatableに取込むことはたまにあると思います。</p>
<p>備忘録として残しておきます。</p>
<p>実際に作ったファイルは<a href="https://base-shop.loosecarrot.com/items/26529845" target="_blank" rel="noopener noreferrer">こちらからダウンロード</a>できます。</p>
<p><iframe loading="lazy" title="Excel Datatable取込み複数" width="500" height="375" src="https://www.youtube.com/embed/1mCzFa9RZm0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<h2>エクセルをDatatbleに取込み、Datagridviewに表示</h2>
<p>色々と解説はありますが、それは後にして、コードはこんな感じです。</p>
<p>エクセルを複数シート取込んで、データグリッドビューに表示します。</p>
<p>エクセルを開かずに処理する方法もあります。</p>
<p>https://loosecarrot.com/2020/03/01/4091/</p>
<p>流れは以下の通りです。</p>
<div class="simple-box3">
<p>①ダイアログでエクセルを選択<br />
②エクセルを開く<br />
③シートごとにdatatableへ格納<br />
④エクセルを閉じる</p>
</div>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">using System.Data.OleDb;
using System.IO;
using Excel = Microsoft.Office.Interop.Excel; ---------------------------

/// &lt;summary&gt;
/// 取込みボタクリック時
/// &lt;/summary&gt;
/// &lt;param name="sender"&gt;&lt;/param&gt;
/// &lt;param name="e"&gt;&lt;/param&gt;
private void import_Click(object sender, EventArgs e)
{

    DataSet dsExcelSheets = new DataSet();              //エクセルシートごとのdatatableを格納用
    DataTable dtSheet = new DataTable();                //エクセルシートのデータを格納
    string filePath = "";                               //エクセルのパスを格納

    Excel.Application objExcel = null;                  //Excelオブジェクト
    Excel.Workbooks objWorkBooks = null;                //workbooksオブジェクト
    Excel.Workbook objWorkBook = null;                  //workbookオブジェクト
    Excel.Sheets objSheets = null;                      //複数シートオブジェクト
    Excel.Worksheet objSheet = null;                    //シートオブジェクト

    //ダイアログでファイルパスを取得
    filePath = getExcelPath();

    //エクセルを開く
    objExcel = new Excel.Application();
    objExcel.Visible = true;

    // Excelファイルをオープンする
    objWorkBooks = objExcel.Workbooks;
    objWorkBook = objWorkBooks.Open(filePath);

    //シートを取得
    objSheets = objWorkBook.Worksheets;

    //シート数分ループしながら、datatableに取込
    for (int i = 1; i &lt;= objSheets.Count; i++)
    {
        //シートをセット
        objSheet = objSheets[i];

        //シートからSELECT *する
        dsExcelSheets.Tables.Add(getDataTableFromExcel(filePath, objSheet.Name,true,true).Copy());

    }

    //---------COMオブジェクトの解放---------
    // Sheet解放
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheets);

    // Book解放
    objWorkBook.Close();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkBook);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkBooks);

    // Excelアプリケーションを解放
    objExcel.Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);

    GC.Collect();
    
    //---------COMオブジェクトの解放---------

    //データグリッドビューにセット
    dataGridViewSupplier.DataSource = dsExcelSheets.Tables["Supplier"];
    dataGridViewFoods.DataSource = dsExcelSheets.Tables["Foods"];
    dataGridViewGoods.DataSource = dsExcelSheets.Tables["Goods"];

    MessageBox.Show("完了");

}

/// &lt;summary&gt;
/// ファイルパスを返す
/// &lt;/summary&gt;
/// &lt;returns&gt;&lt;/returns&gt;
public string getExcelPath()
{
    string path = "";

    //ファイルダイアログを生成する
    OpenFileDialog op = new OpenFileDialog();
    op.Title = "ファイルを開く";
    op.InitialDirectory = @"C:\";
    op.Filter = "すべてのファイル(*.*)|*.*";
    op.FilterIndex = 1;

    //オープンファイルダイアログを表示する
    DialogResult dialog = op.ShowDialog();

    //「開く」ボタンが選択された時の処理
    if (dialog == DialogResult.OK)
    {
        path = op.FileName;
    }
    //「キャンセル」時の処理
    else if (dialog == DialogResult.Cancel)
    { }
    
    return path;
}

/// &lt;summary&gt;
/// シートをdatatableに格納
/// &lt;/summary&gt;
/// &lt;param name="strFilePath"&gt;&lt;/param&gt;
/// &lt;param name="strSheetName"&gt;&lt;/param&gt;
/// &lt;param name="isInHeader"&gt;&lt;/param&gt;
/// &lt;param name="isAllStrColum"&gt;&lt;/param&gt;
/// &lt;returns&gt;&lt;/returns&gt;
public DataTable getDataTableFromExcel(string excelFilePath, string strSheetName, Boolean isInHeader = true, Boolean isAllStrColum = true)
{
    DataTable dt = new DataTable();
    string strInHeader = isInHeader ? "YES" : "NO";        // ヘッダー設定
    string strIMEX = isAllStrColum ? "IMEX=1;" : "";       // 文字列型設定
    string strFileEx = Path.GetExtension(excelFilePath);   // ファイル拡張子
    string strExcelVer = "Excel ";                         // Excelファイルver確認

    //テーブル名をセット
    dt.TableName = strSheetName;

    //拡張子ごとにエクセルのバージョンを取得
    if (strFileEx == ".xls")
    {
        strExcelVer += "8.0;";
    }
    else if (strFileEx == ".xlsx" || strFileEx == ".xlsm")
    {
        strExcelVer += "12.0;";
    }
    else
    {
        return null;
    }

    //コネクションストリングを作成
    String strCon = "Provider=Microsoft.ACE.OLEDB.12.0;"            // プロバイダ設定
                                                                    //= "Provider=Microsoft.Jet.OLEDB.4.0;"
                        + "Data Source=" + excelFilePath + "; "     // ソースファイル指定
                        + "Extended Properties=\"" + strExcelVer    // Excelファイルver指定
                        + "HDR=" + strInHeader + ";"                // ヘッダー設定
                        + strIMEX                                   // フィールドの型を強制的にテキスト
                        + "\"";
    OleDbConnection con = new OleDbConnection(strCon);
    String strCmd = "SELECT * FROM [" + strSheetName + "$]";

    // 読み込み
    OleDbCommand cmd = new OleDbCommand(strCmd, con);
    OleDbDataAdapter adp = new OleDbDataAdapter(cmd);
    adp.Fill(dt);

    return dt;
}</pre><p></p>
<h2>解説</h2>
<p>それぞれ処理4つのポイントを解説します。</p>
<h3>①ダイアログでエクセルを選択</h3>
<p>20行目から<span class="crayon-e">getExcelPath</span><span class="crayon-sy">(</span><span class="crayon-sy">)というメソッドに飛んでいます。</span></p>
<p>詳細は以下をご確認ください。</p>
<p>https://loosecarrot.com/2020/02/18/3978/</p>
<h3>②エクセルを開く</h3>
<p>エクセルを開くにはブックやらシートやらと変数を定義しないとダメなようです。</p>
<p>13行目～17行目です。</p>
<p>そして、<span class="crayon-v">objWorkBooks</span><span class="crayon-sy">.</span><span class="crayon-e">Open</span><span class="crayon-sy">(</span><span class="crayon-v">filePath</span><span class="crayon-sy">)</span><span class="crayon-sy">;でエクセルを開いています。</span></p>
<h3>③シートごとにdatatableへ格納</h3>
<p>31行目でシートを変数へ格納し、</p>
<p>34行目からの処理でシート枚数分ループさせています。</p>
<p><span style="color: #ff0000;">getDataTableFromExcel</span>メソッド内でシートのデータすべてを取得しています。</p>
<p>SQLの<span style="color: #ff0000;">SELECT * [strSheetName] はシートのすべてのデータを取得するという意味です。</p>
<p><strong><span style="color: #0000ff;">※列が1列空いたり、行が1行空白だと、その前までしか取得されません。</span></strong></p>
<h3>④エクセルを閉じる</h3>
<p>44行目～58行目でエクセルを閉じて、オブジェクトを開放しています。</p>
<p>これでエクセルを閉じたり、プロセスやメモリを開放することができます。</p>
<p><strong>エクセルを取込んでSQLで更新する</strong>方法も紹介しているのでご覧ください。</p>
<p>https://loosecarrot.com/2020/02/19/3988/</p>
<h2>実行結果</h2>
<p>3シートがそれぞれデータグリッドビューに表示されました。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-3972" src="https://loosecarrot.com/wp-content/uploads/2020/02/7a18262bfd80c221b1f911d700129a2e.jpg" alt="" width="663" height="474" />
<p>https://loosecarrot.com/2019/11/25/3860/</p>
<h2>補足</h2>
<h3>Microsoft.ACE.OLEDB.12.0</h3>
<p>以下が出た場合</p>
<p><span style="color: #ff0000;">&#8216;Microsoft.ACE.OLEDB.12.0&#8217; プロバイダーはローカルのコンピューターに登録されていません。</span></p>
<p>AccessDatabaseEngine_X64.exeをダウンロードしてインストールしてください。</p>
<p>こちらからダウンロード可能です。</p>
<p><a href="https://www.microsoft.com/ja-jp/download/details.aspx?id=13255" target="_blank" rel="noopener noreferrer">https://www.microsoft.com/ja-jp/download/details.aspx?id=13255</a></p>
<p>参考サイト：<a href="https://qiita.com/nakashima_bike/items/8eb5e6443ef17a3f0274" target="_blank" rel="noopener noreferrer">Microsoft.ACE.OLEDB.12.0プロバイダーはローカルコンピュータに登録されていません</a></p>
<p>原因は32ビットのofficeを動かしているため、64ビットようを使う必要があるからだそうです。</p>
<h3>エクセル参照設定</h3>
<p>ソリューションに参照設定で「Microsoft Excel XXX Object Library」を追加しておいてください。</p>
<p>参考：<a href="http://excelcsharp.lance40.com/preparations.html" target="_blank" rel="noopener noreferrer">Excelの参照設定</a></p>The post <a href="https://loosecarrot.com/2020/02/17/3971/">C# エクセルをDatatble,Datagridviewに取込み(複数シート)</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2020/02/17/3971/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3971</post-id>	</item>
		<item>
		<title>Excel VBAの配列からtsv・csvを出力する</title>
		<link>https://loosecarrot.com/2020/02/15/3951/</link>
					<comments>https://loosecarrot.com/2020/02/15/3951/#comments</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Sat, 15 Feb 2020 04:45:06 +0000</pubDate>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[プログラミング独学]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=3951</guid>

					<description><![CDATA[<p>仕事でtsvやcsvをエクセルから出したいことがありました。 備忘録として残しておきます。 インターフェースファイルを作るときなどにも役立つのでぜひ知っておいてください。 実際に作ったファイルはこちらから無料でダウンロー</p>
The post <a href="https://loosecarrot.com/2020/02/15/3951/">Excel VBAの配列からtsv・csvを出力する</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<img loading="lazy" decoding="async" class="alignnone size-full wp-image-3961" src="https://loosecarrot.com/wp-content/uploads/2020/02/7e07b1d28193de5d08fd8647004f1bd2-1.png" alt="" width="800" height="400" />
<p>仕事でtsvやcsvをエクセルから出したいことがありました。</p>
<p>備忘録として残しておきます。</p>
<p>インターフェースファイルを作るときなどにも役立つのでぜひ知っておいてください。</p>
<p>実際に作ったファイルはこちらから<a href="https://www.dropbox.com/scl/fi/kxxm00exn6qechfrk46sy/csv-tsvOutput.zip?rlkey=srjxk94yvmmzcltz4oqrt61h5&amp;dl=1">無料でダウンロード</a>できます。</p>
<h2>エクセルの仕様</h2>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-6670" src="https://loosecarrot.com/wp-content/uploads/2020/02/Excel-VBAの配列からtsv・csvを出力する_9-1.jpg" alt="" width="800" height="400" />
<p>区切り文字とダブルクォーテーション囲みの有無を設定できます。</p>
<p>出力ボタンをクリックすると、隣の「出力元シート」の内容を出力します。</p>
<p>出力場所はエクセルの配置されている場所です。</p>
<h3>マクロが無効にされる場合</h3>
<p>ダウンロードすると、以下のような警告が表示されることがあります。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-6636" src="https://loosecarrot.com/wp-content/uploads/2023/09/使い方_1.jpg" alt="" width="654" height="131" />
<p>ファイルを右クリックして、プロパティから「許可する」にチェックを入れて下さい。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-6637" src="https://loosecarrot.com/wp-content/uploads/2023/09/使い方_2.jpg" alt="" width="421" height="542" />
<h2>エクセルからファイル出力するコード</h2>
<p>コードはこんな感じです。</p>
<p>流れとしては以下です。</p>
<div class="simple-box3">
<p>①出力対象範囲をを決める(<span style="color: #ff0000;">可変対応しており、列、行が増えてもOK</span>)</p>
<p>②出力範囲を配列に取得する</p>
<p>③配列から区切り文字で変数へ格納</p>
<p>④ファイルへ書き込む</p>
<p>ファイル名は[Output_] + [yyyyMMdd_] + [mmss]</p>
</div>
<p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">'=============================================
'目的       ：ファイルを出力
'履歴        :#2020/02/14
'=============================================
Sub writeTsv()
     
    Dim startRow As Long                              '読込みする開始行
    Dim endRow As Long                                '読込みする終了行
    Dim startCol As Long                              '読込みする開始列
    Dim endCol As Long                                '読込みする終了行
    Dim menuWs As Worksheet                           'メニューシート
    Dim ws As Worksheet                               'シート
    Dim outputArray As Variant                        '出力するデータの配列
    Dim filePath As String                            '出力するパス
    Dim i As Integer                                   'ループ用変数
    Dim j As Long                                      'ループ用変数
    Dim outputText As String                           '出力テキストを格納
    Dim Delimiter As String                            '区切り文字
    Dim Extension As String                            'ファイルの拡張子
    Dim enclosingLetter  As String                      '囲みの文字
    
    
    '-----------メニューシートを設定値をセット-----------
    Set menuWs = ThisWorkbook.Worksheets("メニュー")
    menuWs.Activate
    '区切り文字ををセット
    If menuWs.Range("E5") = "カンマ" Then
        Delimiter = ","
        Extension = ".csv"
    ElseIf menuWs.Range("E5") = "タブ" Then
        Delimiter = vbTab
        Extension = ".tsv"
    Else
        MsgBox "区切文字を選択してください"
        Exit Sub
    End If
    
    '囲み文字をセット
    If menuWs.Range("E6") = "あり" Then
        enclosingLetter = Chr(34)
    Else
        enclosingLetter = ""
    End If
    
    
    '-----------出力元シートからファイル出力-----------
    '処理対象のシートをセット
    Set ws = ThisWorkbook.Worksheets("出力元シート")
    ws.Activate
    
    '出力対象範囲を取得する
    startCol = 1                                        '開始列
    startRow = 2                                        '開始行
    endCol = Range("A1").End(xlToRight).Column          '最終列
    endRow = Range("A3").End(xlDown).Row - 1            '最終行
    
    
    '処理対象の範囲を配列に取得
    Set outputArray = ActiveSheet.Range(Cells(startRow, startCol), Cells(endRow, endCol))
    
    
    
    '-----------ファイルに書き込む文字列を作成-----------
    '列×行数分ループ
    For i = 1 To endRow
        For j = 1 To endCol
        
            '最終列かつ最終行に来たら改行
            If i = endRow And j = endCol Then
                outputText = outputText &amp; enclosingLetter &amp; outputArray(i, j) &amp; enclosingLetter
                GoTo NextLoop
            End If
            
            '最終列に来たら改行
            If j = endCol Then
                outputText = outputText &amp; enclosingLetter &amp; outputArray(i, j) &amp; enclosingLetter &amp; vbCrLf
                GoTo NextLoop
            End If
            
            '区切り文字で1セルずつ変数へ格納
            outputText = outputText &amp; enclosingLetter &amp; outputArray(i, j) &amp; enclosingLetter &amp; Delimiter
            
NextLoop:
            
        Next j
    Next i
        
    
    'ファイルを書き込み
    '出力先とファイル名をセット
    filePath = ActiveWorkbook.Path &amp; "\Output_" &amp; Format(Now, "yyyymmdd_HHMMSS") &amp; Extension
    
    Open filePath For Output As #1
    Print #1, outputText
    Close #1
    
    
    '処理対象のシートをセット
    menuWs.Activate
    
    MsgBox "出力完了"
    
End Sub</pre><p></p>
<h2>実行結果</h2>
<p>「出力元シート」に記載されている内容が出力されます。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-6671" src="https://loosecarrot.com/wp-content/uploads/2020/02/Excel-VBAの配列からtsv・csvを出力する_10.jpg" alt="" width="800" height="400" />
<p>エクセルの配置されている場所にファイルが出力されます。</p>
<p>※以下はtsv出力の結果のファイルです。</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-6672" src="https://loosecarrot.com/wp-content/uploads/2020/02/Excel-VBAの配列からtsv・csvを出力する_11.jpg" alt="" width="800" height="400" />
<h2>解説</h2>
<p>42行目～62行目でメニューシートの設定内容を変数に格納しています。</p>
<p>66行目～92行目で出力元シートの内容を配列に格納しています。</p>
<p>91、92行目で一番最後の列、行を取得しているため、<span style="color: #ff0000;">列、行が増えても自動で出力範囲が変わります。</span></p>
<p>63行目～86行目でセルごとの値を区切り文字を付けて文字連結しています。</p>
<p>enclosingLetterは、ダブルクォーテーション囲み有無の設定の際に、</p>
<p>「あり」の場合、[&#8220;]をセット</p>
<p>「なし」の場合、空白をセットすることで囲み文字が制御されています。</p>The post <a href="https://loosecarrot.com/2020/02/15/3951/">Excel VBAの配列からtsv・csvを出力する</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2020/02/15/3951/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3951</post-id>	</item>
		<item>
		<title>VBAでバーコード生成する</title>
		<link>https://loosecarrot.com/2020/01/10/4337/</link>
					<comments>https://loosecarrot.com/2020/01/10/4337/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Fri, 10 Jan 2020 13:29:08 +0000</pubDate>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[Excel]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=4337</guid>

					<description><![CDATA[<p>商品をこれから出品したりすることもあるので、バーコード発行するエクセルVBAを作ってみました。 実際に作ったファイルはこちらから無料でダウンロードできます。 JANCODE-nicBARで出力したサンプルを載せておきます</p>
The post <a href="https://loosecarrot.com/2020/01/10/4337/">VBAでバーコード生成する</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4399" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_0.jpg" alt="" width="800" height="400" />
<p>商品をこれから出品したりすることもあるので、バーコード発行するエクセルVBAを作ってみました。</p>
<p>実際に作ったファイルはこちらから<a href="https://www.dropbox.com/scl/fi/lsur1exp304vh5uw00l99/.zip?rlkey=doffc0ot551qfz1iry5a990jk&amp;dl=1">無料でダウンロード</a>できます。</p>
<p>JANCODE-nicBARで<a href="https://www.dropbox.com/scl/fi/g4lnq0p33yywaayuidfam/.pdf?rlkey=gghp0rx8q2f128t9bc2f9mhqm&amp;dl=1" target="_blank" rel="noopener noreferrer">出力したサンプル</a>を載せておきます。</p>
<p>因みにフォントはそれぞれ以下からダウンロードさせていただきました。</p>
<div class="simple-box2">
<p><a href="http://nicotan.at-ninja.jp/blog/jancode_font_download.html" target="_blank" rel="noopener noreferrer">JANCODE-nicBAR</a></p>
<p><a href="http://nicotan.at-ninja.jp/blog/jancode_font_download.html" target="_blank" rel="noopener noreferrer">JANCODE-nicWabun</a></p>
<p><a href="https://mam-mam.net/download/nw-7.html" target="_blank" rel="noopener noreferrer">NW-7</a></p>
<p><a href="https://mam-mam.net/download/code39.html" target="_blank" rel="noopener noreferrer">Code39</a></p>
</div>
<h2>バーコード発行エクセルの説明</h2>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4404" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_4.jpg" alt="" width="800" height="400" />
<p>サンプルを見て分かる通りですが、<span style="color: #ff0000;">1ページに24枚</span>のバーコードを作ります。</p>
<p>1行に3枚×8段が1シートになります。</p>
<div class="kaerebalink-image" style="float: left; margin: 0 15px 10px 0;"><img loading="lazy" decoding="async" class="alignnone wp-image-4403" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_3.jpg" alt="" width="290" height="145" /><img loading="lazy" decoding="async" style="border: none;" src="//i.moshimo.com/af/i/impression?a_id=2087701&amp;p_id=1225&amp;pc_id=1925&amp;pl_id=18502" width="1" height="1" /></div>
<div class="kaerebalink-info" style="line-height: 120%; zoom: 1; overflow: hidden;">
<div class="kaerebalink-name" style="margin-bottom: 10px; line-height: 120%;">
<a href="https://www.amazon.co.jp/gp/product/B088M19X1C/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B088M19X1C&amp;linkCode=as2&amp;tag=loosecarrot-22&amp;linkId=fba68d1f0ae11a61a2845c67cd088202" target="_blank" rel="noopener noreferrer">バーコードシール 24面</a><img loading="lazy" decoding="async" style="border: none;" src="//i.moshimo.com/af/i/impression?a_id=2087701&amp;p_id=1225&amp;pc_id=1925&amp;pl_id=18502" width="1" height="1" />
<div class="kaerebalink-powered-date" style="font-size: 8pt; margin-top: 5px; font-family: verdana; line-height: 120%;">posted with <a href="https://kaereba.com" target="_blank" rel="nofollow noopener noreferrer">カエレバ</a></div>
</div>
<div class="kaerebalink-link1" style="margin-top: 10px;">
<div class="shoplinkyahoo" style="display: inline; margin-right: 5px;"><a href="//af.moshimo.com/af/c/click?a_id=2087701&amp;p_id=1225&amp;pc_id=1925&amp;pl_id=18502&amp;url=https%3A%2F%2Fstore.shopping.yahoo.co.jp%2Fsettaroponpon%2F20190711142128-00811.html%3Fsc_i%3Dshp_pc_search_itemlist_shsrg_title" target="_blank" rel="noopener noreferrer">Yahooショッピング</a><img loading="lazy" decoding="async" style="border: none;" src="//i.moshimo.com/af/i/impression?a_id=2087701&amp;p_id=1225&amp;pc_id=1925&amp;pl_id=18502" width="1" height="1" /></div>
<div class="shoplinkamazon" style="display: inline; margin-right: 5px;"><a href="https://www.amazon.co.jp/gp/product/B088M19X1C/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B088M19X1C&amp;linkCode=as2&amp;tag=loosecarrot-22&amp;linkId=fba68d1f0ae11a61a2845c67cd088202" target="_blank" rel="noopener noreferrer">Amazon</a></div>
<div class="shoplinkrakuten" style="display: inline; margin-right: 5px;"><a href="https://rpx.a8.net/svt/ejp?a8mat=2BY7HX+8Y3JTM+2HOM+BW8O1&amp;rakuten=y&amp;a8ejpredirect=http%3A%2F%2Fhb.afl.rakuten.co.jp%2Fhgc%2F0ea62065.34400275.0ea62066.204f04c0%2Fa14100475174_2BY7HX_8Y3JTM_2HOM_BW8O1%3Fpc%3Dhttps%253A%252F%252Fitem.rakuten.co.jp%252Fmannishboy%252F20014844096%252F%26m%3Dhttps%253A%252F%252Fitem.rakuten.co.jp%252Fmannishboy%252F20014844096%252F" target="_blank" rel="noopener noreferrer">楽天市場</a><img loading="lazy" decoding="async" style="border: none;" src="//i.moshimo.com/af/i/impression?a_id=2087701&amp;p_id=54&amp;pc_id=54&amp;pl_id=616" width="1" height="1" /></div>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>シートは3枚あります。</p>
<div class="simple-box2">
<p>「リスト」シート<br />
「バーコード」シート<br />
「フォーマット」シート</p>
</div>
<h3>リストシート</h3>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4408" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_6.jpg" alt="" width="1095" height="373" srcset="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_6.jpg 1095w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_6-300x102.jpg 300w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_6-1024x349.jpg 1024w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_6-768x262.jpg 768w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_6.jpg 856w" sizes="(max-width: 1095px) 100vw, 1095px" />
<p>商品(型番)、数量、商品名をを入力して、バーコード生成ボタンを押すと、バーコードを発行できます。</p>
<p>EF列で発行するバーコードやフォントサイズなどを指定することでそれに応じたバーコードが出せます。</p>
<h3>バーコードシート</h3>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4409" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_7.jpg" alt="" width="776" height="364" />
<p>リストシートで入力した内容が発行されます。</p>
<p>1ページに24枚(3×8行)できます。</p>
<h3>フォーマットシート</h3>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4410" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_8.jpg" alt="" width="809" height="378" />
<p>フォーマットシートに設定した幅や高さをコピーして、バーコードシートが作成されます。</p>
<p>そのため、フォーマットシートで変更した高さや幅を変更することで印刷するバーコードも変更されます。</p>
<h2>バーコード発行エクセルの使い方</h2>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4402" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_1.jpg" alt="" width="800" height="400" />
<p>基本的に幅や高さは自分で変更できるように作っています。</p>
<p>また、フォントや発行するバーコードの種類も決めることができます。</p>
<p>詳細をこの下で説明していきます。</p>
<h3>フォントのインストール</h3>
<p>フォントは事前にインストールした状態でバーコード発行をして下さい。</p>
<div class="concept-box2">
<p>フォントがないとマクロを実行してもバーコードは表示されません。</p>
</div>
<p>私がテスト的に試したのは以下の3つのフォントです。</p>
<p>すべて、ウェブサイトからダウンロードできますが、一応リンクも載せておきます。</p>
<div class="simple-box3">
<p><a href="https://www.dropbox.com/s/y399480lkynjo9y/CODE39.ttf?dl=1" target="_blank" rel="noopener noreferrer">CODE39</a><br />
<a href="https://www.dropbox.com/s/s3w0nia1ulmr1r6/NW-7.ttf?dl=1" target="_blank" rel="noopener noreferrer">NW-7</a><br />
<a href="https://www.dropbox.com/s/xoed3fmbov2l0q9/JANCODE-nicBAR.ttf?dl=1" target="_blank" rel="noopener noreferrer">JANCODE-nicBAR</a><br />
<a href="https://www.dropbox.com/s/mbzrxoh55b7t60n/JANCODE-nicWabun.ttf?dl=1" target="_blank" rel="noopener noreferrer">JANCODE-nicWabun</a></p>
</div>
<h3>フォーマットシートで幅・高さ変更</h3>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4407" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_5.jpg" alt="" width="800" height="400" />
<p>バーコードの種類や、印刷するシールによってはずれが出てくることもあり得ます。</p>
<p>なので、フォーマットシートの高さや幅を変更することで反映することができるようにしています。</p>
<p>文字が入るのはB、D、F列なのでここをメインに幅や高さ調整すればOKです。</p>
<h3>バーコード種類・スタートストップコード・フォントサイズ変更</h3>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4411" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_9.jpg" alt="" width="896" height="409" srcset="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_9.jpg 896w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_9-300x137.jpg 300w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_9-768x351.jpg 768w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_9.jpg 856w" sizes="(max-width: 896px) 100vw, 896px" />
<p>上の画像の<span style="color: #ff0000;">赤枠</span>で囲んでいるところで以下を設定できます。</p>
<div class="simple-box2">
<p>バーコード種類<br />
スタート、ストップコード<br />
フォントサイズ</p>
</div>
<p><span style="background-color: #33cccc;">水色</span>のところはバーコードの情報を設定します。</p>
<p>例えば、CODE39のバーコードを使う場合、フォントを変更します。</p>
<p>また、CODE39はスタート、ストップコードが必要なので*を入れておきます。</p>
<p><span style="background-color: #cc99ff;">紫色</span>のところは商品コードが表示されるセルの設定です。</p>
<p>好きなサイズに変更してみて下さい。</p>
<p><span style="background-color: #99cc00;">緑色</span>のところは商品がが表示されるセルの設定です。</p>
<p>商品名が長かったりする場合は、フォントサイズを小さくできます。</p>
<p>&nbsp;</p>
<p>フォントサイズや、揃え位置を変更してみたサンプルです。</p>
<p>JANCODE-nicWabunで商品コードは左寄せ、商品名は右寄せです。</p>
<p><a href="https://loosecarrot.com/wp-content/uploads/2020/09/揃え位置、JANCODE-nicWabun発行サンプル.pdf">揃え位置、JANCODE-nicWabun発行サンプル</a></p>
<a href="https://loosecarrot.com/wp-content/uploads/2020/09/揃え位置、JANCODE-nicWabun発行サンプル.pdf"><img loading="lazy" decoding="async" class="alignnone wp-image-4417 size-full" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_10-1.jpg" alt="" width="1160" height="671" srcset="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_10-1.jpg 1160w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_10-1-300x174.jpg 300w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_10-1-1024x592.jpg 1024w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_10-1-768x444.jpg 768w, https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_10-1.jpg 856w" sizes="(max-width: 1160px) 100vw, 1160px" /></a>
<h4>フォント設定について</h4>
<p>インストールした後に、フォントを選ぶことができます。</p>
<p>F2セルにセットするフォントはこの表示されているフォント名を記入してください。</p>
<p>CODE39であれば、フォント名と同じ「CODE39」と入力してください</p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4414" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_11.jpg" alt="" width="800" height="442" />
<h2>バーコード発行のVBA</h2>
<p>一部だけの抜粋ですが、以下がコードです。</p>
<p>商品コードをセルに出力して、フォントを設定しています。</p><pre class="urvanov-syntax-highlighter-plain-tag">'リストシートの情報を元にバーコードシートに転記
For i = 1 To CreateBarCodeCount
    
    ItemCode = Sheets("リスト").Range("A" &amp; i + 1)
    Amount = Int(Sheets("リスト").Range("B" &amp; i + 1))
    ItemName = Sheets("リスト").Range("C" &amp; i + 1)
    
    
    '数量分ループ
    For j = 1 To Amount
    
        '24枚(1ページ分作った場合)
        If (BarCodeCreatedCount Mod 24 = 0) And BarCodeCreatedCount &lt;&gt; 0 Then
            kijunRow = kijunRow + 5
            LoopCount = 1
            
        '3列書込んだら次の行へいく
        ElseIf LoopCount = 4 Then
            LoopCount = 1
            kijunRow = kijunRow + 4
        End If
        
        'B列
        If LoopCount = 1 Then
            'バーコード
            Sheets("バーコード").Range("B" &amp; kijunRow) = Range("スタートコード") &amp; ItemCode &amp; Range("ストップコード")
            Sheets("バーコード").Range("B" &amp; kijunRow).Font.Name = Range("バーコードフォント")
            Sheets("バーコード").Range("B" &amp; kijunRow).Font.Size = Range("バーコードフォントサイズ")
            Sheets("バーコード").Range("B" &amp; kijunRow).HorizontalAlignment = ConvertHorizontalAlignment(Range("バーコード揃え"))
            '商品コード
            Sheets("バーコード").Range("B" &amp; kijunRow + 1) = ItemCode
            Sheets("バーコード").Range("B" &amp; kijunRow + 1).Font.Size = Range("商品コードフォントサイズ")
            Sheets("バーコード").Range("B" &amp; kijunRow + 1).HorizontalAlignment = ConvertHorizontalAlignment(Range("商品コード揃え"))
            '商品名
            Sheets("バーコード").Range("B" &amp; kijunRow + 2) = ItemName
            Sheets("バーコード").Range("B" &amp; kijunRow + 2).Font.Size = Range("商品名フォントサイズ")
            Sheets("バーコード").Range("B" &amp; kijunRow + 2).HorizontalAlignment = ConvertHorizontalAlignment(Range("商品名揃え"))
            
            BarCodeCreatedCount = BarCodeCreatedCount + 1
        'D列
        ElseIf LoopCount = 2 Then
            'バーコード
            Sheets("バーコード").Range("D" &amp; kijunRow) = Range("スタートコード") &amp; ItemCode &amp; Range("ストップコード")
            Sheets("バーコード").Range("D" &amp; kijunRow).Font.Name = Range("バーコードフォント")
            Sheets("バーコード").Range("D" &amp; kijunRow).Font.Size = Range("バーコードフォントサイズ")
            Sheets("バーコード").Range("D" &amp; kijunRow).HorizontalAlignment = ConvertHorizontalAlignment(Range("バーコード揃え"))
            '商品コード
            Sheets("バーコード").Range("D" &amp; kijunRow + 1) = ItemCode
            Sheets("バーコード").Range("D" &amp; kijunRow + 1).Font.Size = Range("商品コードフォントサイズ")
            Sheets("バーコード").Range("D" &amp; kijunRow + 1).HorizontalAlignment = ConvertHorizontalAlignment(Range("商品コード揃え"))
            '商品名
            Sheets("バーコード").Range("D" &amp; kijunRow + 2) = ItemName
            Sheets("バーコード").Range("D" &amp; kijunRow + 2).Font.Size = Range("商品名フォントサイズ")
            Sheets("バーコード").Range("D" &amp; kijunRow + 2).HorizontalAlignment = ConvertHorizontalAlignment(Range("商品名揃え"))
            
            BarCodeCreatedCount = BarCodeCreatedCount + 1
        'F列
        Else
            'バーコード
            Sheets("バーコード").Range("F" &amp; kijunRow) = Range("スタートコード") &amp; ItemCode &amp; Range("ストップコード")
            Sheets("バーコード").Range("F" &amp; kijunRow).Font.Name = Range("バーコードフォント")
            Sheets("バーコード").Range("F" &amp; kijunRow).Font.Size = Range("バーコードフォントサイズ")
            Sheets("バーコード").Range("F" &amp; kijunRow).HorizontalAlignment = ConvertHorizontalAlignment(Range("バーコード揃え"))
            '商品コード
            Sheets("バーコード").Range("F" &amp; kijunRow + 1) = ItemCode
            Sheets("バーコード").Range("F" &amp; kijunRow + 1).Font.Size = Range("商品コードフォントサイズ")
            Sheets("バーコード").Range("F" &amp; kijunRow + 1).HorizontalAlignment = ConvertHorizontalAlignment(Range("商品コード揃え"))
            '商品名
            Sheets("バーコード").Range("F" &amp; kijunRow + 2) = ItemName
            Sheets("バーコード").Range("F" &amp; kijunRow + 2).Font.Size = Range("商品名フォントサイズ")
            Sheets("バーコード").Range("F" &amp; kijunRow + 2).HorizontalAlignment = ConvertHorizontalAlignment(Range("商品名揃え"))
            
            BarCodeCreatedCount = BarCodeCreatedCount + 1
        End If
        
        LoopCount = LoopCount + 1
    Next j
    
Next i</pre><p>&nbsp;</p>
<p>24面なので、amazonや楽天でシールを一緒に買って使うのもありだと思います。</p>
<div class="kaerebalink-image" style="float: left; margin: 0 15px 10px 0;"><img loading="lazy" decoding="async" class="alignnone wp-image-4403" src="https://loosecarrot.com/wp-content/uploads/2020/09/バーコードラベル生成ツール_3.jpg" alt="" width="290" height="145" /><img loading="lazy" decoding="async" style="border: none;" src="//i.moshimo.com/af/i/impression?a_id=2087701&amp;p_id=1225&amp;pc_id=1925&amp;pl_id=18502" width="1" height="1" /></div>
<div class="kaerebalink-info" style="line-height: 120%; zoom: 1; overflow: hidden;">
<div class="kaerebalink-name" style="margin-bottom: 10px; line-height: 120%;">
<a href="https://www.amazon.co.jp/gp/product/B088M19X1C/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B088M19X1C&amp;linkCode=as2&amp;tag=loosecarrot-22&amp;linkId=fba68d1f0ae11a61a2845c67cd088202" target="_blank" rel="noopener noreferrer">バーコードシール 24面</a><img loading="lazy" decoding="async" style="border: none;" src="//i.moshimo.com/af/i/impression?a_id=2087701&amp;p_id=1225&amp;pc_id=1925&amp;pl_id=18502" width="1" height="1" />
<div class="kaerebalink-powered-date" style="font-size: 8pt; margin-top: 5px; font-family: verdana; line-height: 120%;">posted with <a href="https://kaereba.com" target="_blank" rel="nofollow noopener noreferrer">カエレバ</a></div>
</div>
<div class="kaerebalink-link1" style="margin-top: 10px;">
<div class="shoplinkyahoo" style="display: inline; margin-right: 5px;"><a href="//af.moshimo.com/af/c/click?a_id=2087701&amp;p_id=1225&amp;pc_id=1925&amp;pl_id=18502&amp;url=https%3A%2F%2Fstore.shopping.yahoo.co.jp%2Fsettaroponpon%2F20190711142128-00811.html%3Fsc_i%3Dshp_pc_search_itemlist_shsrg_title" target="_blank" rel="noopener noreferrer">Yahooショッピング</a><img loading="lazy" decoding="async" style="border: none;" src="//i.moshimo.com/af/i/impression?a_id=2087701&amp;p_id=1225&amp;pc_id=1925&amp;pl_id=18502" width="1" height="1" /></div>
<div class="shoplinkamazon" style="display: inline; margin-right: 5px;"><a href="https://www.amazon.co.jp/gp/product/B088M19X1C/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B088M19X1C&amp;linkCode=as2&amp;tag=loosecarrot-22&amp;linkId=fba68d1f0ae11a61a2845c67cd088202" target="_blank" rel="noopener noreferrer">Amazon</a></div>
<div class="shoplinkrakuten" style="display: inline; margin-right: 5px;"><a href="https://rpx.a8.net/svt/ejp?a8mat=2BY7HX+8Y3JTM+2HOM+BW8O1&amp;rakuten=y&amp;a8ejpredirect=http%3A%2F%2Fhb.afl.rakuten.co.jp%2Fhgc%2F0ea62065.34400275.0ea62066.204f04c0%2Fa14100475174_2BY7HX_8Y3JTM_2HOM_BW8O1%3Fpc%3Dhttps%253A%252F%252Fitem.rakuten.co.jp%252Fmannishboy%252F20014844096%252F%26m%3Dhttps%253A%252F%252Fitem.rakuten.co.jp%252Fmannishboy%252F20014844096%252F" target="_blank" rel="noopener noreferrer">楽天市場</a><img loading="lazy" decoding="async" style="border: none;" src="//i.moshimo.com/af/i/impression?a_id=2087701&amp;p_id=54&amp;pc_id=54&amp;pl_id=616" width="1" height="1" /></div>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="concept-box5">
<p><a href="http://nicotan.at-ninja.jp/blog/jancode_font_download.html" target="_blank" rel="noopener noreferrer">JANCODEバーコードのフォントのダウンロード</a></p>
<p><a href="https://mam-mam.net/download/code39.html" target="_blank" rel="noopener noreferrer">https://mam-mam.net/download/code39.html</a></p>
</div>
<p>&nbsp;</p>The post <a href="https://loosecarrot.com/2020/01/10/4337/">VBAでバーコード生成する</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2020/01/10/4337/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4337</post-id>	</item>
		<item>
		<title>Excel VBA メール送信ツール(フリーメール)</title>
		<link>https://loosecarrot.com/2018/12/02/1576/</link>
					<comments>https://loosecarrot.com/2018/12/02/1576/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Sat, 01 Dec 2018 15:01:53 +0000</pubDate>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[Excel]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=1576</guid>

					<description><![CDATA[<p>VBAでメール送信について紹介します。 自動でメール送信するツールを作ってみました。 今回はOutlookではなくフリーメール(YahooJapan)です。 実際に作ったファイルはこちらから無料でダウンロードできます。</p>
The post <a href="https://loosecarrot.com/2018/12/02/1576/">Excel VBA メール送信ツール(フリーメール)</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<p>VBAでメール送信について紹介します。</p>
<p>自動でメール送信するツールを作ってみました。</p>
<p>今回はOutlookではなくフリーメール(YahooJapan)です。</p>
<p>実際に作ったファイルはこちらから<a href="https://www.dropbox.com/scl/fi/a1q8d2v3btc78an1h2vjt/VBA.zip?rlkey=oo32q9xy0napvnnait51rg2bq&amp;dl=1">無料でダウンロード</a>できます。</p>
<p>使い方の説明は<a href="https://www.dropbox.com/scl/fi/jrdileuupdi4begzh2ilh/_.pdf?rlkey=qd4njeoytoro1ypxixspatnlp&amp;dl=1" target="_blank" rel="nofollow noopener noreferrer">こちらからダウンロード</a>可能です。</p>
<h2 id="00">エクセルの名前の定義</h2>
<p>エクセル自体にもセル名の定義をしているので、まずそこから説明しておきます。</p>
<p>意外とエクセルのVBAでは名前の定義を色々使えると良いことが多いです。</p>
<p>仕様と合わせて説明します。</p>
<h3>仕様</h3>
<p>①「送信元アカウント」を選択します。</p>
<p>リストは「アカウント」をもとに選べます。</p>
<p>下の画像で言うと、Gmail、Yahoo、YahooUSAがあるので3つから選べる状態です。</p>
<p>②送信ボタンをクリックすると「送信元アドレス」からとなりのシートを１つずつ読込んでメールを送信していきます。</p>
<a href="https://loosecarrot.com/2018/12/05/1576/%e3%83%a1%e3%82%a4%e3%83%b3%e3%82%b7%e3%83%bc%e3%83%88%e8%aa%ac%e6%98%8e/" rel="attachment wp-att-1609"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1609" src="https://loosecarrot.com/wp-content/uploads/2018/12/2b76d06dad917eb334d450394889253d-1024x472.png" alt="" width="1024" height="472" srcset="https://loosecarrot.com/wp-content/uploads/2018/12/2b76d06dad917eb334d450394889253d-1024x472.png 1024w, https://loosecarrot.com/wp-content/uploads/2018/12/2b76d06dad917eb334d450394889253d-300x138.png 300w, https://loosecarrot.com/wp-content/uploads/2018/12/2b76d06dad917eb334d450394889253d-768x354.png 768w, https://loosecarrot.com/wp-content/uploads/2018/12/2b76d06dad917eb334d450394889253d-1024x472.png 856w" sizes="(max-width: 1024px) 100vw, 1024px" /></a>
<h3>名前の定義</h3>
<p>メインシートの各名前は以下のようなルールで定義づけしています。</p>
<div class="simple-box3">
<p>SMTPServer　　　：[送信元アカウント] + [_smtpserver]<br />
PortNumber　　　：[送信元アカウント] + [_smtpserverport]<br />
送信アカウント名　：[送信元アカウント] + [_sendusername]<br />
パスワード　　　　：[送信元アカウント] + [_sendpassword]<br />
送信元アドレス　　：[送信元アカウント] + [_From]</p>
</div>
<p>「メール送信」ボタンクリック後、後続の処理で「送信元アカウント」と文字連結をして送信を行います。</p>
<p><a href="https://loosecarrot.com/2019/04/05/3353/" target="_blank" rel="noopener noreferrer">https://loosecarrot.com/2019/04/05/3353/</a></p>
<h2 id="01">メール用の参照設定(CDO)</h2>
<h3>参照設定</h3>
<p>ファイル用もフォルダ用もダイアログを開くに参照設定を必要です。</p>
<p>手順はコードエディターから「ツール(T)」→「参照設定(R)」と移動します。</p>
<p>その後、Microsoft CDO for Windows 2000 Libraryにチェックを付けておいてください。</p>
<a href="https://loosecarrot.com/2018/12/05/1576/%e5%8f%82%e7%85%a7%e8%a8%ad%e5%ae%9acdo/" rel="attachment wp-att-1592"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1592" src="https://loosecarrot.com/wp-content/uploads/2018/12/f405bcf82cc3099efa21e862514c74e2.png" alt="" width="455" height="317" /></a>
<p>CDOとはMicrosoft Collaboration Data Objectsのことだそうです。</p>
<blockquote><p>CDO は、メッセージング機能を持つアプリケーションの作成を容易にするために、あるいは、既存のアプリケーションにメッセージング機能を追加するために設計されたものです。<br />
<a href="https://msdn.microsoft.com/ja-jp/library/cc446847.aspx">microsoft.com</a>より</p></blockquote>
<h3>Gmailの送信許可は不可になった</h3>
<p><s>Gmailアカウントを使ってメール送信する場合は「安全性の低いアプリのアクセス」許可しておく必要があります。</s></p>
<p><s>設定は以下にアクセスすることで変更できます。</s></p>
<p><a href="https://myaccount.google.com/lesssecureapps">https://myaccount.google.com/lesssecureapps</a></p>
<p><span style="color: #ff0000;">2022年5月からGmailはユーザとパスワードでログインすることはできなくなりました。</span></p>
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-6618" src="https://loosecarrot.com/wp-content/uploads/2018/12/Excel-VBA-メール送信ツールフリーメール_20230903.jpg" alt="" width="398" height="150" />
<p><strong>YahooJapanアカウントを使ってメール送信する場合は特に設定は必要はないようです。</strong></p>
<h2 id="02">メール送信処理のコード</h2>
<p>処理の流れは以下の順です。</p>
<div class="simple-box3">
<p>①メインシートから送信元情報を取得<br />
②となりのシートから送信メール内容を取得<br />
③添付ファイルをメールオブジェクトに貼り付ける<br />
④メールを送信する<br />
⑤次のシートを同様に処理</p>
</div>
<h3>コード</h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">'==============================
'目的　　　 ：シート分のメールを送信する
'==============================
Sub SendMail_Click()

　　Dim MyDir As String　　　　　　　　　　　　　　　　　　　'自分のファイルが存在するディレクトリ格納用
　　Dim i As Long　　　　　　　　　　　　　　　　　　　　　　'ループ用変数
　　Dim j As Long　　　　　　　　　　　　　　　　　　　　　　'ループ用変数
　　Dim SheetCnt As Long　　　　　　　　　　　　　　　　　　　'シート数を格納する変数
　　Dim SheetName As String　　　　　　　　　　　　　　　　　'シート名を格納する変数

　　Dim ToAddress As String　　　　　　　　　　　　　　　　　'Toアドレス用の変数
　　Dim CcAddress As String　　　　　　　　　　　　　　　　　'Ccアドレス用の変数
　　Dim BccAddress As String　　　　　　　　　　　　　　　　'Bccアドレス用の変数
　　Dim FromAddress As String　　　　　　　　　　　　　　　　'Fromアドレス用の変数
　　Dim cdoMsg As Object　　　　　　　　　　　　　　　　　　'CDOメッセージオブジェクト用変数
　　Dim cdoConf As Object　　　　　　　　　　　　　　　　　'CDOコンフィグレーションオブジェクト用変数
　　Dim strMailBody As String　　　　　　　　　　　　　　　'メール本文用の変数
　　Dim strSubject As String　　　　　　　　　　　　　　　　'件名用の変数
　　Dim strSignature As String　　　　　　　　　　　　　　　'署名用の変数
　　Dim strAttachmentPath As String　　　　　　　　　　　　'添付ファイルの格納用変数
　　Dim strAttachmentsPath() As String　　　　　　　　　　'添付ファイルの格納配列
　　Dim strSendAccount As String　　　　　　　　　　　　　　'送信するアカウント
　　
　　'固定値をセット(長いと見づらいため)
　　Const cstUnderscore As String = "_"　　　　　　　　　 'アンダーバー
　　Const cstSendusing As String = "http://schemas.microsoft.com/cdo/configuration/sendusing"
　　Const cstSmtpserver As String = "http://schemas.microsoft.com/cdo/configuration/smtpserver"
　　Const cstSmtpserverport As String = "http://schemas.microsoft.com/cdo/configuration/smtpserverport"
　　Const cstSendusername As String = "http://schemas.microsoft.com/cdo/configuration/sendusername"
　　Const cstSendpassword As String = "http://schemas.microsoft.com/cdo/configuration/sendpassword"
　　Const cstSmtpauthenticate As String = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"
　　Const cstSmtpusessl As String = "http://schemas.microsoft.com/cdo/configuration/smtpusessl"

　　'エラー時はErrCatchラベルへ
　　On Error GoTo ErrCatch
　　
　　'-------シート枚数分ループ(2枚目のシートから)-------
　　'自分の配置されているパスを取得
　　MyDir = ThisWorkbook.Path
　　
　　'シート件数を取得
　　SheetCnt = ThisWorkbook.Sheets.Count
　　
　　For i = 2 To SheetCnt
　　
　　　　'----------送信元アカウント情報を設定(メインシートから取得)----------
　　　　'CDOをオブジェクト作成
　　　　Set cdoMsg = CreateObject("CDO.Message")
　　　　Set cdoConf = CreateObject("CDO.Configuration")
　　　　
　　　　cdoConf.Load -1
　　　　
　　　　'送信元アカウントを取得
　　　　strSendAccount = Sheets(1).Range("SendAccount").Value
　　　　
　　　　'送信元アカウントが未選択の場合終了
　　　　If strSendAccount = "" Then
　　　　　　MsgBox "送信元アカウントを設定してください。"
　　　　　　End
　　　　End If
　　　　
　　　　'送信元アカウントにアンダーバーをセット
　　　　strSendAccount = strSendAccount + cstUnderscore
　　　　
　　　　With cdoConf.Fields
　　　　　　.Item(cstSendusing) = 2
　　　　　　.Item(cstSmtpserver) = Sheets(1).Range(strSendAccount &amp; "smtpserver").Value
　　　　　　.Item(cstSmtpserverport) = Sheets(1).Range(strSendAccount &amp; "smtpserverport").Value
　　　　　　.Item(cstSendusername) = Sheets(1).Range(strSendAccount &amp; "sendusername").Value
　　　　　　.Item(cstSendpassword) = Sheets(1).Range(strSendAccount &amp; "sendpassword").Value
　　　　　　.Item(cstSmtpauthenticate) = True
　　　　　　.Item(cstSmtpusessl) = True
　　　　　　.Update
　　　　End With
　　　　
　　　　'Fromアドレス取得
　　　　FromAddress = Sheets(1).Range(strSendAccount &amp; "From").Value
　　　　
　　　　'重要度を変更
　　　　cdoMsg.Fields.Item("urn:schemas:mailheader:X-Priority") = 1
　　　　cdoMsg.Fields.Update
　　　　
　　　　'-------各メールフォーマットから取得-------
　　　　'シート名を取得
　　　　SheetName = Sheets(i).Name

　　　　'-------メール情報を取得-------
　　　　'セル内改行(LF)はCRLFに置換 → Yahooでは落ちるため
　　　　ToAddress = Replace(Sheets(i).Range("Mail_TO").Value, vbLf, vbCrLf)　　　　　　'To宛先
　　　　CcAddress = Replace(Sheets(i).Range("Mail_CC").Value, vbLf, vbCrLf)　　　　　　'cc宛先
　　　　BccAddress = Replace(Sheets(i).Range("Mail_BCC").Value, vbLf, vbCrLf)　　　　　'bcc宛先
　　　　strSubject = Replace("【" &amp; SheetName &amp; "様】" &amp; _
　　　　　　　　　　　　　　Sheets(i).Range("Mail_Subject").Value, vbLf, vbCrLf)　　　　'件名
　　　　strMailBody = Replace(Sheets(i).Range("Mail_Body").Value, vbLf, vbCrLf)　　　　'メール本文
　　　　strSignature = Replace(Sheets(i).Range("Mail_Signature").Value, vbLf, vbCrLf)　'署名
　　
　　　　'-------メールに情報をセットする-------
　　　　With cdoMsg
　　　　　　Set .Configuration = cdoConf
　　　　　　.From = FromAddress
　　　　　　.To = ToAddress
　　　　　　.CC = CcAddress
　　　　　　.BCC = BccAddress
　　　　　　.MDNRequested = True
　　　　　　.Subject = strSubject
　　　　　　.TextBody = strMailBody &amp; vbCrLf &amp; vbCrLf &amp; strSignature
　　　　　　.BodyPart.Charset = "utf-8"
　　　　End With
　　　　
　　　　'-------添付ファイルを貼り付ける-------
　　　　'[yyyymmdd_会社名].[拡張子]を検索し、取得する
　　　　strAttachmentsPath() = FileSearch(Format(Now(), "yyyymmdd") &amp; "_" &amp; SheetName &amp; ".*", MyDir &amp; "\添付ファイル\")  '"

        If strAttachmentsPath(0) = "dummy" Then
            '添付ファイルが一件もなければ、次のメール処理へ行く(発注連絡が不要なため)
            GoTo nextDO
        Else
            '添付ファイルが一件でもあれば添付
    
                'ファイル件数分ループして添付する
                For j = 0 To UBound(strAttachmentsPath())
                    'ファイルパスを取得
                    strAttachmentPath = strAttachmentsPath(j)
    
                    'ファイルを添付
                    cdoMsg.AddAttachment strAttachmentPath
                Next j
        End If

　　　　'-------メールを送信する-------
　　　　'メール送信
　　　　cdoMsg.Send

nextDO:
　　　　'-------Outlookを閉じる(オブジェクトを解放)---
　　　　Set cdoMsg = Nothing
　　　　Set cdoConf = Nothing

　　Next i
　　
　　MsgBox "送信が完了しました。"
　　
'エラーキャッチ
ErrCatch:
　　
　　' エラーの場合、エラーメッセージを表示する
　　Call ShowErrMsg
　　
End Sub</pre><p></p>
<h3>メール送信処理の解説</h3>
<h4>送信元アカウント情報を設定(メインシートから取得)</h4>
<p>strSendAccount = Sheets(1).Range(&#8220;SendAccount&#8221;).Value</p>
<p>でメインシートの名前「SendAccount」からアカウント名を取得しています。</p>
<p>その後取得したアカウント名とSMTPServerやPortNumberの名前を文字連結して送信するための情報を取得しています。</p>
<p>送信元アカウントでGmailを選んだなら.Range(strSendAccount &amp; &#8220;smtpserver&#8221;).Valueの中身はRange(&#8220;Gmail_smtpserverport)&#8221;.Value</p>
<p>Yahooを選んだならRange(&#8220;Yahoo_smtpserverport&#8221;).Valueのようになります。</p>
<h4><strong>メール情報を取得</strong></h4>
<p>ここでは改行コードLFをCRLFに置換しています。</p>
<p>なぜかと言うとYahooで送信する場合は、エラーになるためです。</p>
<blockquote><p>改行コードがCRとLFではなく、LFだけの行があるために、エラー<br />
<a href="https://ajya.hatenablog.jp/entry/2012/03/22/223917">メールが送信できるようになった</a>　より</p></blockquote>
<p>改行があっても動いて欲しいものですが、仕様なら仕方ありませんね&#8230;</p>
<h4>メールに情報をセットする</h4>
<p>ここではメールのオブジェクトに件名や宛先などをセットしています。</p>
<h4>添付ファイルを貼り付ける</h4>
<p>FileSearchメソッドを使って、添付ファイルのパスを取得しメールのオブジェクトに張り付ける処理を行っています。</p>
<p>FileSearchは後で説明を記載しています。</p>
<p>その後、添付ファイルがない場合、メールは送らず次のシートを処理するようになっています。</p>
<p>※発注連絡という想定なので、発注書の添付ファイルがなければ連絡はする必要がないから送らないという考え方です。</p>
<h2 id="03">メール添付ファイル取得 FileSearchメソッド</h2>
<p>送信対象のファイル([yyyymmdd_シート名.拡張子]フォーマット)のファイル名を検索し配列に格納する処理です。</p>
<p>検索する場所は「..\VBA Outlookメール送信\添付ファイル」以下のみです。</p>
<p>他の場所に配置したファイルは添付ファイルとして検索されません。</p>
<h3>コード</h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">'==============================
'目的　　　 ：添付ファイルを検索し、ファイルのパスを取得する
'引数　　　 ：SearchText　　　　　　　　　検索するファイル名
'　　　　　　　：SearchPath　　　　　　　　 検索するパス
'戻り値　　　: ファイルパスの配列
'==============================
Private Function FileSearch(SearchText As String, SearchPath As String) As String()

    Dim FileName As String
    Dim Cnt As Long
    Dim Files() As String                         'ファイルパス格納用配列
    
    '中身をダミー値でセット
    ReDim Files(0)
    Files(0) = "dummy"
    
    'ファイルを検索
    FileName = Dir(SearchPath &amp; "\" &amp; SearchText)
    
    Do While FileName &lt;&gt; ""
        
        'ファイル名を返却用配列に格納
        ReDim Preserve Files(Cnt) As String
        Files(Cnt) = SearchPath &amp; FileName
        Cnt = Cnt + 1
        
        ' 次のファイル名を参照
        FileName = Dir()
    Loop

    FileSearch = Files()
　　
End Function</pre><p></p>
<h3>解説</h3>
<p>引数として受け取った検索フォルダ(SearchPath)を検索条件(SearchText)を元に検索します。</p>
<p>見つかったファイルのパスを配列に格納していきます。</p>
<p>検索条件に一致するファイルが見つからなくなったら配列を呼び出し元に返しています。</p>
<h2 id="04">エラー表示 ShowErrMsgメソッド</h2>
<p>エラーをキャッチするメソッドです。</p>
<p>予測できないエラーがあればここでキャッチしてエラーがあったことをメッセージ表示します。</p>
<h3>コード</h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">'==============================
'目的　　　 ：エラーの場合、エラーメッセージを表示する
'==============================
Public Sub ShowErrMsg()

　　'エラーがあればメッセージ表示
　　If Err.Number &lt;&gt; 0 Then
　　　　MsgBox "想定外のエラーが発生しました。" &amp; vbCrLf + _
　　　　　　　　"エラー番号：" + CStr(Err.Number) &amp; vbCrLf + _
　　　　　　　　"エラーの種類：" + Err.Description
　　End If

End Sub</pre><p></p>
<h3>解説</h3>
<p>エラーがあった場合、そのエラー番号とエラー内容をメッセージ表示します。</p>
<h4>送信結果</h4>
<p>送信結果はこんなメールです。</p>
<a href="https://loosecarrot.com/2018/12/05/1576/%e9%80%81%e4%bf%a1%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%83%95%e3%83%aa%e3%83%bc%e3%83%a1%e3%83%bc%e3%83%ab/" rel="attachment wp-att-1612"><img loading="lazy" decoding="async" class="alignnone size-large_size wp-image-1612" src="https://loosecarrot.com/wp-content/uploads/2018/12/d2416ca41f0f1ed0cc7b71487410bcb3-936x720.png" alt="" width="936" height="720" srcset="https://loosecarrot.com/wp-content/uploads/2018/12/d2416ca41f0f1ed0cc7b71487410bcb3-936x720.png 936w, https://loosecarrot.com/wp-content/uploads/2018/12/d2416ca41f0f1ed0cc7b71487410bcb3-936x720.png 856w" sizes="(max-width: 936px) 100vw, 936px" /></a>
<p>https://loosecarrot.com/2022/01/23/5431/</p>
<p>https://loosecarrot.com/2018/12/09/1775/</p>
<div class="concept-box5">
<p>・メールを送信する<br />
<a href="http://officetanaka.net/excel/vba/tips/tips45.htm">http://officetanaka.net/excel/vba/tips/tips45.htm</a><br />
・「 Gmailで相手に一斉に送信するエクセルマクロ」のコメント一覧<br />
<a href="http://bzowner.blog.fc2.com/blog-entry-2.html?sp&amp;m2=res">http://bzowner.blog.fc2.com/blog-entry-2.html?sp&amp;m2=res</a><br />
・CDO.Messageによるメール送信<br />
<a href="http://serialty.blog117.fc2.com/blog-entry-10.html">http://serialty.blog117.fc2.com/blog-entry-10.html</a><br />
・iCloud メールクライアント向けのメールサーバ設定<br />
<a href="https://support.apple.com/ja-jp/HT202304">https://support.apple.com/ja-jp/HT202304</a><br />
・CDOでメール送信<br />
<a href="http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_080.html">http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_080.html</a><br />
・VBAでメール送信する<br />
<a href="https://excel-ubara.com/excelvba4/EXCEL233.html">https://excel-ubara.com/excelvba4/EXCEL233.html</a><br />
・VBAでGmail送信！CDOを活用してメールを操作する方法<br />
<a href="http://www.fastclassinfo.com/entry/vba_gmail_sendmail">http://www.fastclassinfo.com/entry/vba_gmail_sendmail</a><br />
・メールが送信できるようになった<br />
<a href="https://ajya.hatenablog.jp/entry/2012/03/22/223917">https://ajya.hatenablog.jp/entry/2012/03/22/223917</a><br />
・CDO の概要<br />
<a href="https://msdn.microsoft.com/ja-jp/library/cc446847.aspx">https://msdn.microsoft.com/ja-jp/library/cc446847.aspx</a></p>
<p>・【Excel VBA】【マクロ】【Tips】Sgn関数はExcel64bit版では使えない？</p>
<p><a href="https://lenoco.tokyo/?p=136" target="_blank" rel="noopener">https://lenoco.tokyo/?p=136</a></p>
</div>The post <a href="https://loosecarrot.com/2018/12/02/1576/">Excel VBA メール送信ツール(フリーメール)</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2018/12/02/1576/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1576</post-id>	</item>
		<item>
		<title>Excel VBA メール送信ツール(Outlook)</title>
		<link>https://loosecarrot.com/2018/12/01/1551/</link>
					<comments>https://loosecarrot.com/2018/12/01/1551/#respond</comments>
		
		<dc:creator><![CDATA[LooseCarrot]]></dc:creator>
		<pubDate>Fri, 30 Nov 2018 15:01:29 +0000</pubDate>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[Excel]]></category>
		<guid isPermaLink="false">https://loosecarrot.com/?p=1551</guid>

					<description><![CDATA[<p>VBAでOutlookのメール送信について紹介します。 自動でOutlookのメール送信するツールを作ってみました。 実際に作ったファイルはこちらから無料でダウンロードできます。 メール(Outlook)用の参照設定 フ</p>
The post <a href="https://loosecarrot.com/2018/12/01/1551/">Excel VBA メール送信ツール(Outlook)</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></description>
										<content:encoded><![CDATA[<p>VBAでOutlookのメール送信について紹介します。</p>
<p>自動でOutlookのメール送信するツールを作ってみました。</p>
<p>実際に作ったファイルはこちらから<a href="https://www.dropbox.com/scl/fi/3v13lr0vpzxfc96cm9xs1/VBA-Outlook.zip?rlkey=vfxyp5w53ywzadpmlqncso7ri&amp;dl=1">無料でダウンロード</a>できます。</p>
<h2 id="01">メール(Outlook)用の参照設定</h2>
<p>ファイル用もフォルダ用もダイアログを開くに参照設定を必要です。</p>
<p>手順はコードエディターから「ツール(T)」→「参照設定(R)」と移動します。</p>
<p>その後、Microsoft Outlook 16.0 Object Libraryにチェックを付けておいてください。</p>
<p>16.0はバージョンに寄ります。</p>
<a href="https://loosecarrot.com/2018/12/01/1551/%e5%8f%82%e7%85%a7%e8%a8%ad%e5%ae%9a/" rel="attachment wp-att-1564"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1564" src="https://loosecarrot.com/wp-content/uploads/2018/11/afb8b3b96b136d6781fd1a39e0879f17.png" alt="" width="454" height="315" /></a>
<h2 id="02">メール(Outlook)送信処理のコード</h2>
<p>処理の流れは以下の順です。</p>
<div class="simple-box3">
<p>①メール情報(件名、宛先など)を取得<br />
②メールに情報をセットする<br />
③添付ファイルを貼り付ける<br />
④メールを送信する<br />
⑤次のエクセルシートの情報を読取って①から～④を繰り返す</p>
</div>
<h3>コード</h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">'==============================
'目的　　　 ：シート分のメールを送信する
'==============================
Sub SendMail_Click()
　　
　　Dim MyDir As String　　　　　　　　　　　　　　　　　'自分のファイルが存在するディレクトリ格納用
　　Dim i As Long　　　　　　　　　　　　　　　　　　　　　'ループ用変数
　　Dim j As Long　　　　　　　　　　　　　　　　　　　　　'ループ用変数
　　Dim SheetCnt As Long　　　　　　　　　　　　　　　　　'シート数を格納する変数
　　Dim SheetName As String　　　　　　　　　　　　　　　'シート名を格納する変数
　　
　　Dim ToAddress As String　　　　　　　　　　　　　　　'Toアドレス用の変数
　　Dim CcAddress As String　　　　　　　　　　　　　　　'Ccアドレス用の変数
　　Dim BccAddress As String　　　　　　　　　　　　　　'Bccアドレス用の変数
　　Dim Subject As String　　　　　　　　　　　　　　　　'件名用の変数
　　Dim MailBody As String　　　　　　　　　　　　　　　'メール本文用の変数
　　Dim Signature As String　　　　　　　　　　　　　　'署名用の変数
　　Dim OutlookObj As Outlook.Application　　　　　　'Outlookで使用するオブジェクト生成
　　Dim MailItemObj As Outlook.MailItem　　　　　　　'Outlookで使用するオブジェクト生成
　　Dim Attachments As Outlook.Attachments　　　　 'Outlookで使用するオブジェクト生成
　　Dim AttachmentPath As String　　　　　　　　　　　'添付ファイルの格納用変数
　　Dim AttachmentsPath() As String　　　　　　　　　'添付ファイルの格納配列
　　
　　
　　'自分の配置されているパスを取得
　　MyDir = ThisWorkbook.Path
　　
　　'シート件数を取得
　　SheetCnt = ThisWorkbook.Sheets.Count

　　'-------シート枚数分ループ(2枚目のシートから)-------
　　For i = 2 To SheetCnt
　　
　　　　'シート名を取得
　　　　SheetName = Sheets(i).Name

　　　　'-------メール情報を取得-------
　　　　ToAddress = Sheets(i).Range("Mail_TO").Value　　　　　　　　　'To宛先
　　　　CcAddress = Sheets(i).Range("Mail_CC").Value　　　　　　　　　'cc宛先
　　　　BccAddress = Sheets(i).Range("Mail_BCC").Value　　　　　　　　'bcc宛先
　　　　Subject = "【" &amp; SheetName &amp; "様】" &amp; _
　　　　　　　　　　　　Sheets(i).Range("Mail_Subject").Value　　　　　'件名
　　　　MailBody = Sheets(i).Range("Mail_Body").Value　　　　　　　　'メール本文
　　　　Signature = Sheets(i).Range("Mail_Signature").Value　　　　 '署名
　　
　　　　'-------メールに情報をセットする-------
　　　　Set OutlookObj = CreateObject("Outlook.Application")
　　　　Set MailItemObj = OutlookObj.CreateItem(olMailItem)
　　　　MailItemObj.BodyFormat = 2　　　　　　　　　　　　　　　　　　　　　　　'HTML形式に変更
　　　　MailItemObj.To = ToAddress　　　　　　　　　　　　　　　　　　　　　　　'to宛先をセット
　　　　MailItemObj.CC = CcAddress　　　　　　　　　　　　　　　　　　　　　　　'cc宛先をセット
　　　　MailItemObj.BCC = BccAddress　　　　　　　　　　　　　　　　　　　　　　'bcc宛先をセット
　　　　MailItemObj.Subject = Subject　　　　　　　　　　　　　　　　　　　　　 '件名をセット
　　　　MailItemObj.Body = MailBody &amp; vbCrLf &amp; vbCrLf &amp; Signature　　　 '本文+署名
　　　　
　　　　'-------添付ファイルを貼り付ける-------'
　　　　'オブジェクト生成
　　　　Set Attachments = MailItemObj.Attachments
　　　　
　　　　'[yyyymmdd_会社名].[拡張子]を検索し、取得する'
　　　　AttachmentsPath() = FileSearch(Format(Now(), "yyyymmdd") &amp; "_" &amp; SheetName &amp; ".*", MyDir &amp; "\添付ファイル\")　'"
　　　　

        If AttachmentsPath(0) = "dummy" Then
            '添付ファイルが一件もなければ、次のメール処理へ行く(発注連絡が不要なため)
            GoTo nextDO
        Else
            '添付ファイルが一件でもあれば添付
    
                'ファイル件数分ループして添付する
                For j = 0 To UBound(AttachmentsPath())
                    'ファイルパスを取得
                    AttachmentPath = AttachmentsPath(j)
    
                    'ファイルを添付
                    Attachments.Add AttachmentPath
    
                Next j
    
        End If
　　
　　　　'-------メールを送信する-------
　　　　MailItemObj.Send
　　
　　　　'-------Outlookを閉じる(オブジェクトを解放)---
　　　　Set OutlookObj = Nothing
　　　　Set MailItemObj = Nothing
　　　　
nextDO:
　　Next i
　　
　　MsgBox "送信が完了しました。"
　　
End Sub</pre><p></p>
<h3>解説</h3>
<h4><strong>メール情報を取得</strong></h4>
<p>重要なポイントは名前の定義をしていることです。</p>
<p>宛先Toであれば「Mail_TO」のようにすべてのシートに設定がしてあります。</p>
<p>各シートに全て同じ名前を付けることで同じ処理をシートごとに繰り返せるようにしています。</p>
<p>そして各シートの値は変数に格納していく処理になっています。</p>
<p>※シートをコピーして増やしても名前の定義は引き継がれるため処理に問題はありません。</p>
<h4>メールに情報をセットする</h4>
<p>Outlookのオブジェクトを生成していま。</p>
<p>その後、それぞれToや本文の情報をOutlookのオブジェクトにセットしていっています。</p>
<h4>添付ファイルを貼り付ける</h4>
<p>まず添付ファイルのオブジェクト生成しています。</p>
<p>FileSearchメソッドを使って、添付ファイルのパスを取得しメールのオブジェクトに張り付ける処理を行っています。</p>
<p>FileSearchは後で説明を記載しています。</p>
<p>その後、添付ファイルがない場合、メールは送らず次のシートを処理するようになっています。</p>
<p>※発注連絡という想定なので、発注書の添付ファイルがなければ連絡はする必要がないから送らないという考え方です。</p>
<h4>メールを送信する・Outlookを閉じる</h4>
<p>最後にメールを送信します。</p>
<p>その後、作成したオブジェクトは破棄して次のメール作成・送信処理へ行きます。</p>
<h2 id="03">メール添付ファイル取得 FileSearchメソッド</h2>
<p>送信対象のファイル([yyyymmdd_シート名.拡張子]フォーマット)のファイル名を検索し配列に格納する処理です。</p>
<p>検索する場所は「..\VBA Outlookメール送信\添付ファイル」以下のみです。</p>
<p>他の場所に配置したファイルは添付ファイルとして検索されません。</p>
<h3>コード</h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">'==============================
'目的　　　 ：添付ファイルを検索し、ファイルのパスを取得する
'引数　　　 ：SearchText　　　　　　　　　検索するファイル名
'　　　　　　：SearchPath　　　　　　　　 検索するパス
'戻り値　　　: ファイルパスの配列
'==============================
Private Function FileSearch(SearchText As String, SearchPath As String) As String()
    Dim FileName As String
    Dim Cnt As Long
    Dim Files() As String                         'ファイルパス格納用配列
    
    '中身をダミー値でセット
    ReDim Files(0)
    Files(0) = "dummy"
    
    'ファイルを検索
    FileName = Dir(SearchPath &amp; "\" &amp; SearchText)
    
    Do While FileName &lt;&gt; ""
        
        'ファイル名を返却用配列に格納
        ReDim Preserve Files(Cnt) As String
        Files(Cnt) = SearchPath &amp; FileName
        Cnt = Cnt + 1
        
        ' 次のファイル名を参照
        FileName = Dir()
    Loop

　　FileSearch = Files()
　　
End Function</pre><p></p>
<h3>解説</h3>
<p>引数として受け取った検索フォルダ(SearchPath)を検索条件(SearchText)を元に検索します。</p>
<p>見つかったファイルのパスを配列に格納していきます。</p>
<p>検索条件に一致するファイルが見つからなくなったら配列を呼び出し元に返しています。</p>
<h4>送信結果</h4>
<p>送信結果はこんなメールです。</p>
<a href="https://loosecarrot.com/2018/12/01/1551/%e9%80%81%e4%bf%a1%e3%83%a1%e3%83%bc%e3%83%ab%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab/" rel="attachment wp-att-1566"><img loading="lazy" decoding="async" class="alignnone size-large_size wp-image-1566" src="https://loosecarrot.com/wp-content/uploads/2018/12/a1919b8b188643a640d643e5b2617865-630x720.png" alt="" width="630" height="720" /></a>
<p>メール送信と言いつつガチガチに業務を想定したツールになってしまっています&#8230;</p>
<p>使えそうなところをアレンジしていってみてください。</p>
<p>https://loosecarrot.com/2019/02/11/3167/</p>
<p>https://loosecarrot.com/2018/12/09/1775/</p>
<p>https://loosecarrot.com/2019/01/28/3054/</p>
<div class="concept-box5">
<p>・【エクセルVBA】Outlookでメールを作成・送信する方法<br />
<a href="https://tonari-it.com/excel-vba-outlook-mail-send/">https://tonari-it.com/excel-vba-outlook-mail-send/</a><br />
・VBAでメールを自動送信！エクセルマクロでoutlook操作する方法<br />
<a href="http://www.fastclassinfo.com/entry/vba_outlook_sendmail">http://www.fastclassinfo.com/entry/vba_outlook_sendmail</a><br />
・シートを指定してRangeを取得する<br />
<a href="https://www.relief.jp/docs/excel-vba-get-range-specific-sheet.html">https://www.relief.jp/docs/excel-vba-get-range-specific-sheet.html</a><br />
・PDF発注書テンプレート<br />
<a href="https://pdf.wondershare.jp/templates/purchase-order-template.html">https://pdf.wondershare.jp/templates/purchase-order-template.html</a><br />
・FileSystemObjectオブジェクト &#8211; FileExistsメソッド<br />
<a href="http://officetanaka.net/excel/vba/filesystemobject/filesystemobject10.htm">http://officetanaka.net/excel/vba/filesystemobject/filesystemobject10.htm</a><br />
・ファイルの一覧を取得する<br />
<a href="http://officetanaka.net/excel/vba/file/file07.htm">http://officetanaka.net/excel/vba/file/file07.htm</a></p>
</div>
<p>&nbsp;</p>
<p><a href="https://loosecarrot.com/2018/12/02/1576/">https://loosecarrot.com/2018/12/02/1576/</a></p>The post <a href="https://loosecarrot.com/2018/12/01/1551/">Excel VBA メール送信ツール(Outlook)</a> first appeared on <a href="https://loosecarrot.com">文系出身のSEですが、何か</a>.]]></content:encoded>
					
					<wfw:commentRss>https://loosecarrot.com/2018/12/01/1551/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1551</post-id>	</item>
	</channel>
</rss>
