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

<channel>
	<title>Excel操作 | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<atom:link href="https://officevba.info/category/accessvba/excel%e6%93%8d%e4%bd%9c-accessvba/feed/" rel="self" type="application/rss+xml" />
	<link>https://officevba.info</link>
	<description>仕事の役に立つVBA・GAS・Pythonのコードを紹介していきます。</description>
	<lastBuildDate>Tue, 17 Dec 2019 14:56:19 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>

<image>
	<url>https://officevba.info/wp-content/uploads/2017/04/cropped-Excel_1-32x32.jpg</url>
	<title>Excel操作 | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<link>https://officevba.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>AccessVBAでExcelを操作する2つの方法と使い分けについて</title>
		<link>https://officevba.info/accessvba-exceloperation2/</link>
					<comments>https://officevba.info/accessvba-exceloperation2/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Tue, 17 Dec 2019 14:56:19 +0000</pubDate>
				<category><![CDATA[Excel操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1882</guid>

					<description><![CDATA[目次 AccessVBAでExcelを操作すると遅くなる復習：Excelを操作するAccessVBAについてAccessVBAでExcelを操作するのは時間がかかる AccessVBAでExcelを操作すると遅くなる 以 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">AccessVBAでExcelを操作すると遅くなる</a></li><li><a href="#toc2" tabindex="0">復習：Excelを操作するAccessVBAについて</a></li><li><a href="#toc3" tabindex="0">AccessVBAでExcelを操作するのは時間がかかる</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">AccessVBAでExcelを操作すると遅くなる</span></h2>
<p>以前<a href="https://officevba.info/accessvba-exceloperation/" target="_blank">こちら</a>の記事でAccessVBAでExcelを操作する方法をご紹介しました。</p>
<p>実際にこの方法を用いてAccessのデータベースから出力したテーブル・クエリ結果などをExcelを用いて加工していたのですが、少し複雑な処理をしたところスピードが大きく下がり、日常的に支障が出ることがありました。</p>
<p>その際AccessVBAでExcelを操作する別の方法を用いて解決できたので備忘録も兼ねてこちらのページで手順を紹介します。</p>
<h2><span id="toc2">復習：Excelを操作するAccessVBAについて</span></h2>
<p>AccessVBAでExcelを操作する場合、下記のようなコードを書きます。</p>
<p>実行するにあたっては参照設定で「Microsoft Eccel 〇〇 Object Library」にチェックを入れるのを忘れないようにしてください。</p>
<p>参照設定の方法は<a href="https://officevba.info/preparation-excelvba-outlook/" target="_blank">こちら</a>のページで紹介しています。</p>
<p>ExcelVBAでOutlookを操作するための参照設定の手順を書いていますが、AccessVBAでExcelを操作する場合もチェックするLibraryが異なるだけで手順自体は同じです。</p>
<div class="VBACode">Sub Excel操作1()<br />
<br />
<span class="VBA_Tab1">Dim 開始時間</span><br />
<span class="VBA_Tab1">Dim 終了時間</span><br />
<br />
<span class="VBA_Tab1">開始時間 = Time</span><br />
<br />
<span class="VBA_Tab1">Dim ExApp As Object</span><br />
<span class="VBA_Tab2">Set ExApp = CreateObject(&#8220;Excel.Application&#8221;)</span><br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab2">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">Dim i</span><br />
<br />
<span class="VBA_Tab1">ExApp.Visible = True</span><br />
<span class="VBA_Tab1">ExApp.Workbooks.Open FileName:=Application.CurrentProject.Path &#038; &#8220;&#8221; &#038; &#8220;Excel検証用.xlsx&#8221;, readOnly:=True</span><br />
<br />
<span class="VBA_Tab1">With ExApp</span><br />
<br />
<span class="VBA_Tab2">.Workbooks(.Workbooks.Count).Activate</span><br />
<span class="VBA_Tab2">.Workbooks(.Workbooks.Count).Sheets(1).Select</span><br />
<span class="VBA_Tab2">.Cells(1, 1) = 1</span><br />
<br />
<span class="VBA_Tab2"><span class="VBA_Comment0">’繰り返しの実行</span></span><br />
<span class="VBA_Tab2">For i = 2 To <span class="red">1000</span></span><br />
<span class="VBA_Tab3">If .Cells(i － 1, 1) = 1 Then</span><br />
<span class="VBA_Tab4">.Cells(i, 1) = 2</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">.Cells(i, 1) = 1</span><br />
<span class="VBA_Tab3">End If</span><br />
<span class="VBA_Tab2">Next i</span><br />
<br />
<span class="VBA_Tab1">End With</span><br />
<br />
<span class="VBA_Tab1">Set ExApp = Nothing</span><br />
<span class="VBA_Tab1">終了時間 = Time</span><br />
<span class="VBA_Tab1">Debug.Print Format(終了時間 － 開始時間, &#8220;hh:mm:ss&#8221;)</span><br />
<br />
End Sub</div>
<p>これはAccessのファイルと同じフォルダに格納されているExcel検証用.xlsxというExcelファイルを開いて、シート1のA列の1行目から1,000行目に「1」「2」を交互に入力するコードになります。</p>
<p>実際AccessでExcelを操作する際はExportしたテーブルやクエリを操作することが多いですが、今回は検証として単純にExcelファイルを開いて操作するだけにしています。</p>
<h2><span id="toc3">AccessVBAでExcelを操作するのは時間がかかる</span></h2>
<p>先ほど復習としてご紹介したExcel操作ですが、1,000回くらいの比較的短い繰り返しだと問題なく実行され、Excel単体で処理するのとさほど体感的に変わらない時間で処理が終了しますが、繰り返しが多くなったり条件分岐が増えてくると徐々に遅くなってしまいます。</p>
<p>10,000行まで同じ処理を繰り返すようにした場合、20秒くらいかかるようになりました。<br />
もちろんExcel単体で実行した場合1～3秒くらいの時間しかかかりません。</p>
<p>AccessでExcelワークシート上に何か書き込むのに時間がかかることがわかったので、改善方法としてExcelのVBAを格納したファイルを用意して、それをAccessVBAで実行する方法を考えました。</p>
<p>少しだけ仕事で付き合いのあるSEの方はこういう方法のことを「ExcelVBAをキックする」と言っていました。<br />
開始処理を加えることをそう呼んだりするようです。</p>
<div class="VBACode">Sub Excelマクロ実行1()<br />
<br />
<span class="VBA_Tab1">Dim 開始時間</span><br />
<span class="VBA_Tab1">Dim 終了時間</span><br />
<br />
<span class="VBA_Tab1">開始時間 = Time</span><br />
<br />
<span class="VBA_Tab1">Dim ExApp As Object</span><br />
<span class="VBA_Tab2">Set ExApp = CreateObject(&#8220;Excel.Application&#8221;)</span><br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab2">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<br />
<span class="VBA_Tab1">ExApp.Visible = True</span><br />
<span class="VBA_Tab1">ExApp.Workbooks.Open FileName:=Application.CurrentProject.Path &#038; &#8220;&#8221; &#038; &#8220;Excel検証用マクロファイル.xlsm&#8221;, readOnly:=True</span><br />
<span class="VBA_Tab1">ExApp.Workbooks.Open FileName:=Application.CurrentProject.Path &#038; &#8220;&#8221; &#038; &#8220;Excel検証用.xlsx&#8221;, readOnly:=True</span><br />
<br />
<span class="VBA_Tab1">With ExApp</span><br />
<br />
<span class="VBA_Tab2">.Workbooks(.Workbooks.Count).Activate</span><br />
<span class="VBA_Tab2">.Workbooks(.Workbooks.Count).Sheets(1).Select</span><br />
<span class="VBA_Tab2">.Run &#8220;Excel検証用マクロファイル.xlsm!検証用マクロ1&#8221;</span><br />
<br />
<span class="VBA_Tab1">End With</span><br />
<br />
<span class="VBA_Tab1">ExApp.Workbooks(1).Close</span><br />
<span class="VBA_Tab1">Set ExApp = Nothing</span><br />
<br />
<span class="VBA_Tab1">終了時間 = Time</span><br />
<span class="VBA_Tab1">Debug.Print Format(終了時間 － 開始時間, &#8220;hh:mm:ss&#8221;)</span><br />
<br />
End Sub</div>
<p>AccessVBAで起動するExcel検証用マクロファイル.xlsmの検証用マクロ1は下記のようなコードになっています。</p>
<div class="VBACode">Sub 検証用マクロ1()<br />
<br />
<span class="VBA_Tab2">Cells(1, 1) = 1</span><br />
<span class="VBA_Tab2"><span class="VBA_Comment0">’繰り返しの回数</span></span><br />
<span class="VBA_Tab2">For i = 2 To <span class="red">1000</span></span><br />
<span class="VBA_Tab3">If Cells(i － 1, 1) = 1 Then</span><br />
<span class="VBA_Tab4">Cells(i, 1) = 2</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">Cells(i, 1) = 1</span><br />
<span class="VBA_Tab3">End If</span><br />
<span class="VBA_Tab2">Next i</span><br />
<br />
End Sub</div>
<p>この処理だとExcel操作自体はExcelVBAで実行するので処理時間がかなり短縮されます。<br />
10行、100行、1,000行、10,000行、100,000行繰り返す際にかかる時間を検証した結果は下記の表のとおりです。</p>
<table border=1>
<tr>
<td align=center>繰り返し回数</td>
<td align=center>10</td>
<td align=center>100</td>
<td align=center>1000</td>
<td align=center>10000</td>
<td align=center>100000</td>
</tr>
<tr>
<td align=center>直接Excel操作</td>
<td align=center>1秒</td>
<td align=center>2秒</td>
<td align=center>3秒</td>
<td align=center>17秒</td>
<td align=center>2分39秒</td>
</tr>
<tr>
<td align=center>ExcelVBA実行</td>
<td align=center>2秒</td>
<td align=center>3秒</td>
<td align=center>3秒</td>
<td align=center>3秒</td>
<td align=center>5秒</td>
</tr>
</table>
<p>ExcelVBAでワークシートを操作する方がかなり早く処理が進むことがわかりました。</p>
<p>シートに値を格納するだけなら配列に入れた値を一気に入力するなどの方法で解決できるかもしれませんが、列を追加して項目を増やしたり、罫線を入れたり、背景色を変えたり、フォーマットを変更するなどの処理を条件分岐・繰り返しを使いながらワークシートの操作を行う場合、ExcelVBAを使った方がよさそうです。</p>
<p>今後AccessVBAのみでExcel操作をするのは簡単なもののみにしようと思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/accessvba-exceloperation2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
