<?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>FSO(FileSystemObject) | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<atom:link href="https://officevba.info/category/vba%E5%85%B1%E9%80%9A/fso-filesystemobject/feed/" rel="self" type="application/rss+xml" />
	<link>https://officevba.info</link>
	<description>仕事の役に立つVBA・GAS・Pythonのコードを紹介していきます。</description>
	<lastBuildDate>Sun, 06 Nov 2022 11:25:08 +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>FSO(FileSystemObject) | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<link>https://officevba.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ExcelVBAで再帰処理を用いてフォルダ一覧を取得</title>
		<link>https://officevba.info/recursion-getfolder/</link>
					<comments>https://officevba.info/recursion-getfolder/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 06 Nov 2022 11:25:08 +0000</pubDate>
				<category><![CDATA[ファイル・フォルダ操作]]></category>
		<category><![CDATA[recursion]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[再帰処理]]></category>
		<guid isPermaLink="false">https://officevba.info/?p=2469</guid>

					<description><![CDATA[目次 VBAで再帰処理を実行再帰処理とは再帰処理の実例 VBAで再帰処理を実行 最近、ExcelVBAの再帰処理の方法を人から教えてもらったので、以前断念したフォルダ一覧の取得をVBAで試してみました。 使い方の基本さえ [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAで再帰処理を実行</a></li><li><a href="#toc2" tabindex="0">再帰処理とは</a></li><li><a href="#toc3" tabindex="0">再帰処理の実例</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">VBAで再帰処理を実行</span></h2>
<p>最近、ExcelVBAの再帰処理の方法を人から教えてもらったので、以前断念したフォルダ一覧の取得をVBAで試してみました。<br />
使い方の基本さえわかっていればかなり便利に使用できますのでこちらでご紹介します。</p>
<h2><span id="toc2">再帰処理とは</span></h2>
<p>再帰処理とはあるプログラムの中で自分自身を呼び出して繰り返し処理を行うことです。<br />
繰り返しの数があらかじめ定まっていない、ネストの階層がわからない場合など一般的な繰り返しが適用しにくい場合に有効な処理となります。</p>
<h2><span id="toc3">再帰処理の実例</span></h2>
<p>再帰処理はいつでもどこでも使うものというより特定の状況で知っておくとめちゃくちゃ便利なものだと思います。<br />
今回は再帰処理を用いて「フォルダの一覧を取得」するコードをご紹介します。</p>
<div class="VBACode">
<pre>Sub フォルダとファイル一覧を取得()

    '参照設定「MicrosoftScriptingRuntime」を有効にしておく
    Dim fso As New FileSystemObject
    '参照設定「Windows Script Host Object Model」を有効にしておく
    Dim wsh As New WshShell
    
    Dim tarPath As String: tarPath = wsh.SpecialFolders("Desktop") &#038; "\マクロ"
    Dim tarFolder As Folder: Set tarFolder = fso.GetFolder(tarPath)
    Call recursion(tarFolder)
    
    Set fso = Nothing
    Set wsh = Nothing
    
End Sub

Sub recursion(ByRef f As Folder)

    Dim tarSubFolder As Folder
    
    For Each tarSubFolder In f.SubFolders
        Debug.Print tarSubFolder.Path
        Call recursion(tarSubFolder)
    Next

End Sub</pre>
</div>
<p>デスクトップにある「マクロ」ファイルの下部にあるサブフォルダを全階層にわたり取得してイミディエイトに出力するコードになります。</p>
<p>Subプロシージャの「recursion」（再帰）の中で、 ①サブフォルダを取得して、②そのフォルダオブジェクトを引数にして自分自身をCallで呼び出す作りになっています。 </p>
<p>Subプロシージャが自分自身を呼び出すことができることに自分では考えが至らず、教わったときに衝撃を受けました。</p>
<p>この処理は対象となるフォルダが多いと終了するまでに時間がかかるのでご注意ください。</p>
<p>普通にデスクトップのパスを文字列で指定してもいいのですが、Windowsのユーザー名に依存せずにデスクトップを指定するためにWSH(Windows Scripting Host)のSpecialFoldersを使用しています。</p>
<p>Debug.printでイミディエイトウィンドウに表示する代わりに、配列に入れたりワークシートに出力することでより高速に処理ができるようになります。</p>
<p>ちなみにPythonではglobというライブラリを使用すれば、以下の1行で再帰処理を実行して全フォルダを取得することができます。</p>
<div class="PythonCode">
<pre>print(glob.glob('C:/Users/<ユーザー名>/Desktop/マクロ/**', recursive=True))</pre>
</div>
<p>この辺りはまた別の記事でご紹介できればと思います。<br />
今回の目的だけならPythonを使った方が便利そうですが、VBAでも再帰処理ができるというのは大きな発見でした。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/recursion-getfolder/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ファイル名を一括変更するExcelVBA</title>
		<link>https://officevba.info/filenametransfer/</link>
					<comments>https://officevba.info/filenametransfer/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Mon, 25 May 2020 04:43:13 +0000</pubDate>
				<category><![CDATA[ExcelVBA]]></category>
		<category><![CDATA[FSO(FileSystemObject)]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[ファイル操作]]></category>
		<category><![CDATA[繰り返し]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=2023</guid>

					<description><![CDATA[目次 ちょっとずつファイル名を変更するのがかなり面倒ファイル名一覧を取得→変更後のファイルをシートに書き出す今回使用するワークシート作成したExcelVBAコード ちょっとずつファイル名を変更するのがかなり面倒 最近同じ [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-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">ちょっとずつファイル名を変更するのがかなり面倒</a></li><li><a href="#toc2" tabindex="0">ファイル名一覧を取得→変更後のファイルをシートに書き出す</a></li><li><a href="#toc3" tabindex="0">今回使用するワークシート</a></li><li><a href="#toc4" tabindex="0">作成したExcelVBAコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">ちょっとずつファイル名を変更するのがかなり面倒</span></h2>
<p>最近同じようなファイルを複数コピーして少しずつ内容を変えて、別の名前で保存するという仕事がありました。</p>
<p>5個～10個くらいのファイルならまだいいのですが、100個単位で必要だったりするとかなりつらいです。<br />
また、一回ある規則で変更したのにまた別の規則で再度変更になったりすると絶望すると思います。</p>
<p>今回はそんなときに便利なファイル名を一括で変更するExcelVBAを紹介します。</p>
<h2><span id="toc2">ファイル名一覧を取得→変更後のファイルをシートに書き出す</span></h2>
<p>今回私が考えたツールではまずあるフォルダに変更したファイルをすべて格納し、そのファイル名を取得するのが最初のステップ、<br />
続いて変更後のファイル名を記載して実行させることで、一括でファイル名を変更する仕様となっています。</p>
<h2><span id="toc3">今回使用するワークシート</span></h2>
<p>今回使用するワークシートは下記の書式となっています。</p>
<p><a href="https://officevba.info/wp-content/uploads/2020/05/c8dabac66fc0a32687a17410e562cf41.jpg"><img fetchpriority="high" decoding="async" src="https://officevba.info/wp-content/uploads/2020/05/c8dabac66fc0a32687a17410e562cf41-300x274.jpg" alt="vba145-1" width="300" height="274" class="alignnone size-medium wp-image-2132" srcset="https://officevba.info/wp-content/uploads/2020/05/c8dabac66fc0a32687a17410e562cf41-300x274.jpg 300w, https://officevba.info/wp-content/uploads/2020/05/c8dabac66fc0a32687a17410e562cf41-700x640.jpg 700w, https://officevba.info/wp-content/uploads/2020/05/c8dabac66fc0a32687a17410e562cf41-768x702.jpg 768w, https://officevba.info/wp-content/uploads/2020/05/c8dabac66fc0a32687a17410e562cf41.jpg 1066w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>変更したいファイルをひとまとめにしたフォルダを指定することで、A列にファイル名の一覧を表示させます。<br />
C列にも同じ値を入力していますが、こちらを変更してからファイル名変更のVBAを実行することを想定しています。</p>
<p>簡単に実行できるようにするため、私はボタンを配置してマクロを割り当てています。</p>
<h2><span id="toc4">作成したExcelVBAコード</span></h2>
<p>ファイル名の一覧を取得するコードは下記の通りです。<br />
その後の一括変換をする際の対象を確定させるため、フォルダのパスはワークシートに記載します。</p>
<div class="VBACode">Sub すべてのファイル名一覧取得()<br />
<br />
<span class="VBA_Tab1">Dim FolderName As String  <span class="VBA_Comment">’文字列を入れる変数として「FolderName」を使う</span></span><br />
<span class="VBA_Tab1">Dim Index As Integer  <span class="VBA_Comment">’数字を入れる変数として「index」を使う</span></span><br />
<span class="VBA_Tab1">Dim FileName As String  <span class="VBA_Comment">’文字列を入れる変数として「FileName」を使う</span></span><br />
<span class="VBA_Tab2">FolderName = Application.GetOpenFilename <span class="VBA_Comment">’ダイアログを用いて選択したファイルのパスをFolderNameとする①</span></span><br />
<span class="VBA_Tab1">Dim i</span><br />
<br />
<span class="VBA_Tab1">If FolderName = &#8220;False&#8221; Then  <span class="VBA_Comment">’FolderNameが選択されていなければ作業を終了する</span></span><br />
<span class="VBA_Tab2">Exit Sub</span><br />
<span class="VBA_Tab1">Else</span><br />
<span class="VBA_Tab2">Cells(1, 5) = FolderName  <span class="VBA_Comment">’対象とするフォルダのパスをセルの値に格納する</span></span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’今のフォルダ名には選択したファイル名含まれているので、ファイル名の部分を切り取る作業。</span></span><br />
<span class="VBA_Tab1">Index = InStrRev(FolderName, &#8220;&#8221;)  <span class="VBA_Comment">’フォルダ名部分の文字数をカウントする</span></span><br />
<span class="VBA_Tab1">FolderName = Left(FolderName, Index) <span class="VBA_Comment">’ カウントした文字数までの部分を切り取ってフォルダ名とする</span></span><br />
<span class="VBA_Tab1">FileName = Dir(FolderName &#038; &#8220;*.*&#8221;)  <span class="VBA_Comment">’ フォルダの中に含まれるファイルを取り出す</span></span><br />
<span class="VBA_Tab1">i = 2</span><br />
<br />
<span class="VBA_Tab1">Do While FileName <> &#8220;&#8221;  <span class="VBA_Comment">’ ファイルがなくなるまで繰り返す</span></span><br />
<span class="VBA_Tab2">ThisWorkbook.ActiveSheet.Cells(i, 1) = FileName  <span class="VBA_Comment">’A列にファイル名を記述</span></span><br />
<span class="VBA_Tab2">ThisWorkbook.ActiveSheet.Cells(i, 3) = FileName  <span class="VBA_Comment">’C列にも一旦元ファイル名を記述</span></span><br />
<span class="VBA_Tab2">i = i + 1</span><br />
<span class="VBA_Tab1">FileName = Dir() <span class="VBA_Comment">’次のファイルに</span></span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
End Sub</div>
<p>C列はA列と同じ値になっていますので、何かしら変更を加えてからファイル名を変更するVBAを実行します。<br />
続いて実行するファイル名を変更するVBAコードは下記の通りです。</p>
<p>ファイル名を変更するにはFSO（FileSystemObject）を用いると便利です。<br />
「FSO.GetFile(対象ファイルのフルパス).Name=”変更したいファイル名”」の書式で記載します。</p>
<p>ファイルが存在しなかったり、もともと存在する名前に変更しようとするとエラーになります。</p>
<div class="VBACode">Sub ファイル名一括変換()<br />
<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">Dim FolderName As String  <span class="VBA_Comment">’文字列を入れる変数として「FolderName」を使う</span></span><br />
<span class="VBA_Tab1">Dim Index As Integer  <span class="VBA_Comment">’数字を入れる変数として「index」を使う</span></span><br />
<span class="VBA_Tab1">Dim FileName As String  <span class="VBA_Comment">’文字列を入れる変数として「FileName」を使う</span></span><br />
<span class="VBA_Tab1">Dim i</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’対象のフォルダパスが指定されていればダイアログは出さない</span></span><br />
<span class="VBA_Tab1">If Cells(1, 5) = &#8220;&#8221; Then</span><br />
<span class="VBA_Tab2">FolderName = Application.GetOpenFilename <span class="VBA_Comment">’ダイアログを用いて選択したファイルのパスをFolderNameとする①</span></span><br />
<span class="VBA_Tab2">If FolderName = &#8220;False&#8221; Then  <span class="VBA_Comment">’FolderNameが選択されていなければ作業を終了する</span></span><br />
<span class="VBA_Tab3">Exit Sub</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab1">Else</span><br />
<span class="VBA_Tab2">FolderName = Cells(1, 5).Text</span><br />
<span class="VBA_Tab1">End If</span><br />
<br />
<span class="VBA_Tab1"><span class="VBA_Comment">’今のフォルダ名には選択したファイル名含まれているので、ファイル名の部分を切り取る作業。</span></span><br />
<span class="VBA_Tab1">Index = InStrRev(FolderName, &#8220;&#8221;)  <span class="VBA_Comment">’フォルダ名部分の文字数をカウントする</span></span><br />
<span class="VBA_Tab1">i = 2</span><br />
<span class="VBA_Tab1">FolderName = Left(FolderName, Index) <span class="VBA_Comment">’ カウントした文字数までの部分を切り取ってフォルダ名とする</span></span><br />
<br />
<span class="VBA_Tab1">Do While Cells(i, 1) <> &#8220;&#8221; <span class="VBA_Comment">’ ファイルがなくなるまで繰り返す</span></span><br />
<span class="VBA_Tab2">FileName = Cells(i, 1)</span><br />
<span class="VBA_Tab2">FSO.GetFile(FolderName &#038; FileName).Name = Cells(i, 3).Text</span><br />
<span class="VBA_Tab2">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub</div>
<p>フリーのソフトなどでも同じような処理はできると思いますが、セキュリティでフリーソフトの使用が禁じられている職場のPCの場合には上記のVBAコードは簡単に作成できて用途も多いと思います。</p>
<p>またExcelの関数Substitute、Left、Midなどを使えることもフリーソフト単独では得られない便利さだと思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/filenametransfer/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-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">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>ファイルの作成日と更新日を取得するVBAコード</title>
		<link>https://officevba.info/datecreated-datelastmodified/</link>
					<comments>https://officevba.info/datecreated-datelastmodified/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Fri, 16 Aug 2019 15:07:03 +0000</pubDate>
				<category><![CDATA[ファイル・フォルダ操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1759</guid>

					<description><![CDATA[目次 ファイルの作成日と更新日を取得する必要性FSO(FileSystemObject)についてファイルの作成日・更新日を取得するVBAコードフォルダの作成日・更新日を取得するVBAコード ファイルの作成日と更新日を取得 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ファイルの作成日と更新日を取得する必要性</a></li><li><a href="#toc2" tabindex="0">FSO(FileSystemObject)について</a></li><li><a href="#toc3" tabindex="0">ファイルの作成日・更新日を取得するVBAコード</a></li><li><a href="#toc4" tabindex="0">フォルダの作成日・更新日を取得するVBAコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">ファイルの作成日と更新日を取得する必要性</span></h2>
<p>バックアップを定期的に取るためのツールを作成することにしたのですが、バックアップ先にファイルを保存していくときに既に同じ名前の古いファイルが存在していた場合、置き換えるのか、それともそのままにするのか判断するためファイルの更新日を比較する必要があることに気づきました。</p>
<p>毎回全部のファイルをコピーすれば良いかもしれませんが、時間かかって面倒ですし、容量がたくさん必要なる可能性があるので、必要最低限のみ保存するだけで済ませるツールにする予定です。</p>
<p>私も今回調べて初めて知ったのですが、FSO(FileSystemObject)を使って意外と簡単に作成日・更新日を取得できるのでご紹介します。</p>
<h2><span id="toc2">FSO(FileSystemObject)について</span></h2>
<p>以前に<a href="https://officevba.info/filesystemobject/" target="_blank">こちら</a>でご紹介していますが、ファイル・フォルダを操作するオブジェクトです。</p>
<p>ExcelVBAに標準で搭載されているファイル・フォルダ操作よりもより多様な操作が可能です。<br />
ファイルやフォルダのコピー・削除・移動などの処理が簡単にできます。</p>
<p>個人的にはExcelのワークシートの組み合わせて使用するのが好きで、フォルダ・ファイル一覧を書き出して→決まった処理をする流れでバックアップを作成する予定です。</p>
<h2><span id="toc3">ファイルの作成日・更新日を取得するVBAコード</span></h2>
<p>ファイルの作成日・更新日を取得するためには調べたいファイルのフルパスが必要です。</p>
<li>FSO.GetFile(&#8220;調べるファイルのフルパス&#8221;).DateCreated：作成日の取得</li>
<li>FSO.GetFile(&#8220;調べるファイルのフルパス&#8221;).DateLastModified：更新日の取得</li>
<p>デスクトップにある「aaa.xlsx」ファイルの作成日・更新日を取得するサンプルコードは下記の通りです。</p>
<div class="VBACode">Sub ファイルの更新日を取得する()<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<br />
<span class="VBA_Tab1">MsgBox FSO.GetFile(&#8220;C:Users〇〇Desktopaaa.xlsx&#8221;).DateCreated</span><br />
<span class="VBA_Tab1">MsgBox FSO.GetFile(&#8220;C:Users〇〇Desktopaaa.xlsx&#8221;).DateLastModified</span><br />
<br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub</div>
<p>〇〇の部分はユーザー名になります。</p>
<p>これだけでは汎用性がなく、使用しにくいのでユーザー名に関わらずDesktopを指定するWSHを使用したり、Dir関数を用いてフォルダ・ファイル一覧を取得してセルに格納した上で作成日・更新日を取得する流れにすると思います。</p>
<h2><span id="toc4">フォルダの作成日・更新日を取得するVBAコード</span></h2>
<p>フォルダの作成日・更新日を取得する方法もファイルを取得する場合とほぼ同じで、「GetFile」が「GetFolder」になるだけです。<br />
デスクトップにある「aaa」フォルダの作成日・更新日を取得するサンプルコードは下記の通りです。</p>
<li>FSO.GetFolder(&#8220;調べるフォルダのフルパス&#8221;).DateCreated</li>
<li>FSO.GetFolder(&#8220;調べるフォルダのフルパス&#8221;).DateLastModified</li>
<p>サンプルコードは次の通りです。</p>
<div class="VBACode">Sub フォルダの更新日を取得する()<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<br />
<span class="VBA_Tab1">MsgBox FSO.GetFolder(&#8220;C:Users〇〇Desktopaaa&#8221;).DateCreated</span><br />
<span class="VBA_Tab1">MsgBox FSO.GetFolder(&#8220;C:Users〇〇Desktopaaa&#8221;).DateLastModified</span><br />
<br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub</div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/datecreated-datelastmodified/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBA（マクロ）で一括フォルダ作成</title>
		<link>https://officevba.info/createfolder4/</link>
					<comments>https://officevba.info/createfolder4/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Mon, 04 Jul 2016 13:07:59 +0000</pubDate>
				<category><![CDATA[ファイル・フォルダ操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=324</guid>

					<description><![CDATA[目次 FSO（FileSystemObject）の便利な使用方法FSO（FileSystemObject）を用いたVBAコードの紹介 FSO（FileSystemObject）の便利な使用方法 FSOを用いたファイル、フ [&#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">FSO（FileSystemObject）の便利な使用方法</a></li><li><a href="#toc2" tabindex="0">FSO（FileSystemObject）を用いたVBAコードの紹介</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">FSO（FileSystemObject）の便利な使用方法</span></h2>
<p>FSOを用いたファイル、フォルダの操作は変数の扱いと合わせて使用することでより便利な操作になります。</p>
<p>例えば色んな名前のフォルダを手作業で100個作るのは大変ですが、Excelの表に100個のフォルダ名の一覧を作っておけば、その名前のフォルダ一気に作成したりできます。</p>
<p><a href="https://officevba.info/wp-content/uploads/2016/07/20-001.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2016/07/20-001-300x164.jpg" alt="20-001" width="300" height="164" class="alignnone size-medium wp-image-326" srcset="https://officevba.info/wp-content/uploads/2016/07/20-001-300x164.jpg 300w, https://officevba.info/wp-content/uploads/2016/07/20-001-768x419.jpg 768w, https://officevba.info/wp-content/uploads/2016/07/20-001-700x382.jpg 700w, https://officevba.info/wp-content/uploads/2016/07/20-001-320x175.jpg 320w, https://officevba.info/wp-content/uploads/2016/07/20-001.jpg 1920w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
<a href="https://officevba.info/wp-content/uploads/2016/07/20-002.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2016/07/20-002-300x164.jpg" alt="20-002" width="300" height="164" class="alignnone size-medium wp-image-327" srcset="https://officevba.info/wp-content/uploads/2016/07/20-002-300x164.jpg 300w, https://officevba.info/wp-content/uploads/2016/07/20-002-768x419.jpg 768w, https://officevba.info/wp-content/uploads/2016/07/20-002-700x382.jpg 700w, https://officevba.info/wp-content/uploads/2016/07/20-002-320x175.jpg 320w, https://officevba.info/wp-content/uploads/2016/07/20-002.jpg 1920w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h2><span id="toc2">FSO（FileSystemObject）を用いたVBAコードの紹介</span></h2>
<p>デスクトップにあるaというフォルダの中にExcelの一番左の列に書かれた100個の名前のフォルダを作成するコードは以下のようになります。</p>
<div class="VBACode">
Sub Excelシートの一覧表に載っている名前のフォルダをデスクトップのaフォルダの中に作成するマクロ()<br />&nbsp;<br />
<span class="VBA_Tab1">Dim WSH As Object, FSO As Object<br />
<span class="VBA_Tab1">Dim DesktopPath As String<br />
<span class="VBA_Tab1">Dim i As Integer</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />&nbsp;<br />
<span class="VBA_Tab1">For i = 1 To 100</span><br />
<span class="VBA_Tab2">FSO.CreateFolder DesktopPath &#038; &#8220;a&#8221; &#038; Cells(i, 1).Text</span><br />
<span class="VBA_Tab2">Next i</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />&nbsp;<br />
End Sub
</div>
<p></p>
<p>手作業でのフォルダを作る必要がなくなるのでよくフォルダを作る必要がある人は持っておくと便利だと思います。100個に限らず一覧を全て作成する場合は、以下に記すようにDo Until~Loop構文を使うとよいと思います。</p>
<div class="VBACode">
Sub Excelシートの一覧表に載っている名前のフォルダをデスクトップのaフォルダの中に作成するマクロ()<br />&nbsp;<br />
<span class="VBA_Tab1">Dim WSH As Object, FSO As Object</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab1">Dim i As Integer</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />&nbsp;<br />
<span class="VBA_Tab1">i = 1</span><br />
<span class="VBA_Tab1">Do Until Cells(i, 1).Text = “”</span><br />
<span class="VBA_Tab2">FSO.CreateFolder DesktopPath &#038; &#8220;a&#8221; &#038; Cells(i, 1).Text</span><br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />&nbsp;<br />
End Sub
</div>
<p></p>
<p>このコードだと表がなくなるまでフォルダを作り続けるので、100個より多くても少なくても大丈夫です。</p>
<p>サンプルファイルも投稿します。このファイルのA列に上から詰めて作成したいフォルダの名前を記載してボタンを押すとデスクトップのaフォルダの中に表に書いた名前のフォルダが作成されます。デスクトップに「a」という名前のフォルダがなければ自動で作成します。</p>
<p><a href="https://officevba.info/wp-content/uploads/2016/07/デスクトップのaフォルダに一覧表の名前のフォルダを作成するマクロ.xlsm">デスクトップのaフォルダに一覧表の名前のフォルダを作成するマクロはこちらからダウンロードできます。</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/createfolder4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>特殊フォルダのパスを取得する（デスクトップのパス取得）</title>
		<link>https://officevba.info/specialfolder/</link>
					<comments>https://officevba.info/specialfolder/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 03 Jul 2016 14:15:33 +0000</pubDate>
				<category><![CDATA[ファイル・フォルダ操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=311</guid>

					<description><![CDATA[目次 PCごとに異なるデスクトップを指定したいデスクトップを使用するコードの例①表示されているExcelファイルをデスクトップに保存する。②デスクトップにフォルダを作成する。③デスクトップにファイルをコピーするマクロWS [&#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">PCごとに異なるデスクトップを指定したい</a></li><li><a href="#toc2" tabindex="0">デスクトップを使用するコードの例</a><ol><li><a href="#toc3" tabindex="0">①表示されているExcelファイルをデスクトップに保存する。</a></li><li><a href="#toc4" tabindex="0">②デスクトップにフォルダを作成する。</a></li><li><a href="#toc5" tabindex="0">③デスクトップにファイルをコピーするマクロ</a></li></ol></li><li><a href="#toc6" tabindex="0">WSH(Windows Scripting Host)の使うための準備</a><ol><li><a href="#toc7" tabindex="0">①最初と最後に記載するコード</a></li><li><a href="#toc8" tabindex="0">②指定したデスクトップを使いやすいように変数に入れる。</a></li></ol></li><li><a href="#toc9" tabindex="0">WSH(Windows Scripting Host)の使ったコードの例</a><ol><li><a href="#toc10" tabindex="0">①画面に表示されているExcelファイルをデスクトップに保存する。</a></li><li><a href="#toc11" tabindex="0">②デスクトップにフォルダを作成する</a></li><li><a href="#toc12" tabindex="0">③デスクトップにファイルをコピーするマクロ</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">PCごとに異なるデスクトップを指定したい</span></h2>
<p>ファイルをデスクトップに保存するVBAコードの場合、パスの中にユーザー名が含まれていたり、Windowsのバージョンによってパスが違うために他のパソコンではきちんと動作しません。</p>
<p>今回はどんなPCの環境でもデスクトップが指定できるWSH(Windows Scripting Host)を用いた特殊フォルダの取得をお伝えします。</p>
<h2><span id="toc2">デスクトップを使用するコードの例</span></h2>
<p>デスクトップを指定する必要のあるコードの例は以下のようなものがあります。<br />
「Users」が「Documents and Settings」になっている場合もあります。</p>
<h3><span id="toc3">①表示されているExcelファイルをデスクトップに保存する。</span></h3>
<div class="VBACode">Sub デスクトップに保存するマクロ1()<br />&nbsp;<br />
<span class="VBA_Tab1">ActiveWorkbook.SaveAs Filename:=&#8221;C:\Users\（ユーザー名）\Desktop\あいうえお.xlsm&#8221;, _</span><br />
<span class="VBA_Tab1">FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False</span><br />&nbsp;<br />
End Sub</div>
<h3><span id="toc4">②デスクトップにフォルダを作成する。</span></h3>
<p>以前紹介したFSO（FileSystemObject）を用いたフォルダ操作のコードです。<br />
デスクトップに「あいうえお」というフォルダを作成するコードになります。</p>
<div class="VBACode">
Sub デスクトップにあいうえおフォルダを作成するマクロ()<br />&nbsp;<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CreateFolder “C:\Users\（ユーザー名）\Desktop\あいうえお” </span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />&nbsp;<br />
End Sub
</div>
<h3><span id="toc5">③デスクトップにファイルをコピーするマクロ</span></h3>
<p>②と同じく以前紹介したFSO（FileSystemObject）を用いたファイル操作のコードです。<br />
Dドライブのa.jpgというファイルをデスクトップにコピーするコードになります。</p>
<div class="VBACode">
Sub デスクトップにファイルaをコピーするマクロ()<br />&nbsp;<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CopyFile &#8220;D:\a.jpg&#8221;, &#8220;C:\Users\（ユーザー名）\Desktop\&#8221;</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />&nbsp;<br />
End Sub
</div>
<h2><span id="toc6">WSH(Windows Scripting Host)の使うための準備</span></h2>
<p>ユーザー名やWindowsのバージョンにかからわずにデスクトップを指定するためにWSH(Windows Scripting Host)を用いますが、その使い方は以下のようになります。</p>
<h3><span id="toc7">①最初と最後に記載するコード</span></h3>
<p>WSH(Windows Scripting Host)の使い方はFSO（FileSystemObject）と似ています。<br />
使用する場合、最初に以下のコードを書きます。</p>
<div class="VBACode">
Dim WSH As Object<br />
Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)
</div>
<p>また最後には以下のコードを書くのが決まりです。（書かなくてもきちんと動きますが。）</p>
<div class="VBACode">
Set WSH = Nothing
</div>
<h3><span id="toc8">②指定したデスクトップを使いやすいように変数に入れる。</span></h3>
<p>取得するデスクトップパスを以下のように変数に入れておくと便利です。</p>
<div class="VBACode">
Dim DesktopPath As String<br />
DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)
</div>
<h2><span id="toc9">WSH(Windows Scripting Host)の使ったコードの例</span></h2>
<h3><span id="toc10">①画面に表示されているExcelファイルをデスクトップに保存する。</span></h3>
<p>現在表示されているファイルをデスクトップに保存するコードは以下のように記載できます。</p>
<div class="VBACode">
Sub デスクトップに保存するマクロ2()<br />&nbsp;<br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />&nbsp;<br />
<span class="VBA_Tab1">ActiveWorkbook.SaveAs Filename:= DesktopPath &#038; &#8220;\あいうえお.xlsm&#8221;, _</span><br />
<span class="VBA_Tab1">FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False</span><br />
<span style="padding:40px;"><span class="VBA_Comment">‘DesktopPathの続きは「&#038;」を用いて表示する</span></span><br />&nbsp;<br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />&nbsp;<br />
End Sub
</div>
<h3><span id="toc11">②デスクトップにフォルダを作成する</span></h3>
<p>デスクトップに「あいうえお」というフォルダを作成するマクロはWSH(Windows Scripting Host)を用いて以下のように表されます。</p>
<div class="VBACode">
Sub デスクトップにフォルダを作成するマクロ2()<br />&nbsp;<br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CreateFolder DesktopPath &#038; “\あいうえお” </span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />&nbsp;<br />
End Sub
</div>
<h3><span id="toc12">③デスクトップにファイルをコピーするマクロ</span></h3>
<p>Dドライブのa.jpgというファイルをデスクトップにコピーするコードをWSH(Windows Scripting Host)を用いると以下のようになります。</p>
<div class="VBACode">
Sub デスクトップにファイルをコピーするマクロ2()<br />&nbsp;<br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CopyFile &#8220;D:\a.jpg&#8221;, DesktopPath &#038; “\” </span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />&nbsp;<br />
End Sub
</div>
<p>コードは少し増えますが、これでどんなPCでも共通で使うことができるようになります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/specialfolder/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBA（マクロ）でフォルダ作成・コピー・削除</title>
		<link>https://officevba.info/fsofolderoperation/</link>
					<comments>https://officevba.info/fsofolderoperation/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Fri, 01 Jul 2016 12:22:49 +0000</pubDate>
				<category><![CDATA[ファイル・フォルダ操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=297</guid>

					<description><![CDATA[目次 FSO（FileSystemObject）でフォルダ操作FSO（FileSystemObject）を用いたフォルダの操作①フォルダを作成する②フォルダのコピー③フォルダの削除④フォルダが存在するか調べるPCの環境に [&#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">FSO（FileSystemObject）でフォルダ操作</a></li><li><a href="#toc2" tabindex="0">FSO（FileSystemObject）を用いたフォルダの操作</a><ol><li><a href="#toc3" tabindex="0">①フォルダを作成する</a></li><li><a href="#toc4" tabindex="0">②フォルダのコピー</a></li><li><a href="#toc5" tabindex="0">③フォルダの削除</a></li><li><a href="#toc6" tabindex="0">④フォルダが存在するか調べる</a></li></ol></li><li><a href="#toc7" tabindex="0">PCの環境によって指定するコードが変わる？</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">FSO（FileSystemObject）でフォルダ操作</span></h2>
<p>前回の記事でFSO（FileSystemObject）を用いたファイルを操作するコードについてお伝えしました。<br />
今回はフォルダを操作するサンプルコードをご紹介します。ファイル操作の時のコードとよく似ています。
</p>
<p></p>
<h2><span id="toc2">FSO（FileSystemObject）を用いたフォルダの操作</span></h2>
<h3><span id="toc3">①フォルダを作成する</span></h3>
<p>「FSO.CreateFolder “フォルダを作成する場所”」の形式で記載します。<br />
もともとフォルダが存在する場合はエラーになります。</p>
<p>以下のコードはDドライブに「あいうえお」というフォルダを作成するコードです。<br />
もともと「あいうえお」が存在しているかどうか判断し、存在していない場合フォルダを作成する方法は「④フォルダが存在するか調べる」で記載します。</p>
<div class="VBACode">Sub フォルダを作成するマクロ1<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CreateFolder “D:\あいうえお”</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<p></p>
<h3><span id="toc4">②フォルダのコピー</span></h3>
<p>「FSO.CopyFolder “コピーするフォルダ” “コピー先のフォルダ”」の形式で記載します。<br />
①のCopyFileと使い方はほぼ同じです。ワイルドカードを用いて一気に複数のフォルダをコピーすることもできます。</p>
<p>下の例はDドライブの「あいうえお」というフォルダをEドライブにコピーするコードです。</p>
<div class="VBACode">Sub フォルダをコピーするマクロ1<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CopyFolder “D:\あいうえお”,“E:\”</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub</div>
<h3><span id="toc5">③フォルダの削除</span></h3>
<p>「FSO.DeleteFolder “削除するフォルダ”」の形式で記載します。<br />
下のサンプルコードではDドライブにある「あいうえお」というフォルダが削除されます。<br />
もちろんフォルダの中身も削除されます。</p>
<div class="VBACode">
Sub フォルダを削除するマクロ1<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.DeleteFolder “D:\あいうえお”</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<h3><span id="toc6">④フォルダが存在するか調べる</span></h3>
<p>フォルダが存在するか調べるコードは「FSO.FolderExists(“存在するか調べるフォルダ名”)」で記述します。<br />
ファイルが存在するか調べるFileExistsと同じく、これを単独で使用するのではなく条件分岐に記載することが多いと思います。</p>
<p>以下のコードはDドライブに「あいうえお」というフォルダがあるか確認し、ない場合には「あいうえお」というフォルダを作成するVBAコードです。<br />
（フォルダがあるかないか確認せずに「FSO.CreateFolder “D:\あいうえお”」だけを記載すると元々フォルダがあった場合にエラーが出ます。）</p>
<div class="VBACode">
Sub フォルダを作成するマクロ2()<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">If FSO.FolderExists(&#8220;D:\あいうえお&#8221;) = False Then</span><br />
<span class="VBA_Tab2">FSO.CreateFolder &#8220;D:\あいうえお&#8221;</span><br />
<span class="VBA_Tab1">End If</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<h2><span id="toc7">PCの環境によって指定するコードが変わる？</span></h2>
<p>フォルダの作成においてはデスクトップやマイドキュメントを指定する場合が多いと思います。これらのフォルダパスは「C:\Users\（ユーザー名）\Desktop」「C:\Documents and Settings\（ユーザー名）\Desktop」のように、中にユーザー名が含まれているし、WindowsのOSの種類によって変わります。</p>
<p>これらのフォルダを指定する場合、通常の記載方法では作成したパソコンでしかきちんと動作しません。</p>
<p>自宅のPCと会社のPCなど、複数の環境で使用できるコードを作成するには、WSH(Windows Scripting Host)を用いてデスクトップやマイドキュメントを指定する方法があります。<br />
これはまた別の機会にお伝えします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/fsofolderoperation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBA（マクロ）でのファイル作成・コピー・削除</title>
		<link>https://officevba.info/fsofileoperation/</link>
					<comments>https://officevba.info/fsofileoperation/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Thu, 30 Jun 2016 13:12:18 +0000</pubDate>
				<category><![CDATA[ファイル・フォルダ操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=284</guid>

					<description><![CDATA[目次 FSO（FileSystemObject）の事前準備FSO（FileSystemObject）のコード紹介～ファイル操作～①ファイルのコピー②ファイルの削除③ファイルが存在するか調べる FSO（FileSystem [&#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">FSO（FileSystemObject）の事前準備</a></li><li><a href="#toc2" tabindex="0">FSO（FileSystemObject）のコード紹介～ファイル操作～</a><ol><li><a href="#toc3" tabindex="0">①ファイルのコピー</a></li><li><a href="#toc4" tabindex="0">②ファイルの削除</a></li><li><a href="#toc5" tabindex="0">③ファイルが存在するか調べる</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">FSO（FileSystemObject）の事前準備</span></h2>
<p>前回の記事でFSO（FileSystemObject）を用いてできることと事前準備についてお伝えしました。今回はサンプルコードをご紹介します。</p>
<h2><span id="toc2">FSO（FileSystemObject）のコード紹介～ファイル操作～</span></h2>
<h3><span id="toc3">①ファイルのコピー</span></h3>
<p>「FSO.CopyFile “コピーするファイル” , “コピー先のフォルダ”」の形式で記載します。<br />
以下のコードはデスクトップにある「a.jpg」というファイルをEドライブの「gazou」というフォルダにコピーします。<br />
（「gazou」というフォルダが存在しないとエラーになります。）</p>
<div class="VBACode">Sub ファイルをコピーするマクロ()<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CopyFile &#8220;D:\a.jpg&#8221;, &#8220;E:\gazou&#8221;</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<p></p>
<p>また名前を変更する場合は「FSO.CopyFile “コピーするファイル” , “コピー先のフォルダ\新しいファイル名”」の形式で記載します。</p>
<p>以下のコードはDドライブにあるa.jpgというファイルをb.jpgの名前にしてEドライブにコピーします。</p>
<div class="VBACode">Sub ファイルをコピーするマクロ2()<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CopyFile &#8220;D:\a.jpg&#8221;, &#8220;E:\gazou\b.jpg&#8221;</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<p></p>
<p>ファイル名をワイルドカード（*）を用いて表すことで、複数のファイルを同時にコピーすることも可能です。<br />
以下のコードはDドライブにある全てのjpgファイルをEドライブにコピーするコードです。</p>
<div class="VBACode">Sub ファイルをコピーするマクロ3()<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.CopyFile &#8220;D:\*.jpg&#8221;, &#8220;E:\gazou\&#8221;</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<p></p>
<h3><span id="toc4">②ファイルの削除</span></h3>
<p>ファイルの削除は「FSO.DeleteFile “削除するファイル名”」の形式で記載します。<br />
以下のコードはDドライブのa.jpgのファイルを削除するものです。</p>
<div class="VBACode">
Sub ファイルを削除するマクロ1()<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.DeleteFile “D:\a.jpg”</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<p></p>
<p>ワイルドカード(*)を使用して複数のファイルを一気に削除することもできます。<br />
Dドライブのjpgのファイルを削除するコードは以下のようになります。</p>
<div class="VBACode">
Sub ファイルを削除するマクロ2()<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">FSO.DeleteFile “D:\*.jpg”</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<p></p>
<h3><span id="toc5">③ファイルが存在するか調べる</span></h3>
<p>ファイルが存在するか調べるコードは「FSO.FileExists(“存在するか調べるファイル名”)」で記述します。</p>
<p>主に条件分岐で、ファイルが存在する場合はある処理をして、ファイルが存在しない場合は別の処理をするなど処理を変える場合に使用します。<br />
FSO.FileExists(“存在するか調べるファイル名”)はファイルが存在する場合True、存在しない場合Falseという値になります。</p>
<p>以下のコードはDドライブにa.jpgというファイルが存在する場合、Eドライブにb.jpgとしてコピーし、存在しない場合は「a.jpgはありません」とメッセージを出すサンプルコードです。</p>
<div class="VBACode">
Sub ファイルがあるかどうか確認してコピーするマクロ1<br />
<br />
<span class="VBA_Tab1">Dim FSO As Object</span><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">If FSO.FileExists(“C:\a.jpg”) = True Then</span><br />
<span class="VBA_Tab2">FSO.CopyFile “C:\a.jpg” “D:\b.jpg”</span><br />
<span class="VBA_Tab1">ElseIf</span><br />
<span class="VBA_Tab2">Msgbox ” a.jpgはありません”</span><br />
<span class="VBA_Tab1">End If</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<br />
End Sub
</div>
<p></p>
<p>ファイルを作って処理してという流れをVBAで繰り返しているときにファイルがあるかどうかでの条件分岐はかなり使用頻度が高いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/fsofileoperation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBA（マクロ）でのFSO（FileSystemObject）の使い方</title>
		<link>https://officevba.info/filesystemobject/</link>
					<comments>https://officevba.info/filesystemobject/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Wed, 29 Jun 2016 02:47:29 +0000</pubDate>
				<category><![CDATA[ファイル・フォルダ操作]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=268</guid>

					<description><![CDATA[目次 FSO（FileSystemObject）とはFSO（FileSystemObject）を用いたコードを使う準備FSO（FileSystemObject）でできること FSO（FileSystemObject）とは [&#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">FSO（FileSystemObject）とは</a></li><li><a href="#toc2" tabindex="0">FSO（FileSystemObject）を用いたコードを使う準備</a></li><li><a href="#toc3" tabindex="0">FSO（FileSystemObject）でできること</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">FSO（FileSystemObject）とは</span></h2>
<p>FSO（FileSystemObject）とはドライブ、フォルダ、ファイルを操作するオブジェクトです。</p>
<p>すごく便利なコードでExcelの表と組み合わせて目的のファイル・フォルダの名前を編集したり、目的の場所にファイル・フォルダを移動したりが自在にできるようになります。またバックアップをとったりするのにも便利です。</p>
<h2><span id="toc2">FSO（FileSystemObject）を用いたコードを使う準備</span></h2>
<p>VBA（マクロ）でFSO（FileSystemObject）を使用するためには事前に「FileSystemObjectを使用します」とコードに記載する必要があります。<br />
「CreateObjectメソッドを実行してFileSystemObjectオブジェクトのインスタンスを作成する」と言われる準備ですが、その意味が分からなくても大丈夫です。要するに以下のコードを書けばよいということです。</p>
<div class="VBACode">
    Dim FSO As Object<br />
    Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)
</div>
<p></p>
<p>これを記載することでFSO（FileSystemObject）を使用する準備ができました。またVBAのコード終了前に以下のコードを書いた方が良いです。（なくても問題が起こることは少ないですが。）</p>
<div class="VBACode">
    Set FSO = Nothing
</div>
<p></p>
<h2><span id="toc3">FSO（FileSystemObject）でできること</span></h2>
<p>前回はFSO（FileSystemObject）を使うための準備について記載しました。<br />
ここではFSO（FileSystemObject）を用いてできることを列挙していきます。</p>
<p><a href="https://officevba.info/fsofileoperation/" target="_blank">(1)ファイルの操作</a><br />
<span style="padding:20px">①ファイルのコピー</span><br />
<span style="padding:20px">②ファイルの削除</span><br />
<span style="padding:20px">③ファイルが存在するか調べる</span></p>
<p><a href="https://officevba.info/fsofolderoperation/" target="_blank">(2)フォルダの操作</a><br />
<span style="padding:20px">①フォルダを作成する</span><br />
<span style="padding:20px">②フォルダのコピー</span><br />
<span style="padding:20px">③フォルダの削除</span><br />
<span style="padding:20px">④フォルダが存在するか調べる</span></p>
<p><a href="https://officevba.info/datecreated-datelastmodified/" target="_blank">(3)ファイルとフォルダの作成日・更新日の取得</a></p>
<p>これらのコードを用いて、Excelで作成した表の名前の通りにフォルダを作成したり、ファイル名を変更したりすることができます。<br />
具体的なコードの書き方とサンプルは次の記事で紹介します。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/filesystemobject/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
