<?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>AccessVBA | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<atom:link href="https://officevba.info/category/accessvba/feed/" rel="self" type="application/rss+xml" />
	<link>https://officevba.info</link>
	<description>仕事の役に立つVBA・GAS・Pythonのコードを紹介していきます。</description>
	<lastBuildDate>Sat, 14 Aug 2021 07:40:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://officevba.info/wp-content/uploads/2017/04/cropped-Excel_1-32x32.jpg</url>
	<title>AccessVBA | 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>
		<item>
		<title>AccessでApplication.GetOpenFileNameのようなダイアログを表示してファイルを選択する方法</title>
		<link>https://officevba.info/filedialog/</link>
					<comments>https://officevba.info/filedialog/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sat, 28 Sep 2019 09:09:58 +0000</pubDate>
				<category><![CDATA[ファイル・フォルダ操作]]></category>
		<category><![CDATA[フォルダ・ファイル操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1844</guid>

					<description><![CDATA[目次 GetOpenFileNameはExcelだけの機能AccessでExcelを操作する応用でApplication.GetOpenFileNameメソッドを使用するApplication.FileDialogオブジ [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">GetOpenFileNameはExcelだけの機能</a></li><li><a href="#toc2" tabindex="0">AccessでExcelを操作する応用でApplication.GetOpenFileNameメソッドを使用する</a></li><li><a href="#toc3" tabindex="0">Application.FileDialogオブジェクト</a></li><li><a href="#toc4" tabindex="0">Application.FileDialogオブジェクトのサンプルコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">GetOpenFileNameはExcelだけの機能</span></h2>
<p>以前からExcelVBAでファイルをダイアログで選択して開く方法として「Application.GetOpenFileName」メソッドを使用していましたが、このメソッドはExcelしか使えなくて、AccessなどでExcelファイルを開くときに使うには非常に面倒で不便なことに気づきました。</p>
<p>今回はAccessでApplication.GetOpenFileNameを使う方法と、より便利な代替方法をご紹介します。</p>
<h2><span id="toc2">AccessでExcelを操作する応用でApplication.GetOpenFileNameメソッドを使用する</span></h2>
<p>ExcelVBAでしか使えないメソッドなので、Excelを操作する際のように下記コードを記入すれば使えるようになります。</p>
<div class="VBACode">
<span class="VBA_Tab1">Dim ExApp As Object</span><br />
<span class="VBA_Tab2">Set ExApp = CreateObject(&#8220;Excel.Application&#8221;)</span>
</div>
<p>正しい説明なのかどうかわかりませんが、変数「ExApp」にExcelオブジェクト格納し、そこからプロパティ・メソッドを呼び出す手順だと思います。<br />
コードの全体は下記のような感じになります。</p>
<div class="VBACode">Sub ExcelでGetOpenFileName()<br />
<span class="VBA_Tab1"></span><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"></span><br />
<span class="VBA_Tab1">ExApp.Visible = True</span><br />
<br />
<span class="VBA_Tab1">Dim ExBook As Variant <span class="VBA_Comment">’宣言はString型かVariant型を使う その後の分岐の条件が変わる</span></span><br />
<span class="VBA_Tab1">ExBook = ExApp.Application.GetOpenFileName(&#8220;Microsoft Excelブック,*.xls?&#8221;)</span><br />
<br />
<span class="VBA_Tab1">If ExBook <> False Then</span><br />
<span class="VBA_Tab2">ExApp.Workbooks.Open ExBook</span><br />
<span class="VBA_Tab1">Else</span><br />
<span class="VBA_Tab2">MsgBox &#8220;中止します&#8221;</span><br />
<span class="VBA_Tab2">Exit Sub</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">Set ExBook = Nothing</span><br />
<span class="VBA_Tab1">Set ExApp = Nothing</span><br />
<br />
End Sub</div>
<p>VBAで他のアプリケーションを使う際によく使う手法ですが、Application.GetOpenFileNameの場合、初期表示するフォルダを選択できない致命的な問題が生じます。</p>
<p>通常Application.GetOpenFileNameはカレントフォルダを最初に開く設定になっているので、ChDriveとChDirを使うことで最初に表示するフォルダを指定することができます。</p>
<p>しかし、Accessや他のアプリケーションでExcelを起動してApplication.GetOpenFileNameを使用してもExcel上のカレントフォルダを変更することができないようです。</p>
<p>私の使用しているPCの環境ではOneDriveのドキュメントフォルダが初期表示される設定を変えることができませんでした。</p>
<p>Excel以外のAccessやOutlook、WordのVBAの際は下記のApplication.FileDialogを使用する方が使いやすい環境を作ることができます。</p>
<h2><span id="toc3">Application.FileDialogオブジェクト</span></h2>
<p>Application.GetOpenFileNameはExcelの環境に依存してしまうためAccessなど他のアプリケーションでは上記の通り使いにくく、操作性に問題が生じてしまいます。</p>
<p>Accessで使いやすい形でファイル選択ダイアログを開くにはApplication.FileDialogオブジェクトを使用する方が便利だと思います。<br />
このApplication.FileDialogメソッドはApplication.GetOpenFileNameと異なり、下記の点が優れています。</p>
<li>①ExcelだけでなくAccessやOutlookなど、どのVBAでも使用できる</li>
<li>②初期フォルダの設定が可能</li>
<li>③ファイルの指定だけでなく、フォルダの指定も可能</li>
<li>④ファイルの指定時、複数ファイルを指定してそれぞれを取得できる</li>
<li>⑤ファイルの選択ではフィルター表示を複数設定できる</li>
<p>逆にデメリットとしては下記の通りです。</p>
<li>①設定項目・プロパティが多いのでコードが複雑になりやすい</li>
<li>②参照設定「Microsoft Office 〇〇 Object Library」をする必要がある（Verの違いでエラーになることがあるので注意）</li>
<h2><span id="toc4">Application.FileDialogオブジェクトのサンプルコード</span></h2>
<div class="VBACode">Sub フォルダを選択してパスを取得するコード()<br />
<br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab2">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab2">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<br />
<span class="VBA_Tab1">With Application.FileDialog(msoFileDialogFolderPicker)</span><br />
<span class="VBA_Tab2">.InitialFileName = DesktopPath &#038; &#8220;￥&#8221; <span class="VBA_Comment">’初期フォルダをデスクトップに 最後の「\」は必要なのか不明</span></span><br />
<span class="VBA_Tab2">.AllowMultiSelect = False <span class="VBA_Comment">’複数選択をしない（フォルダはできない）</span></span><br />
<span class="VBA_Tab2">.Title = &#8220;フォルダの選択&#8221; <span class="VBA_Comment">’ダイアログのタイトル</span></span><br />
<span class="VBA_Tab2">If .Show = True Then</span><br />
<span class="VBA_Tab3">MsgBox &#8220;選択フォルダは&#8221; &#038; vbLf &#038; .SelectedItems(1)</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab1">End With</span><br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />
<br />
End Sub</div>
<div class="VBACode">Sub ファイルを選択してパスを取得するコード()<br />
<br />
<span class="VBA_Tab1">Dim i</span><br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab2">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab2">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<br />
<span class="VBA_Tab1">With Application.FileDialog(msoFileDialogFilePicker) <span class="VBA_Comment">’Excel以外は.Executeで開かないのでmsoFileDialogOpenは使わない</span></span><br />
<span class="VBA_Tab2">.InitialFileName = DesktopPath &#038; &#8220;￥&#8221;    <span class="VBA_Comment">’初期フォルダをデスクトップに 最後の「\」は必要なのか不明</span></span><br />
<span class="VBA_Tab2">.AllowMultiSelect = True <span class="VBA_Comment">’複数選択をする</span></span><br />
<span class="VBA_Tab2">.Title = &#8220;ファイルの選択&#8221; <span class="VBA_Comment">’ダイアログのタイトル</span></span><br />
<span class="VBA_Tab2">If .Show = True Then</span><br />
<span class="VBA_Tab3">For i = 1 To .SelectedItems.Count <span class="VBA_Comment">’選択したファイルのファイル名をすべて取得する</span></span><br />
<span class="VBA_Tab4">MsgBox &#8220;選択ファイルは&#8221; &#038; vbLf &#038; .SelectedItems(i)</span><br />
<span class="VBA_Tab3">Next i</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab1">End With</span><br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />
<br />
End Sub</div>
<p>初期フォルダをデスクトップにするためにWSHを使用してデスクトップを指定しています。<br />
私の環境では.InitialFileNameでフォルダパスの最後に「\」を付けないとうまく動作しませんでした。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/filedialog/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Accessで現在のデータベースのPathを取得する</title>
		<link>https://officevba.info/accessfilepath/</link>
					<comments>https://officevba.info/accessfilepath/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sat, 27 Jul 2019 14:13:00 +0000</pubDate>
				<category><![CDATA[パス取得]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1752</guid>

					<description><![CDATA[目次 現在のファイルの指定方法現在のデータベースのPath・ファイル名を参照するAccessVBAコード①Application.CurrentProject.Path②Application.CurrentProjec [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">現在のファイルの指定方法</a></li><li><a href="#toc2" tabindex="0">現在のデータベースのPath・ファイル名を参照するAccessVBAコード</a><ol><li><a href="#toc3" tabindex="0">①Application.CurrentProject.Path</a></li><li><a href="#toc4" tabindex="0">②Application.CurrentProject.Name</a></li><li><a href="#toc5" tabindex="0">③Application.CurrentProject.FullName</a></li></ol></li><li><a href="#toc6" tabindex="0">CurrentProject.Pathを使ったVBAサンプルコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">現在のファイルの指定方法</span></h2>
<p>今回ご紹介するコードはすごく簡単なのですが、Accessでの現在のファイルのPathを指定するコードです。</p>
<p>ExcelVBAでは「ThisWorkbook.Path」で覚えているのですが、Accessのファイルを指定する方法については今まで何度か忘れて→調べて思い出すを繰り返していたので、備忘録として残しておきます。</p>
<h2><span id="toc2">現在のデータベースのPath・ファイル名を参照するAccessVBAコード</span></h2>
<p>現在のデータベースのパス・ファイル名を参照するには主に下記の3つのコードを用います。</p>
<h3><span id="toc3">①Application.CurrentProject.Path</span></h3>
<p>現在のデータベースファイルが格納されているフォルダを参照します。</p>
<h3><span id="toc4">②Application.CurrentProject.Name</span></h3>
<p>現在のデータベースファイルのファイル名を参照します。</p>
<h3><span id="toc5">③Application.CurrentProject.FullName</span></h3>
<p>現在のデータベースファイルのフルパスを参照します。<br />
①+②（厳密には①+&#8221;\&#8221;+②）を一度に参照します。</p>
<h2><span id="toc6">CurrentProject.Pathを使ったVBAサンプルコード</span></h2>
<p>私がよく使うのはデータベースファイルと同じフォルダにある別のファイルを開いたり参考にする時によく使います。</p>
<p>下記のサンプルはエクスプローラーでデータベースファイルが格納されているフォルダを開くコードになります。</p>
<div class="VBACode">Sub エクスプローラーでフォルダを開く()<br />
<span class="VBA_Tab1">Shell &#8220;C:WindowsExplorer.exe &#8221; &#038; Application.CurrentProject.Path, vbNormalFocus</span><br />
End Sub</div>
<p>データベースから参考にしたいファイルが多いときに便利です。<br />
またExcelファイル操作する場合などでは下記のように同じフォルダにあるExcelファイルを指定したりします。</p>
<p>このコードを実行するには「ツール」→「参照設定」の「Microsoft Excel 〇〇 Object Library」を有効にしておく必要があります。<br />
手順がわからない方は<a href="https://officevba.info/preparation-excelvba-outlook/" target="_blank">こちら</a>を参考にしてください。<br />
ExcelVBAでOutlook Object Libraryの参照方法を記していますが、基本的には同じ操作でMicrosoft Excel 〇〇 Object LibraryをAccessVBAで有効にすればOKです。</p>
<div class="VBACode">Sub Excel操作()<br />
<span class="VBA_Tab1"></span><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">ExApp.Visible = True</span><br />
<br />
<span class="VBA_Tab1">Dim ExBook As Object</span><br />
<span class="VBA_Tab2">Set ExBook = ExApp.Workbooks.Open(Application.CurrentProject.Path &#038; &#8220;&#8221; &#038; &#8220;エクセルファイル.xlsx&#8221;)</span><br />
<br />
<span class="VBA_Tab2"><span class="VBA_Comment">’処理を記入する</span></span><br />
<br />
<span class="VBA_Tab1">Set ExBook = Nothing</span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’ExApp.Quit ’処理を加えて閉じるところまで実行するなら「’」を外す</span></span><br />
<span class="VBA_Tab1">Set ExApp = Nothing</span><br />
<br />
End Sub</div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/accessfilepath/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>条件に一致するレコードの件数を調べるAccessVBA</title>
		<link>https://officevba.info/dcount-rsrecordcount/</link>
					<comments>https://officevba.info/dcount-rsrecordcount/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 09 Dec 2018 14:23:24 +0000</pubDate>
				<category><![CDATA[ADO]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1590</guid>

					<description><![CDATA[目次 Accessでのシステムを構築する際にレコードの件数を取得する方法を調べました今回作成したフォームとテーブル・レコードの説明レコードの件数を取得する2通りの方法について関数を使用する方法ADOを使用する方法 Acc [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Accessでのシステムを構築する際にレコードの件数を取得する方法を調べました</a></li><li><a href="#toc2" tabindex="0">今回作成したフォームとテーブル・レコードの説明</a></li><li><a href="#toc3" tabindex="0">レコードの件数を取得する2通りの方法について</a></li><li><a href="#toc4" tabindex="0">関数を使用する方法</a></li><li><a href="#toc5" tabindex="0">ADOを使用する方法</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">Accessでのシステムを構築する際にレコードの件数を取得する方法を調べました</span></h2>
<p>最近仕事でAccessを使用して価格POP（店で価格を表示している紙）を作るシステムを作成しました。</p>
<p>複数のサイズで印刷できるように条件を設定し、レポートで出力する仕組みで作成していたのですが、不要なレポートを開かないようにするために、条件に合うレコードの件数を取得する方法を調べました。</p>
<p>今回はAccessVBAで対象レコードの件数を取得する方法を紹介します。</p>
<h2><span id="toc2">今回作成したフォームとテーブル・レコードの説明</span></h2>
<p>今回作成したシステムのメインのフォームとテーブルは下記のようになっています。</p>
<p><a href="https://officevba.info/wp-content/uploads/2018/12/17cc2414bb8b89a5a8d9f615a484477f.jpg"><img fetchpriority="high" decoding="async" src="https://officevba.info/wp-content/uploads/2018/12/17cc2414bb8b89a5a8d9f615a484477f-300x169.jpg" alt="118-1フォーム" width="300" height="169" class="alignnone size-medium wp-image-1585" srcset="https://officevba.info/wp-content/uploads/2018/12/17cc2414bb8b89a5a8d9f615a484477f-300x169.jpg 300w, https://officevba.info/wp-content/uploads/2018/12/17cc2414bb8b89a5a8d9f615a484477f-768x432.jpg 768w, https://officevba.info/wp-content/uploads/2018/12/17cc2414bb8b89a5a8d9f615a484477f-700x394.jpg 700w, https://officevba.info/wp-content/uploads/2018/12/17cc2414bb8b89a5a8d9f615a484477f-320x180.jpg 320w, https://officevba.info/wp-content/uploads/2018/12/17cc2414bb8b89a5a8d9f615a484477f.jpg 1405w" sizes="(max-width: 300px) 100vw, 300px" /></a> <a href="https://officevba.info/wp-content/uploads/2018/12/057abe4976456ed2cd3872e32db08c99.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2018/12/057abe4976456ed2cd3872e32db08c99-300x43.jpg" alt="118-2テーブル" width="300" height="43" class="alignnone size-medium wp-image-1586" srcset="https://officevba.info/wp-content/uploads/2018/12/057abe4976456ed2cd3872e32db08c99-300x43.jpg 300w, https://officevba.info/wp-content/uploads/2018/12/057abe4976456ed2cd3872e32db08c99-768x111.jpg 768w, https://officevba.info/wp-content/uploads/2018/12/057abe4976456ed2cd3872e32db08c99-700x101.jpg 700w, https://officevba.info/wp-content/uploads/2018/12/057abe4976456ed2cd3872e32db08c99-320x46.jpg 320w, https://officevba.info/wp-content/uploads/2018/12/057abe4976456ed2cd3872e32db08c99.jpg 1973w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>必要な商品のJANコードを読み込ませると商品マスタテーブルから商品名や規格・価格を取得する仕組みです。<br />
印刷したいサイズのチェックボックスにチェックをつけることで印刷ボタンをクリックした際に表示させることができる仕様です。</p>
<p>3パターンあるPOPをレポートで印刷するのですが、件数が1件もない場合レポートを表示させないようにするためレコードの件数を取得する必要がありました。</p>
<p>よく「レポート 件数 取得 Access」などでGoogle検索して出てくる方法で、レポート自体のコントロールに件数を表示させる方法もあったのですが、VBAで表示する前のレポートの表示後の件数を取得することができなかったのでその方法は使えませんでした。</p>
<p>今回紹介する方法はテーブルのデータを読み取ってレポートを表示する条件のレコードを取得する方法で、レポートの表示・非表示にかかわらず件数を取得できます。</p>
<h2><span id="toc3">レコードの件数を取得する2通りの方法について</span></h2>
<p>レコードの件数を取得する方法は関数を用いる方法とADOを使用する方法があります。</p>
<p>関数を使用する方法はピンポイントで件数だけを取得するのに手軽で便利な方法です。</p>
<p>逆にADOは参照設定や宣言が必要なので少しコードが複雑になりますが、件数の取得だけでなくレコードの検索・追加や全フィールドの値を取得したりなど、幅広い処理が可能です。</p>
<h2><span id="toc4">関数を使用する方法</span></h2>
<p>DCount関数を使用し、「DCount(&#8220;*&#8221;, &#8220;テーブル名&#8221;, &#8220;取得するレコードの条件&#8221;)」の記載方法で件数を取得します。</p>
<p>MsgboxやDebug.Printなどで出力すれば件数が表示できます。</p>
<p>DCount関数の最初の引数はフィールド名を記載するのが本来の使い方のようですが、「*」が使用できるので「*」を用いた方が汎用性があって便利です。</p>
<div class="VBACode">Private Sub 印刷_Click()<br />
<br />
<span class="VBA_Tab1">Me.Requery</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’[印刷する_2031]=にチェックがついているレコードがあればレポートをプレビュー表示する</span></span><br />
<span class="VBA_Tab1">If DCount(&#8220;*&#8221;, &#8220;T_POP&#8221;, &#8220;[印刷する_2031]=TRUE&#8221;) <> 0 Then</span><br />
<span class="VBA_Tab2">DoCmd.OpenReport &#8220;R_POP書式20×31&#8221;, acViewPreview, &#8220;&#8221;, &#8220;[印刷する_2031]=TRUE&#8221;, acWindowNormal</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’[印刷する_4031]=にチェックがついているレコードがあればレポートをプレビュー表示する</span></span><br />
<span class="VBA_Tab1">If DCount(&#8220;*&#8221;, &#8220;T_POP&#8221;, &#8220;[印刷する_4031]=TRUE&#8221;) <> 0 Then</span><br />
<span class="VBA_Tab2">DoCmd.OpenReport &#8220;R_POP書式40×31&#8221;, acViewPreview, &#8220;&#8221;, &#8220;[印刷する_4031]=TRUE&#8221;, acWindowNormal</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’[印刷する_4063]=にチェックがついているレコードがあればレポートをプレビュー表示する</span></span><br />
<span class="VBA_Tab1">If DCount(&#8220;*&#8221;, &#8220;T_POP&#8221;, &#8220;[印刷する_4063]=TRUE&#8221;) <> 0 Then</span><br />
<span class="VBA_Tab2">DoCmd.OpenReport &#8220;R_POP書式40×63&#8221;, acViewPreview, &#8220;&#8221;, &#8220;[印刷する_4063]=TRUE&#8221;, acWindowNormal</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
End Sub</div>
<h2><span id="toc5">ADOを使用する方法</span></h2>
<p>ADOを使用して、対象とするテーブルや選択クエリの件数を取得することができます。</p>
<p>ADOを使用する際はMicrosoft ActiveX Data Objects 〇〇 Libraryにチェックを入れる必要があります。</p>
<p>テーブルの中から特定の条件のレコード件数を取得するためには条件をSQLで指定します。</p>
<div class="VBACode">Private Sub 印刷_Click()<br />
<br />
<span class="VBA_Tab1">Me.Requery</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’Microsoft ActiveX Data Objects 〇〇 Libraryの参照設定にチェックを入れる</span></span><br />
<span class="VBA_Tab1">Dim RS(2) As ADODB.Recordset</span><br />
<span class="VBA_Tab2">Set RS(0) = New ADODB.Recordset</span><br />
<span class="VBA_Tab2">Set RS(1) = New ADODB.Recordset</span><br />
<span class="VBA_Tab2">Set RS(2) = New ADODB.Recordset</span><br />
<span class="VBA_Tab1">Dim CN As ADODB.Connection</span><br />
<span class="VBA_Tab2">Set CN = CurrentProject.Connection</span><br />
<br />
<span class="VBA_Tab1">Dim SQL(2) As String</span><br />
<span class="VBA_Tab2">SQL(0) = &#8220;SELECT [T_POP].* FROM [T_POP] WHERE ([T_POP].[印刷する_2031])=True;&#8221;</span><br />
<span class="VBA_Tab2">SQL(1) = &#8220;SELECT [T_POP].* FROM [T_POP] WHERE ([T_POP].[印刷する_4031])=True;&#8221;</span><br />
<span class="VBA_Tab2">SQL(2) = &#8220;SELECT [T_POP].* FROM [T_POP] WHERE ([T_POP].[印刷する_4063])=True;&#8221;</span><br />
<br />
<span class="VBA_Tab1">RS(0).Open SQL(0), CN, adOpenKeyset, adLockOptimistic</span><br />
<span class="VBA_Tab1">RS(1).Open SQL(1), CN, adOpenKeyset, adLockOptimistic</span><br />
<span class="VBA_Tab1">RS(2).Open SQL(2), CN, adOpenKeyset, adLockOptimistic</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’RS(0)のレコード件数が0でなければレポートを開いてプレビューを表示する</span></span><br />
<span class="VBA_Tab1">If RS(0).RecordCount <> 0 Then</span><br />
<span class="VBA_Tab2">DoCmd.OpenReport &#8220;R_POP書式20×31&#8221;, acViewPreview, &#8220;&#8221;, &#8220;[印刷する_2031]=TRUE&#8221;, acWindowNormal</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’RS(1)のレコード件数が0でなければレポートを開いてプレビューを表示する</span></span><br />
<span class="VBA_Tab1">If RS(1).RecordCount <> 0 Then</span><br />
<span class="VBA_Tab2">DoCmd.OpenReport &#8220;R_POP書式40×31&#8221;, acViewPreview, &#8220;&#8221;, &#8220;[印刷する_4031]=TRUE&#8221;, acWindowNormal</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’RS(2)のレコード件数が0でなければレポートを開いてプレビューを表示する</span></span><br />
<span class="VBA_Tab1">If RS(2).RecordCount <> 0 Then</span><br />
<span class="VBA_Tab2">DoCmd.OpenReport &#8220;R_POP書式40×63&#8221;, acViewPreview, &#8220;&#8221;, &#8220;[印刷する_4063]=TRUE&#8221;, acWindowNormal</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1">RS(0).Close</span><br />
<span class="VBA_Tab1">RS(1).Close</span><br />
<span class="VBA_Tab1">RS(2).Close</span><br />
<span class="VBA_Tab1"></span><br />
<span class="VBA_Tab1">Set CN = Nothing</span><br />
<span class="VBA_Tab1">Set RS(0) = Nothing</span><br />
<span class="VBA_Tab1">Set RS(1) = Nothing</span><br />
<span class="VBA_Tab1">Set RS(2) = Nothing</span><br />
<br />
End Sub</div>
<p>ADOはテーブルやクエリの情報をすべて取得できるので関数で指定するよりもコードが長くなりますが、レコードを1件ずつ全て取得したり、細かく条件を設定して変換したり、レコードを新たに追加したり様々なことができるのでとても便利です。</p>
<p>イメージとしてはテーブルをExcelVBAでワークシートを操作するような感じで編集することが可能になる感じです。</p>
<p>ADOの使ってテーブルを追加したり編集したりする手順についてはまた別の機会にご紹介します。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/dcount-rsrecordcount/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AccessVBAで変数を活用したクエリ（SQL）の作成</title>
		<link>https://officevba.info/variable_query/</link>
					<comments>https://officevba.info/variable_query/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Tue, 08 May 2018 05:03:02 +0000</pubDate>
				<category><![CDATA[Accessクエリの管理・操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1417</guid>

					<description><![CDATA[目次 変数を活用するとVBAでのクエリ（SQL）実行でより自由度の高くなるSQL文の文字列を変数で置き換える変数に置き換える手順①変数に置き換えたい文字の部分を「&#038;」と「&#8221;」を用いて切り離す②切り離 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">変数を活用するとVBAでのクエリ（SQL）実行でより自由度の高くなる</a></li><li><a href="#toc2" tabindex="0">SQL文の文字列を変数で置き換える</a></li><li><a href="#toc3" tabindex="0">変数に置き換える手順</a><ol><li><a href="#toc4" tabindex="0">①変数に置き換えたい文字の部分を「&#038;」と「&#8221;」を用いて切り離す</a></li><li><a href="#toc5" tabindex="0">②切り離された「&#8221;1&#8243;」の部分を変数に置き換える</a></li><li><a href="#toc6" tabindex="0">予備知識：「&#8221;&#8221;」は「&#8217;」で置き換えるとわかりやすい</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">変数を活用するとVBAでのクエリ（SQL）実行でより自由度の高くなる</span></h2>
<p>以前に<a href="https://officevba.info/docmdrunsql/" target="_blank">AccessVBAでクエリ（SQL）を実行するコード</a>を紹介しましたが、VBAでのSQLの実行は変数を用いるとより自由度の高い複雑な処理が可能になります。</p>
<p>今回はAccessVBAでクエリ（SQL）を実行する際に変数を用いる方法を紹介します。</p>
<h2><span id="toc2">SQL文の文字列を変数で置き換える</span></h2>
<p>クエリを構成するSQL構文は文字列なので、その中の一部を置き換えることでVBAの変数を使用することができます。</p>
<p>例として前回紹介したAccessVBAコードに下記のようなクエリ（SQL）を実行するコードを用います。<br />
こちらのAccessVBAコードは「仕入伝票一覧」というテーブルの中に格納されているデータのうち、「店番」フィールドの値が「1」のものを削除するクエリを実行します。</p>
<div class="VBACode">Sub Accessで削除クエリ実行()<br />
<br />
<span class="VBA_Tab1">Dim StrSQL As String</span><br />
<br />
<span class="VBA_Tab1">StrSQL = &#8220;DELETE [仕入伝票一覧].[店番] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;FROM [仕入伝票一覧] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;1&#8243;&#8221;;&#8221;</span><br />
<br />
<span class="VBA_Tab1">DoCmd.SetWarnings False <span class="VBA_Comment">’アラートを出なくする</span></span><br />
<span class="VBA_Tab1">DoCmd.RunSQL (StrSQL)</span><br />
<span class="VBA_Tab1">DoCmd.SetWarnings True <span class="VBA_Comment">’アラートを出るように戻す</span></span><br />
<br />
End Sub</div>
<p>この条件式で変数を使用したい場合、下記のように変更します。</p>
<div class="VBACode">Sub 変数を使用したSQL文の作成()<br />
<br />
<span class="VBA_Tab1">Dim StrSQL As String</span><br />
<span class="VBA_Tab1">Dim joken As String</span><br />
<span class="VBA_Tab1">joken = &#8220;1&#8221;</span><br />
<br />
<span class="VBA_Tab1">StrSQL = &#8220;DELETE [仕入伝票一覧].[店番] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;FROM [仕入伝票一覧] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;&#8221; &#038; joken &#038; &#8220;&#8221;&#8221;;&#8221;</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’DoCmd.SetWarnings False <span class="VBA_Comment">’アラートを出なくする</span></span><br />
<span class="VBA_Tab1">DoCmd.RunSQL (StrSQL)</span><br />
<span class="VBA_Tab1"><span class="VBA_Comment">’DoCmd.SetWarnings True <span class="VBA_Comment">’アラートを出るように戻す</span></span><br />
<br />
End Sub</div>
<h2><span id="toc3">変数に置き換える手順</span></h2>
<p>元々の文字列を表す「&#8221;」と文字列の中の「&#8221;」を表す「&#8221;&#8221;」が混在しているので理解しにくいですが、下記のような記載の順序を覚えておくとエラーが起こさずに変数に置き換えることができます。</p>
<h3><span id="toc4">①変数に置き換えたい文字の部分を「&#038;」と「&#8221;」を用いて切り離す</span></h3>
<p>文字列をつなぎ合わせた状態にするイメージで切り離す文字の前後に「&#8221; &#038; &#8220;」を挿入します</p>
<div class="VBACode">&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;1&#8243;&#8221;;&#8221;<br />
↓<br />
&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;<span class="red">&#8221; &#038; &#8220;</span>1<span class="red">&#8221; &#038; &#8220;</span>&#8220;&#8221;;&#8221;</div>
<h3><span id="toc5">②切り離された「&#8221;1&#8243;」の部分を変数に置き換える</span></h3>
<p>「&#8221;1&#8243;」を変数「joken」に置き換えます。</p>
<div class="VBACode">&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;&#8221; &#038; <span class="red">&#8220;1&#8221;</span> &#038; &#8220;&#8221;&#8221;;&#8221;<br />
↓<br />
&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;&#8221; &#038; <span class="red">joken</span> &#038; &#8220;&#8221;&#8221;;&#8221;</div>
<h3><span id="toc6">予備知識：「&#8221;&#8221;」は「&#8217;」で置き換えるとわかりやすい</span></h3>
<p>文字列中のダブルコーテーションを表す2連続の「&#8221;&#8221;」は数が多くなってややこしければシングルコーテーション「&#8217;」で代用することも可能です。</p>
<div class="VBACode">&#8220;WHERE [仕入伝票一覧].[店番]=<span class="red">&#8220;&#8221;</span>&#8221; &#038; joken &#038; &#8220;<span class="red">&#8220;&#8221;</span>;&#8221;<br />
↓<br />
&#8220;WHERE [仕入伝票一覧].[店番]=<span class="red">&#8216;</span>&#8221; &#038; joken &#038; &#8220;<span class="red">&#8216;</span>;&#8221; </div>
<p>このような形で変数を使えるとFor~Nextなどでjokenの値を変えながら、複数条件で削除クエリを実行させることも可能です。</p>
<p>下記は「店番」フィールドが1～100までのレコードを削除するAccessVBAコードです。<br />
この場合、変数jokenを数値型で宣言しておいて、後でFormat関数を用いて文字列型に変更する方がより正しいコードになります。<br />
（数値型のままでもVBAが自動的に変換してくれるので動きますが念のため。）</p>
<div class="VBACode">Sub 削除クエリを色々な条件式で実行する()<br />
<br />
<span class="VBA_Tab1">Dim StrSQL As String</span><br />
<span class="VBA_Tab1">Dim joken As Long</span><br />
<br />
<span class="VBA_Tab1">DoCmd.SetWarnings False <span class="VBA_Comment">’アラートを出なくする</span></span><br />
<span class="VBA_Tab1">For joken = 1 To 100</span><br />
<span class="VBA_Tab2">StrSQL = &#8220;DELETE [仕入伝票一覧].[店番] &#8221; &#038; _</span><br />
<span class="VBA_Tab4">&#8220;FROM [仕入伝票一覧] &#8221; &#038; _</span><br />
<span class="VBA_Tab4">&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;&#8221; &#038; Format(joken, &#8220;0&#8221;) &#038; &#8220;&#8221;&#8221;;&#8221;</span><br />
<br />
<span class="VBA_Tab2">DoCmd.RunSQL (StrSQL)</span><br />
<span class="VBA_Tab1">Next joken</span><br />
<span class="VBA_Tab1">DoCmd.SetWarnings True <span class="VBA_Comment">’アラートを出るように戻す</span></span><br />
<br />
End Sub</div>
<p>もちろん今回のjokenの値を変更しながら繰り返し削除するだけならクエリだけの機能でも可能ですが、今回のように条件が100個あるような場合、一回で済ませるクエリを作るのは条件式が長くなり面倒です。</p>
<p>その点VBAで変数を使えば繰り返しを実行するだけで済むのでかなり楽になります。</p>
<p>注意点はきちんとアラートを非表示にしてから実行しないと繰り返しの数だけ確認画面が表示されることで、失敗するとずっとEnterキーを押し続ける羽目になります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/variable_query/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AccessVBAでクエリ（SQL）を実行する</title>
		<link>https://officevba.info/docmdrunsql/</link>
					<comments>https://officevba.info/docmdrunsql/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 29 Apr 2018 15:11:56 +0000</pubDate>
				<category><![CDATA[Accessクエリの管理・操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1401</guid>

					<description><![CDATA[目次 AccessVBAで更新クエリ・削除クエリなどを連続して実行できるAccessVBAでクエリを修正するコードはすべてのクエリで共通更新・削除クエリを実行するAccessVBAのコードアラートを消すコードを付けてデー [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">AccessVBAで更新クエリ・削除クエリなどを連続して実行できる</a></li><li><a href="#toc2" tabindex="0">AccessVBAでクエリを修正するコードはすべてのクエリで共通</a></li><li><a href="#toc3" tabindex="0">更新・削除クエリを実行するAccessVBAのコード</a></li><li><a href="#toc4" tabindex="0">アラートを消すコードを付けてデータを消したり、更新する際にアラートが出ないようにする</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">AccessVBAで更新クエリ・削除クエリなどを連続して実行できる</span></h2>
<p>選択クエリ・集計クエリなどレコードを変更しないクエリに関してはAccessVBAで修正するメリットは少ないですが、更新クエリ・削除クエリなどに関しては「実行する」ステップがあるため、AccessVBAを使用することでより柔軟な処理が可能になります。</p>
<p>特にある順序で連続してクエリを実行したり、パラメータを少し変更したクエリを複数回実行するなどの処理においてAccessVBAは非常に有用です。<br />
今回はAccessVBAでクエリを実行するコードを紹介します。</p>
<h2><span id="toc2">AccessVBAでクエリを修正するコードはすべてのクエリで共通</span></h2>
<p>クエリを修正するAccessVBAコードは前回紹介したようにどんなクエリでも同じように使用可能です。<br />
更新クエリ・削除クエリなどを実行する場合はさらにそこから「実行する」コードを追加することになります。</p>
<h2><span id="toc3">更新・削除クエリを実行するAccessVBAのコード</span></h2>
<p>クエリを実行するコードは以下のようになります。</p>
<div class="VBACode">DoCmd.RunSQL (“実行するクエリのSQL”) </div>
<p>クエリをデータベース上に保存していて、そのSQLを呼び出す場合は次のように記載します。<br />
こちらはデータベース上の「Q_お試し」というクエリを実行するAccessVBAコードになります。</p>
<div class="VBACode">Sub クエリ実行()<br />
<br />
<span class="VBA_Tab1">Dim StrSQL As String</span><br />
<span class="VBA_Tab1">StrSQL = CurrentDb.QueryDefs(&#8220;Q_お試し&#8221;).SQL</span><br />
<span class="VBA_Tab1">DoCmd.RunSQL (StrSQL)</span><br />
<br />
End Sub</div>
<p>変数StrSQLにクエリ「Q_お試し」のSQLを代入し、実行する流れになります。</p>
<p>SQLを一から作成する場合は以下のように記載します。</p>
<div class="VBACode">Sub クエリ実行2()<br />
<br />
<span class="VBA_Tab1">Dim StrSQL As String</span><br />
<span class="VBA_Tab1">StrSQL = &#8220;DELETE [仕入伝票一覧].[店番] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;FROM [仕入伝票一覧] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;1&#8243;&#8221;;&#8221;</span><br />
<br />
<span class="VBA_Tab1">DoCmd.RunSQL (StrSQL)</span><br />
<br />
End Sub</div>
<p>クエリの修正の際と同じくStrSQLに直接SQLを記載します。<br />
改行の際は前後のどちらかに半角スペースをつけるのを忘れないようにしましょう。</p>
<h2><span id="toc4">アラートを消すコードを付けてデータを消したり、更新する際にアラートが出ないようにする</span></h2>
<p>削除クエリや更新クエリを実行すると「〇〇件のレコードが指定したテーブルから削除されます」や「〇〇件のレコードが更新されます」などのアラートが表示されます。</p>
<p>このアラートが出るとVBAが中断されるため、連続で色々な処理を実行する際は以下のコードを追加し、アラートを表示させないようにしておく必要があります。</p>
<div class="VBACode">DoCmd.SetWarnings False</div>
<p>ExcelVBAでいうところのApplication.DisplayAlertsと同じ処理ですが、Excelよりも扱いに気を付けないといけないのは「解除を忘れるとそのVBAの実行中だけでなく、ファイルを閉じるまでずっとアラートが出てこなくなる」ことです。</p>
<p>下記のようにクエリの実行後に「DoCmd.SetWarnings True」と必ず記載して、アラートが出るように戻しましょう。</p>
<div class="VBACode">Sub アラートを表示させないようにクエリ実行()<br />
<br />
<span class="VBA_Tab1">Dim StrSQL As String</span><br />
<span class="VBA_Tab1">StrSQL = &#8220;DELETE [仕入伝票一覧].[店番] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;FROM [仕入伝票一覧] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;1&#8243;&#8221;;&#8221;</span><br />
<br />
<span class="VBA_Tab1">DoCmd.SetWarnings False <span class="VBA_Comment">’アラートを出なくする</span></span><br />
<span class="VBA_Tab1">DoCmd.RunSQL (StrSQL)</span><br />
<span class="VBA_Tab1">DoCmd.SetWarnings True <span class="VBA_Comment">’アラートを出るように戻す</span></span><br />
<br />
End Sub</div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/docmdrunsql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AccessVBAでクエリ（SQL）を修正する</title>
		<link>https://officevba.info/accessvba_correction_query/</link>
					<comments>https://officevba.info/accessvba_correction_query/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Thu, 26 Apr 2018 14:35:09 +0000</pubDate>
				<category><![CDATA[Accessクエリの管理・操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1390</guid>

					<description><![CDATA[目次 SQLの文字列をVBAで修正するクエリは大きく2つに分けられるAccessVBAでクエリを修正する意味AccessVBAでクエリを修正するコードAccessVBAでクエリを修正する際の注意点①複数行の場合、改行前も [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">SQLの文字列をVBAで修正する</a></li><li><a href="#toc2" tabindex="0">クエリは大きく2つに分けられる</a></li><li><a href="#toc3" tabindex="0">AccessVBAでクエリを修正する意味</a></li><li><a href="#toc4" tabindex="0">AccessVBAでクエリを修正するコード</a></li><li><a href="#toc5" tabindex="0">AccessVBAでクエリを修正する際の注意点</a><ol><li><a href="#toc6" tabindex="0">①複数行の場合、改行前もしくは改行後に半角のスペースが必要</a></li><li><a href="#toc7" tabindex="0">②SQLの中で「&#8221;」を使う場合「&#8221;&#8221;」のように二重にするもしくは「&#8217;」を使用する</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">SQLの文字列をVBAで修正する</span></h2>
<p><a href="https://officevba.info/accessvba_create_delete_query/" target="_blank">前回AccessVBAでクエリを作成・実行する</a>でクエリを作成したり、削除したりするAccessVBAコードを紹介しましたが、AccessVBAではその他にも作成したクエリを修正することも可能です。<br />
今回はクエリを修正するVBAコードを紹介します。</p>
<h2><span id="toc2">クエリは大きく2つに分けられる</span></h2>
<p>選択クエリ・集計クエリ・更新クエリ・削除クエリなど、クエリの種類はたくさんありますが、AccessVBAでクエリの修正を行うにあたっては、これらのクエリが大きく2つに分類されることを把握しておかなければなりません。</p>
<p>その分類は「実行することでデータベースに格納されているデータを変更するかどうか」ということです。</p>
<p>選択クエリ・集計クエリなどは今のデータの中で必要なレコードを抜き出したり、または集計したりするクエリなので、これらは「実行する」というステップがありません。</p>
<p>クエリを設計し、開くと値が表示されますが、データベースのレコードに影響はないからです。</p>
<p>それに対し、更新クエリ・削除クエリなどはデータベースのレコードを変更するもので、これらのクエリは設計後、実行することで機能するものになります。</p>
<h2><span id="toc3">AccessVBAでクエリを修正する意味</span></h2>
<p>個人的な意見かもしれませんが、選択クエリ・集計クエリなどは、AccessVBAで修正する必要がない場合がほとんどです。</p>
<p>強いていうなら色々な人がデータベースを扱う中で勝手にクエリを変更されたり、壊されたりしないように修正するコードは作れますが、そこまで意味がないと思います。<br />
（そもそもクエリを編集できないようにしておけば問題にならないため。）</p>
<p>AccessVBAでクエリを修正することに価値を見出しやすいのは更新クエリ・削除クエリなど、実行することで初めて機能するクエリです。</p>
<p>これらのクエリについてはAccessVBAを用いることで、条件を変更したクエリを複数連続で実行するなどの機能が使えるようになるため、より柔軟な処理が可能になります。</p>
<p>クエリを実行するコードについてはこちらのページで紹介しています。</p>
<h2><span id="toc4">AccessVBAでクエリを修正するコード</span></h2>
<p>AccessVBAでクエリを修正するコードは以下のようなものになります。</p>
<div class="VBACode">Sub クエリを修正する()<br />
<br />
<span class="VBA_Tab1">Dim StrSQL As String</span><br />
<span class="VBA_Tab1">StrSQL = &#8220;SELECT ID,店番,取引先コード,日付 FROM 仕入伝票一覧;&#8221;</span><br />
<span class="VBA_Tab1">CurrentDb.QueryDefs(&#8220;Q_お試し&#8221;).SQL = StrSQL</span><br />
<br />
End Sub</div>
<p>今回のサンプルコードは既存のクエリをAccessVBAで指定したSQLに置き換えるコードとなります。<br />
下記のように削除クエリに修正することも可能で、もともとのクエリの種類にかかわらず、置き換えることができます。</p>
<div class="VBACode">Sub クエリを修正する()<br />
<br />
<span class="VBA_Tab1">Dim StrSQL As String</span><br />
<br />
<span class="VBA_Tab1">StrSQL = &#8220;DELETE [仕入伝票一覧].[店番] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;FROM [仕入伝票一覧] &#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8220;WHERE [仕入伝票一覧].[店番]=&#8221;&#8221;01&#8243;&#8221;;&#8221;</span><br />
<br />
<span class="VBA_Tab1">CurrentDb.QueryDefs(&#8220;Q_お試し&#8221;).SQL = StrSQL</span><br />
<br />
End Sub</div>
<p>こちらは仕入伝票一覧というテーブルから、店番の値が「01」（文字列）のレコードを削除するというコードです。<br />
コードを記載するにあたっては下記を参考にしてください。</p>
<h2><span id="toc5">AccessVBAでクエリを修正する際の注意点</span></h2>
<p>AccessVBAでSQLを記載する場合、下記の点に注意が必要です。</p>
<h3><span id="toc6">①複数行の場合、改行前もしくは改行後に半角のスペースが必要</span></h3>
<p>SQLは単語と単語の間には半角スペースが入ります。<br />
改行は単語と単語の間になりますので、どちらかに半角のスペースがないとクエリがきちんと作成できません。</p>
<h3><span id="toc7">②SQLの中で「&#8221;」を使う場合「&#8221;&#8221;」のように二重にするもしくは「&#8217;」を使用する</span></h3>
<p>SQLを文字列で表すので、すでに開始位置、終了位置にダブルコーテーション「&#8221;」が入っています。</p>
<p>SQLの中でさらに「&#8221;」を使用する場合は、二重にするかシングルコーテーション「&#8217;」を使用してください。<br />
Where条件式などでよく使われます。</p>
<p>条件式が数字を表す場合はダブルコーテーション「&#8221;」やシングルコーテーション「&#8217;」は不要ですので、こちらも逆に注意が必要です。</p>
<p>条件式を変数で置き換えることで自由度が高い処理が可能になります。<br />
その手順についてはAccessVBAでクエリを実行するで紹介します。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/accessvba_correction_query/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AccessVBAでクエリ（SQL）を作成・削除する</title>
		<link>https://officevba.info/accessvba_create_delete_query/</link>
					<comments>https://officevba.info/accessvba_create_delete_query/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Tue, 24 Apr 2018 15:00:17 +0000</pubDate>
				<category><![CDATA[Accessクエリの管理・操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1381</guid>

					<description><![CDATA[目次 AccessVBAでクエリを作成・削除できるとクエリ一覧がすっきりするAccessVBAでクエリを作成AccessVBAでクエリを削除 AccessVBAでクエリを作成・削除できるとクエリ一覧がすっきりする 少し複 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">AccessVBAでクエリを作成・削除できるとクエリ一覧がすっきりする</a></li><li><a href="#toc2" tabindex="0">AccessVBAでクエリを作成</a></li><li><a href="#toc3" tabindex="0">AccessVBAでクエリを削除</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">AccessVBAでクエリを作成・削除できるとクエリ一覧がすっきりする</span></h2>
<p>少し複雑なデータベースを作成し、クエリを作りっぱなしにしていると、ちょっとした条件違いのクエリが大量にできあがり、管理が面倒になってしまいます。</p>
<p>AccessVBAでクエリをすべて操作できるようになると、自動で使用するクエリを作成し、不要になれば削除できるので管理がしやすくなります。<br />
今回はAccessVBAでできるクエリの操作のうち、クエリを作成・削除するVBAコードを紹介します。</p>
<h2><span id="toc2">AccessVBAでクエリを作成</span></h2>
<p>AccessVBAでクエリを作成するサンプルコードは以下のような形式になります。<br />
このサンプルコードでは「T_仕入一覧」というテーブルのID、店番、取引先コードを抜き出す「Q_お試し」という選択クエリを作成するコードです。</p>
<div class="VBACode">Sub クエリ作成()<br />
<br />
<span class="VBA_Tab1">Dim Qdf As Object</span><br />
<span class="VBA_Tab1">Dim SQL As String</span><br />
<span class="VBA_Tab1">SQL = &#8220;SELECT ID,店番,取引先コード FROM T_仕入一覧&#8221;</span><br />
<br />
<span class="VBA_Tab1">Set Qdf = CurrentDb.CreateQueryDef(&#8220;Q_お試し&#8221;, SQL)</span><br />
<span class="VBA_Tab1">Set Qdf = Nothing</span><br />
<br />
End Sub</div>
<h2><span id="toc3">AccessVBAでクエリを削除</span></h2>
<p>VBAでクエリを削除するにはクエリの名前を指定する必要があります。<br />
「Q_お試し」というクエリを削除するVBAコードは以下のようなものになります。</p>
<div class="VBACode">Sub クエリ削除1()<br />
<br />
<span class="VBA_Tab1">Dim SQL As String</span><br />
<span class="VBA_Tab1">Dim Obj As AccessObject</span><br />
<br />
<span class="VBA_Tab1">DoCmd.DeleteObject acQuery, &#8220;Q_お試し&#8221;</span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’CurrentDb.QueryDefs.Delete &#8220;Q_お試し&#8221;<span class="VBA_Comment">’これでもOK</span></span><br />
<br />
End Sub</div>
<p>一度作成したものを削除する場合には通常あり得ないことですが、例えば「Q_お試し」というクエリが存在するかどうか不明で、存在していた場合にのみ削除するというVBAコードは以下のようになります。</p>
<p>すべてのクエリに対してクエリ名を確認し、該当の名前のクエリを削除するという流れです。</p>
<div class="VBACode">Sub クエリ削除2()<br />
 <br />
<span class="VBA_Tab1">Dim Obj As AccessObject</span><br />
 <br />
<span class="VBA_Tab1">For Each Obj In CurrentData.AllQueries</span><br />
<span class="VBA_Tab2">If Obj.Name = &#8220;Q_お試し&#8221; Then</span><br />
<span class="VBA_Tab3">DoCmd.DeleteObject acQuery, &#8220;Q_お試し&#8221;</span><br />
<span class="VBA_Tab3"><span class="VBA_Comment0">’CurrentDb.QueryDefs.Delete &#8220;Q_お試し&#8221;<span class="VBA_Comment">’これでもOK</span></span><br />
<span class="VBA_Tab3">Exit Sub</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab1">Next</span><br />
<br />
End Sub</div>
<p>クエリの削除については、DoCmd.DeleteObject acQuery, &#8220;クエリ名&#8221;かコメントで記しているCurrentDb.QueryDefs.Delete &#8220;クエリ名&#8221;のいずれを使用しても削除できます。</p>
<p>削除した際のAccess上の挙動は微妙に変わっていて、DoCmd.DeleteObject acQuery, &#8220;クエリ名&#8221;を使用した場合はすぐにAccessオブジェクトの一覧から削除したクエリが消されますが、CurrentDb.QueryDefs.Delete &#8220;クエリ名&#8221;を使用した場合、オブジェクト一覧を最小化したり更新しないと表示が残ったままになるようです。</p>
<p>ただ、消えていないわけではないのでどちらを使用しても大きな違いはないと思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/accessvba_create_delete_query/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AccessVBAでクエリを操作する</title>
		<link>https://officevba.info/accessvba_query/</link>
					<comments>https://officevba.info/accessvba_query/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Tue, 24 Apr 2018 14:54:55 +0000</pubDate>
				<category><![CDATA[Accessクエリの管理・操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1379</guid>

					<description><![CDATA[目次 クエリ（SQL）の設計や実行はAccessの中で最も使う機能の一つAccessVBAでクエリを操作するメリットAccessVBAでできるクエリの操作 クエリ（SQL）の設計や実行はAccessの中で最も使う機能の一 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">クエリ（SQL）の設計や実行はAccessの中で最も使う機能の一つ</a></li><li><a href="#toc2" tabindex="0">AccessVBAでクエリを操作するメリット</a></li><li><a href="#toc3" tabindex="0">AccessVBAでできるクエリの操作</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">クエリ（SQL）の設計や実行はAccessの中で最も使う機能の一つ</span></h2>
<p>Accessなどのデータベースソフトが持つ優れた機能の一つが「クエリ」です。<br />
ある条件を満たすレコードを抽出したり、合計したり、または削除したりさまざまな処理を簡単に実行できるのが特徴です。</p>
<p>クエリ単独で使用してもかなり便利ですが、VBAと掛け合わせることでさらに自由度の高い処理ができるようになりますので、VBAでのクエリの操作・記載方法についてご紹介します。</p>
<h2><span id="toc2">AccessVBAでクエリを操作するメリット</span></h2>
<p>クエリはとても優れた機能ですが、1つのクエリでできる操作が1つであったり、色々な条件を組み合わせるのが難しいことがあります。</p>
<p>そういったときにAccessでクエリを2つ連続で実行したり、少しだけ条件を入れ替えたクエリを複数作成したりすることで自動化できる範囲が広がります。</p>
<p>また選択クエリなどの場合、選択の条件などを簡単に書き換えて都度実行することにより不要なクエリをたくさんデータベースに残す必要がなくなることも管理する上で大きなメリットです。</p>
<h2><span id="toc3">AccessVBAでできるクエリの操作</span></h2>
<p>AccessVBAでクエリの操作に関してできることは主に以下の内容です。</p>
<li><a href="https://officevba.info/accessvba_create_delete_query/" target="_blank">①クエリ（SQL）を作成・削除する</a></li>
<li><a href="https://officevba.info/accessvba_correction_query/" target="_blank">②クエリ（SQL）を修正する</a></li>
<li><a href="https://officevba.info/docmdrunsql/" target="_blank">③クエリ（SQL）を実行する</a></li>
<p>これらはそれぞれリンク先のページで内容を紹介します。</p>
<p>もともと何かのクエリを作っていれば、②修正→③実行を繰り返すだけでもVBAとしては十分な機能になります。</p>
<p>また「実行する」という概念のない選択クエリなどの場合は②しか行わなくても十分ですし、場合によってはクエリを作るだけでデータベースとしては十分な機能になる場合もあります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/accessvba_query/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AccessVBAでExcelを操作する</title>
		<link>https://officevba.info/accessvba-exceloperation/</link>
					<comments>https://officevba.info/accessvba-exceloperation/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sat, 21 Apr 2018 15:24:08 +0000</pubDate>
				<category><![CDATA[AccessVBA]]></category>
		<category><![CDATA[Excel操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1371</guid>

					<description><![CDATA[目次 AccessからExcelを操作すると便利なことがたくさんAccessからExcelを操作する手順Excelを操作するAccessVBAのサンプルコード Accessから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-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">AccessからExcelを操作すると便利なことがたくさん</a></li><li><a href="#toc2" tabindex="0">AccessからExcelを操作する手順</a></li><li><a href="#toc3" tabindex="0">Excelを操作するAccessVBAのサンプルコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">AccessからExcelを操作すると便利なことがたくさん</span></h2>
<p>Accessはすごくたくさんの機能がありますが、テーブルの構造を変更したり、格納されたデータを少し入れ替えたりする場合Excelを利用する方が融通が利く場合があります。</p>
<p>AccessのVBAを使用してExcelを操作できると色々な操作が自動化できるようになります。<br />
今回はAccessのVBA でExcelを起動する方法と基本的なワークシートの操作についてご紹介します。</p>
<h2><span id="toc2">AccessからExcelを操作する手順</span></h2>
<p>まず、CreateObject(&#8220;Excel.Application&#8221;)を用いて、Excelをオブジェクト型変数に格納しVBAで操作できるようにします。<br />
その後はExcelVBAで使用するコードをほぼそのまま使用することができます。</p>
<p>プロパティを指定する際、Excelを格納した変数を頭に記入しないとExcelVBAの操作であることが認識されないので注意が必要です。<br />
つい忘れがちになるので、Excelの操作ステップが多いならWithステートメントを使用してコードを省略した方がわかりやすくなります。</p>
<h2><span id="toc3">Excelを操作するAccessVBAのサンプルコード</span></h2>
<p>今回紹介するAccessVBAコードは①新しくExcelファイルを新規作成し、セルA1に「aaaa」と入力してデスクトップに保存するものと、②既存のExcelファイルを起動してセルA1に「aaaa」と入力して上書き保存するコードになります。</p>
<p>いずれの場合もExcelの操作の場合はWithステートメントを使用して、コードを理解しやすくしています。</p>
<p>①Excelファイルの新規作成と保存</p>
<div class="VBACode">Sub AccessVBAでExcelファイルの新規作成と保存()<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">ExApp.Visible = True</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String, FilePath As String, WSH As Variant</span><br />
<span class="VBA_Tab2">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab2">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">FilePath = DesktopPath &#038; &#8220;\作成したExcelファイル.xlsx&#8221;</span><br />
<br />
<span class="VBA_Tab1">ExApp.Workbooks.Add</span><br />
<span class="VBA_Tab1">With ExApp.Workbooks(ExApp.Workbooks.Count)</span><br />
<span class="VBA_Tab2">.Sheets(1).Cells(1, 1) = &#8220;aaaaa&#8221;</span><br />
<span class="VBA_Tab2">.SaveAs FileName:=FilePath</span><br />
<span class="VBA_Tab2">.Close</span><br />
<span class="VBA_Tab1">End With</span><br />
<span class="VBA_Tab1">ExApp.Quit</span><br />
<br />
<span class="VBA_Tab1">Set ExApp = Nothing</span><br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />
<br />
End Sub</div>
<p>②既存Excelファイルの起動と上書き保存</p>
<div class="VBACode">Sub Accessで既存のExcelファイル起動と編集()<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">ExApp.Visible = True</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String, FilePath As String, WSH As Variant</span><br />
<span class="VBA_Tab2">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab2">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">FilePath = DesktopPath &#038; &#8220;\元Excelファイル.xlsx&#8221;</span><br />
<br />
<span class="VBA_Tab1">ExApp.Workbooks.Open FileName:=FilePath</span><br />
<span class="VBA_Tab1">With ExApp.Workbooks(ExApp.Workbooks.Count)</span><br />
<span class="VBA_Tab2">.Sheets(1).Cells(1, 1) = &#8220;aaaaa&#8221;</span><br />
<span class="VBA_Tab2">.Save</span><br />
<span class="VBA_Tab2">.Close</span><br />
<span class="VBA_Tab1">End With</span><br />
<span class="VBA_Tab1">ExApp.Quit</span><br />
<br />
<span class="VBA_Tab1">Set ExApp = Nothing</span><br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />
<br />
End Sub</div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/accessvba-exceloperation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
