Excelスキルアップコレクション
           〜 Something U Want 〜


Google  

WWW を検索
Excelスキルアップコレクション内 を検索
 @     Top  >     Excel VBA スキルアップコレクション Topics  >     (18) ファイル操作をWin32 API を利用して高度に実現する

 
(18) ファイル操作をWin32 API を利用して高度に実現する

 VBAからWin32 APIを利用したファイル操作を紹介します。API とは「Application Programming Interfaces」のことで、これを利用することでアプリケーションからOSを操作することができます。

 ファイルのコピーや削除と言った処理は、fileCopy、Killを利用することで実現できますし、FileSystemObjectの各種メソッドを利用して実現することもできるので、わざわざWin32 APIを使わなくても目的は果たせます。しかし、Win32 APIを使うことで、例えば、ファイルをコピーする時にファイルがコピー中であることを表現するプログレスバーを表示させたり、ファイルを削除する時に、ゴミ箱へファイルを移動させるなど、大変便利なユーザインターフェースを簡単に流用できるようになります。
<コピー中のプログレスバー>

<ファイルをゴミ箱へ移動>


 下記サンプルコードは、Win32 APIを利用したファイル操作に必要な定義と、フォルダ「C:\Sample」配下に存在する全ファイルをフォルダ「C:\Sample2」にコピーする処理のサンプルです。定義に関するプログラムコードは1行目〜46行目、それ以外のプログラムコードがファイルコピーに関するものです。

 1行目:  Option Explicit
 2行目:  
 3行目:  ' *
 4行目:  ' * ファイル操作
 5行目:  ' *
 6行目:  Declare Function SHFileOperation Lib "SHELL32.DLL" ( _
 7行目:        pShfileopstruct As Shfileopstruct _
 8行目:  ) As Long
 9行目:  
10行目:  ' *
11行目:  ' * ファイル操作内容定数
12行目:  ' *
13行目:  Public Const FO_MOVE = &H1&                ' ファイル移動
14行目:  Public Const FO_COPY = &H2&                ' ファイルコピー
15行目:  Public Const FO_DELETE = &H3&              ' ファイル削除
16行目:  Public Const FO_RENAME = &H4&              ' ファイル名称変更
17行目:  
18行目:  ' *
19行目:  ' * 動作内容定数
20行目:  ' *
21行目:  Public Const FOF_MULTIDESTFILES = &H1&     ' 操作対象ファイル複数指定
22行目:  Public Const FOF_CONFIRMMOUSE = &H2&       ' (使用できない)
23行目:  Public Const FOF_SILENT = &H4&             ' プログレスバー非表示
24行目:  Public Const FOF_RENAMEONCOLLISION = &H8&  ' 操作結果ファイルの重複名回避
25行目:  Public Const FOF_NOCONFIRMATION = &H10&    ' 確認ダイアログ ALL OK
26行目:  Public Const FOF_WANTMAPPINGHANDLE = &H20& ' hNameMappingsにマッピング情報を格納
27行目:  Public Const FOF_ALLOWUNDO = &H40&         ' ごみ箱指定
28行目:  Public Const FOF_FILESONLY = &H80&         ' ワイルドカード指定のみの操作
29行目:  Public Const FOF_SIMPLEPROGRESS = &H100&   ' プログレスバー中にファイル名非表示
30行目:  Public Const FOF_NOCONFIRMMKDIR = &H200&   ' フォルダ作成確認無し
31行目:  Public Const FOF_NOERRORUI = &H400&        ' エラーが発生時のダイアログ無し
32行目:  Public Const FOF_NORECURSION = &H800&      ' サブフォルダ再帰的処理無し
33行目:  
34行目:  ' *
35行目:  ' * ファイル操作に関しての情報をまとめる構造体
36行目:  ' *
37行目:  Public Type Shfileopstruct
38行目:      hwnd As Long                           ' ウィンドウのハンドル
39行目:      wFunc As Long                          ' ファイル操作
40行目:      pFrom As String                        ' 操作対象ファイル
41行目:      pTo As String                          ' 操作結果ファイル
42行目:      fFlags As Integer                      ' 動作内容
43行目:      fAnyOperationsAborted As Long          ' 処理結果
44行目:      hNameMappings As Long                  ' ファイル名マッピング
45行目:      lpszProgressTitle As String            ' タイトル
46行目:  End Type
47行目:  
48行目:  Public Sub Sample_SHFileOperationCopy_01()
49行目:  
50行目:      ' ファイル操作に関しての情報を決める。
51行目:      Dim wShfileopstruct As Shfileopstruct
52行目:      With wShfileopstruct
53行目:          
54行目:          ' ウィンドウのハンドルは0で構わない。
55行目:          .hwnd = 0
56行目:  
57行目:          ' 操作内容を決める。ここでは「コピー」とする。
58行目:          .wFunc = &H2&
59行目:  
60行目:          ' コピー元ファイルを指定する。
61行目:          .pFrom = "C:\Sample\*.*"
62行目:  
63行目:          ' コピー先ファイルを指定する。
64行目:          .pTo = "C:\Sample2"
65行目:          
66行目:          ' 動作内容を決める。
67行目:          ' "動作内容定数"を好みでどんどん足し込んで指定します。
68行目:          .fFlags = FOF_FILESONLY + FOF_RENAMEONCOLLISION
69行目:  
70行目:      End With
71行目:  
72行目:      'ファイル処理を実行する。
73行目:      Dim ret As Long
74行目:      ret = SHFileOperation(wShfileopstruct)
75行目:  
76行目:  End Sub
 適当にフォルダ「C:\Sample」を作成し、フォルダの中にファイルやサブフォルダを作成します。
 Sample_SHFileOperationCopy_01() を実行してみて下さい。この時、コピー先のフォルダ「C:\Sample2」がない場合、以下のようなメッセージが出力されます。
 ここで[はい(Y)] ボタンをクリックすると、フォルダ「C:\Sample2」が作成してからコピー処理が実行されます。

  [いいえ(N)] ボタンをクリックするとコピー処理は中断します。
 ここで、サブフォルダはコピーされずファイルのみコピーされたのは、68行目にて「FOF_FILESONLY」を指定しているからです。
 わざわざフォルダの作成を問いかけてこないプログラムに変更したい場合は、68行目に「FOF_NOCONFIRMMKDIR」を追加して、フォルダの作成確認を抑止できます。

