業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します。
TIPS「FileSystemObjectを使うための準備――ファイル/フォルダをコピーするには」では、ファイルシステムへアクセスするメソッドなどを提供するFileSystemObjectやMicrosoft Scripting Runtimeの参照設定などを紹介したが、今回は、指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法について解説する。また、FileDialog/エクスプローラー操作の基本も紹介する。
Excelのシート上に図1のような項目を作り、「実行」ボタンをクリックすると、指定したドライブの使用容量、空き容量、合計の容量が表示されるようにしてみる。
これを実現するコードは、リスト1のようになるだろう。
Sub 指定したドライブの容量を調べる() Dim fso As New Scripting.FileSystemObject Dim myTotal As Variant Dim mySpace As Variant With fso.GetDrive(Range("B1").Value) myTotal = .TotalSize mySpace = .AvailableSpace End With Range("B2").Value = Format(myTotal - mySpace, "#,##0") Range("B3").Value = Format(mySpace, "#,##0") Range("B4").Value = Format(myTotal, "#,##0") Set fso=Nothing End Sub
GetDriveでセルB1に入力されたDriveオブジェクトを取得する(6行目)。
ドライブの総容量を調べるには、TotalSizeプロパティを使う。ここでは、変数myToatalに指定されたドライブの総容量を格納している(7行目)。
ドライブの空き容量を調べるには、DriveオブジェクトのAvailableSpaceプロパティを使う。ここでは、変数mySpaceに指定されたドライブの空き容量を格納している(8行目)。
Format関数でセルB2に、総容量から空き容量を差し引いた使用容量を3桁区切りで表示する(11行目)。同じく、セルB3には3桁区切りで空き容量を表示する(12行目)。セルB4には3桁区切りで総容量を表示する(13行目)。
図1の「実行」ボタンにはリスト1の「指定したドライブの容量を調べる」というマクロを関連付け実行すると、図2のような表示になる。
対象ドライブには存在するドライブであれば「K」でも「K:\」と入力しても構わない。ただし、ドライブ以外の値が入力されればエラーになる。エラー処理は行っていないので、各自が追加してみてほしい。
ファイルのタイムスタンプや属性を取得する方法を紹介しよう。ここからはSheet2に表示するので、Sheet2を追加しておいてほしい。Sheet2に図3のような表示項目と欄を作っておく。「エクスプローラーの表示」ボタンも配置しておこう。
ボタンをクリックすると、エクスプローラーが表示されて、ドライブやファイルの選択が可能になる。任意のファイルを選択して「開く」ボタンをクリックすると、Sheet2のセルの指定した位置に、ファイル名とその属性が表示される。「開く」ボタンをクリックするとエクスプローラーは終了するので、再度ファイルを選択する場合はエクスプローラーの表示ボタンをクリックする必要がある。
これを実現するコードは、リスト2のようになるだろう。
Sub エクスプローラーを開く() Dim fso As New Scripting.FileSystemObject Dim myFile As File Dim myFileName As String Dim myAttri As Integer Dim i As Integer Dim msg As String With Application.FileDialog(msoFileDialogFilePicker) .Title = "ファイルを選択" .AllowMultiSelect = False .Show Sheet2.Range("E2").Value = .SelectedItems(1) End With myFileName = Range("E2").Value Set myFile = fso.GetFile(myFileName) myAttri = myFile.Attributes If (myAttri And vbNormal) <> 0 Then msg = "標準ファイル" End If If (myAttri And vbReadOnly) <> 0 Then msg = "読み取り専用ファイル" End If If (myAttri And vbHidden) <> 0 Then msg = "隠しファイル" End If If (myAttri And vbSystem) <> 0 Then msg = "システムファイル" End If If (myAttri And vbDirectory) <> 0 Then msg = "フォルダ" End If If (myAttri And vbArchive) <> 0 Then msg = "アーカイブファイル" End If Sheet2.Range("E3").Value = msg Sheet2.Range("E4").Value = myFile.DateLastModified Sheet2.Range("E5").Value = myFile.Size & "バイト" Set myFile = Nothing Set fso = Nothing End Sub
エクスプローラーを表示するにはFileDialogプロパティを使う。書式は下記の通りだ。
Application.FileDialog({fileDialogType})
{fileDialogType}にはファイルのダイアログの種類を指定する(表1)。
定数 | 属性 |
---|---|
msoFileDialogFilePicker | ユーザーがファイルを選択できる |
msoFileDialogFolderPicker | ユーザーがフォルダを選択できる |
msoFileDialogOpen | ユーザーがファイルを開くことができる |
msoFileDialogSaveAs | ユーザーがファイルを保存できる |
今回は、msoFileDialogFolderPickerを使って、ユーザーがファイルを選択できるようにする(8行目)。
9〜12行目で、FileDialogオブジェクトのプロパティやメソッドを下記のようにそれぞれ使っている。
Titleプロパティには、ダイアログに表示するタイトルを指定する(9行目)。
AllowMultiSelectプロパティには、複数のファイルを同時に選択するかどうかをTrueとFalseで指定する(10行目)。複数選択の場合はTrue、そうでない場合はFalseを指定する。今回は、複数選択は不可としている。
Showメソッドでダイアログを表示する(11行目)。
E2のセルに選択したファイル名をフルパスで表示する(12行目)。「SelectedItems(1)」で選択したファイル名がフルパスで表示される。SelectedItemsがコレクションなのは、AllowMultiSelectプロパティをTrueにすることで、ファイルを複数選択することもあるからだ。SelectedItemsのインデックスは1から始まる。
変数myFileNameにセルE2の値を格納する(15行目)。GetFileメソッドで指定したファイルを取得して変数myFileにセットしておく(16行目)。
変数myAttriには、Attributesプロパティで、指定したファイルの属性の値を格納しておく(17行目)。
19〜41行目では、取得した属性の値で、変数msgに属性名を格納している。
属性には表2のような値が用意されている。
定数 | 値 | 属性 |
---|---|---|
vbNormal | 0 | 通常ファイル |
vbReadOnly | 1 | 読み込み専用ファイル |
vbHidden | 2 | 隠しファイル |
vbSystem | 4 | システムファイル |
vbDirectory | 16 | フォルダ |
vbArchive | 32 | アーカイブ |
属性を調べる場合は、例えば19〜21行目のように、And演算子を使ってビット単位比較を行う必要がある。これは「If myAttri = vbNormal Then」と記述してもよさそうに思えるが、これでは属性がちゃんと表示されないので、注意してほしい。
表示されない原因は、「通常ファイル」は「アーカイブ」属性も持っていたり、「隠しファイル」なども、「アーカイブ」属性を持っていたりするからだ。上記のように記述するとエラーは表示されないが、属性が「通常ファイル」だけと限定されてしまい、「アーカイブ」属性も含んでいるのに属性が全て表示されないことになってしまう。
AND演算子を使ってビット単位の比較についての詳細な説明は下記のリンクを参照してほしい。
セルE3には属性の種類を表示する(43行目)。
セルE4には、DateLastModifiedプロパティで更新日時を表示する(44行目)。
セルE5には、Sizeプロパティを使い、ファイルのサイズをバイト単位で表示する(45行目)。
エクスプローラーの表示ボタンをクリックして実行すると図4のような表示になる。
薬師寺国安事務所代表。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 © ITmedia, Inc. All Rights Reserved.