連載
» 2017年03月14日 05時00分 UPDATE

VBA/マクロ便利Tips:FileSystemObjectを使うための準備――ファイル/フォルダをコピーするには

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、ファイルシステムへアクセスするメソッドなどを提供するFileSystemObject、ファイルをコピーするCopyFile、フォルダをコピーするCopyFolderメソッドなどについて。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 10 64bit+Anniversary Update、Excel 2016


 今回から数回にわたって、Excel VBAでFileSystemObjectを使うTipsを紹介する。

 FileSystemObjectとは、ファイルシステムへアクセスするメソッドなどを提供するオブジェクトのことだ。

 初めはFileSystemObjectをExcel VBAの中で使用するには、どういった方法があるかについて解説する。

 通常Excel VBAでFileSystemObjectを使用する場合は下記のように記述する(リスト1)。

Dim fso As Object
Set fso=CreateObject(“Scripting.FileSystemObject”)
リスト1

 このように、CreateObject関数を使用して引数に指定したActiveXオブジェクト(この場合はFileSystemObject)を使いたい場合に使用する。

 この方法でも特に問題はないのだが、自動メンバー表示(インテリセンス)が使用できないという欠点がある。自分でメソッドやプロパティを記憶している方ならいいが、そうでない方にはなかなか使いづらいのではないだろうか。

 それでは、自動メンバー表示を行うには、どのようにすればいいのかを解説しよう。

Microsoft Scripting Runtimeの参照設定を行う

 VBE(Visual Basic Editor)を起動して、メニューから「ツール→参照設定」とたどり、「参照可能なライブラリファイル」から「Microsoft Scripting Runtime」にチェックを付けて「OK」ボタンをクリックする(図1)。

図1 参照設定から「Microsoft Scripting Runtime」にチェックを付ける

 では、これで自動メンバー表示が行われるか試してみよう。記述方法は下記のようになる(リスト2)。

Dim fso As New Scripting.FileSystemObject
リスト2

 Scripting.FileSystemObjectの新しいインスタンスを作成する。「挿入」メニューから「標準モジュール」を選択して、Module1を作成する。

 図2のように入力すると、表示が行われているのが分かるだろう。

図2 自動メンバー表示が行われた

 試しに、図1の参照設定を外して、リスト1のように記述してみよう。図2とは違って、fso.の後に表示が行われない(図3)。

図3 表示が行われない

 これでは不便なので、今後は参照設定を行って、リスト2の書き方で進めていく。

ファイルをコピーするCopyFileメソッド

 では、実際にFileSystemObjectを使った各操作を行ってみよう。最初はテキストファイルのコピーからだ。

 今回使用するテキストファイルはメモ帳で作成して、UTF-8で保存した。リスト3のような内容の「FileSystemObject_SourceFile.txt」というファイルだ。

これはExcel VBAでFileSystemObjectを使った
テキストファイルコピー用のファイルです。
作成年月日:2017年2月1日
薬師寺国安事務所
薬師寺国安
リスト3 コピーする「FileSystemObject_SourceFile.txt」の内容

 このファイルを指定したフォルダにコピーするには、CopyFileメソッドを使用する。

 CopyFileの書式は下記の通りだ。

ファイルをコピーするCopyFileメソッドの書式

{fso}.CopyFile {source},{destination}


 {fso}にはFileSystemObjectの名前を指定する。

 {source}は必須だ。コピー元のファイル名を、パスを含めて表す文字列を指定する。

 {destination}も必須だ。コピー先のパスを表す文字列を指定する。

 fso.と入力すると自動メンバーが表示されてCopyFileの選択が可能になる(図4)。

図4 自動メンバーが表示された

 VBEを起動して新しいモジュールを作成し、リスト4のコードを入力する。

Sub FileCopy()
  Dim sourceFile As String
  Dim copyToFolder As String
  Dim fso As New Scripting.FileSystemObject
  sourceFile = "J:\ExcelVBA_FileSystemObject_Files\FileSystemObject_SourceFile.txt"
  copyToFolder = "K:\ExcelVBA_TextFiles\"
  fso.CopyFile sourceFile, copyToFolder
  Set fso=Nothing