…
68行目:          .fFlags = FOF_FILESONLY + FOF_RENAMEONCOLLISION + FOF_NOCONFIRMMKDIR
 …
 次に、ファイルをゴミ箱に移動するサンプルを紹介します。プログラムコードの77行目以降に以下のコードを追加し、Sample_SHFileOperationDelete_01()を用意して下さい。

 77行目:  
 78行目:  Public Sub Sample_SHFileOperationDelete_01()
 79行目:  
 80行目:      ' ファイル操作に関しての情報を決める。
 81行目:      Dim wShfileopstruct As Shfileopstruct
 82行目:      With wShfileopstruct
 83行目:          
 84行目:          ' ウィンドウのハンドルは0で構わない。
 85行目:          .hwnd = 0
 86行目:  
 87行目:          ' 操作内容を決める。ここでは「削除」とする。
 88行目:          .wFunc = &H3&
 89行目:  
 90行目:          ' 削除ファイルを指定する。
 91行目:          .pFrom = "C:\Sample\*.*"
 92行目:          
 93行目:          ' 動作内容を決める。
 94行目:          ' "動作内容定数"を好みでどんどん足し込んで指定します。
 95行目:          .fFlags = FOF_FILESONLY + FOF_ALLOWUNDO
 96行目:  
 97行目:      End With
 98行目:  
 99行目:      'ファイル処理を実行する。
100行目:      Dim ret As Long
101行目:      ret = SHFileOperation(wShfileopstruct)
102行目:  
103行目:  End Sub
 Sample_SHFileOperationDelete_01() を実行してみて下さい。この時、ファイルをゴミ箱に移動するか否かを確認するメッセージが表示されます。
 ここで[はい(Y)] ボタンをクリックすると、ファイルの削除が実行されます。

  [いいえ(N)] ボタンをクリックすると削除処理は中断します
 ここで、サブフォルダは削除されなかったのは、95行目にて「FOF_FILESONLY」を指定しているからです。
 サブフォルダもゴミ箱に移動するプログラムに変更したい場合は、68行目の「FOF_FILESONLY」を削除するだけです。

 …
95行目:          .fFlags = FOF_ALLOWUNDO
 …
ページの先頭へ