End Sub
リスト4 テキストファイルをコピーするコード

 文字列型の「sourceFile」「copyToFolder」変数を宣言する(2〜3行目)。

 Scripting.FileSystemObjectのインスタンスを作成し、変数fsoで参照する(4行目)。

 コピー元のファイルである「J:\ExcelVBA_FileSystemObject_Files\FileSystemObject_SourceFile.txt」を変数sourceFileに格納する(5行目)。

 コピー先のフォルダである「K:\ExcelVBA_TextFiles\」を変数copyToFolderに格納する(6行目)。

 fsoオブジェクトのCopyFileメソッドで、コピー元のファイルと、コピー先のフォルダを指定してコピーする(7行目)。

 最後に、オブジェクトの変数をNothingでクリアしておく(8行目)。

 実行するとコピー先の「K:\ExcelVBA_TextFiles\」フォルダに「FileSystemObject_SourceFile.txt」がコピーされている(図5)。

図5 指定したフォルダにファイルがコピーされた

フォルダをコピーするCopyFolderメソッド

 次は、フォルダのコピーについて見ていこう。CopyFolderメソッドを使用する。

フォルダをコピーするCopyFolderメソッドの書式

{fso}.CopyFolder {source},{destination}


 {fso}にはFileSystemObjectの名前を指定する。

 {source}は必須だ。コピー元のフォルダ名を、パスを含めて表す文字列を指定する。ワイルドカードの使用も可能だ。

 {destination}は必須だ。コピー先のパスを文字列で指定する。

 使い方としては、リスト5のコードのようにする。

Sub FolderCopy()
  Dim fso As New Scripting.FileSystemObject
  fso.CopyFolder "K:\ExcelVBA_TextFiles", "K:\ExcelVBA_Test\"
  Set fso = Nothing
End Sub
リスト5 フォルダ内のファイルもサブフォルダも全てコピーするコード

 Scripting.FileSystemObjectのインスタンスを作成し、変数fsoで参照する(2行目)。

 CopyFolderメソッドで、コピー元のフォルダをコピー先のフォルダにコピーする(3行目)。この場合は、コピー元は「K:\ExcelVBA_TextFiles」フォルダで、フォルダの中には、先にコピーしたテキストファイルと「backup」というサブフォルダが存在している。

 コピー元のフォルダには最後に「\」を付けてはならないので注意しよう。コピー先は、あらかじめ作成しておいた「K:\ExcelVBA_Test\」フォルダになる。この場合は最後に\が必要だ。

 最後に、Nothingでオブジェクト変数をクリアする(4行目)。

 実行すると、図6のように、「K:\ExcelVBA_Test\」フォルダ内に、「ExcelVBA_TextFiles」のフォルダと中にあるテキストファイルとサブフォルダがコピーされている。

図6 指定したフォルダがコピーされた

次回は、テキストファイルの作成・削除など

 今回は以上で終わりだ。FileSystemObjectを参照設定しておくと、自動メンバー表示が行われて便利だ。また、テキストファイルを指定したフォルダへコピーする方法とフォルダ自体のコピーについても解説した。今回使用したフォルダやテキストファイルはあらかじめ事前に作成しておく必要があることを忘れないでほしい。

 ファイルのコピーやフォルダのコピーは日常の業務にも多々出てくるのではないだろうか。その場合は、シート上に入力欄などを作成し、どのファイルやフォルダをどこにコピーするかを入力して、ボタンクリックでコピーできるUIを作成しておけば、作業効率も上がるのではないだろうか。ぜひ各自が試してみてほしい。

 次回は「フォルダを作成してテキストファイルを作成する」「ファイルの削除」「フォルダの削除」の方法を解説する。お楽しみに。

著者紹介

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。

1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。

1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。

2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。

Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。

Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。

Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。

Microsoft MVP for Development Platforms - Windows Platform Development (Oct 2014-Sep 2015)。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。