VBAにおけるFileDialog/エクスプローラー操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します。
TIPS「FileSystemObjectを使うための準備――ファイル/フォルダをコピーするには」では、ファイルシステムへアクセスするメソッドなどを提供するFileSystemObjectやMicrosoft Scripting Runtimeの参照設定などを紹介したが、今回は、指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法について解説する。また、FileDialog/エクスプローラー操作の基本も紹介する。
- Driveオブジェクトを取得するFileSystemObject.GetDriveメソッド
- ドライブの総容量を取得するDrive.TotalSizeプロパティ
- ドライブの空き容量を取得するDrive.AvailableSpaceプロパティ
- エクスプローラーを表示するFileDialogメソッド
- FileDialogオブジェクトのプロパティやメソッドの使い方
- ファイルの属性の値を取得するFile.Attributesプロパティ
- ファイルの更新日時を取得するFile.DateLastModifiedプロパティ
- ファイルのサイズを取得するFile.Sizeプロパティ
指定したドライブの空き容量を取得する
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
Driveオブジェクトを取得するFileSystemObject.GetDriveメソッド
GetDriveでセルB1に入力されたDriveオブジェクトを取得する(6行目)。
ドライブの総容量を取得するDrive.TotalSizeプロパティ
ドライブの総容量を調べるには、TotalSizeプロパティを使う。ここでは、変数myToatalに指定されたドライブの総容量を格納している(7行目)。
ドライブの空き容量を取得するDrive.AvailableSpaceプロパティ
ドライブの空き容量を調べるには、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
エクスプローラーを表示するApplication.FileDialogプロパティ
エクスプローラーを表示するにはFileDialogプロパティを使う。書式は下記の通りだ。
FileDialogプロパティの書式
Application.FileDialog({fileDialogType})
{fileDialogType}にはファイルのダイアログの種類を指定する(表1)。
定数 | 属性 |
---|---|
msoFileDialogFilePicker | ユーザーがファイルを選択できる |
msoFileDialogFolderPicker | ユーザーがフォルダを選択できる |
msoFileDialogOpen | ユーザーがファイルを開くことができる |
msoFileDialogSaveAs | ユーザーがファイルを保存できる |
今回は、msoFileDialogFolderPickerを使って、ユーザーがファイルを選択できるようにする(8行目)。
FileDialogオブジェクトのプロパティやメソッドの使い方
9〜12行目で、FileDialogオブジェクトのプロパティやメソッドを下記のようにそれぞれ使っている。
Titleプロパティには、ダイアログに表示するタイトルを指定する(9行目)。
AllowMultiSelectプロパティには、複数のファイルを同時に選択するかどうかをTrueとFalseで指定する(10行目)。複数選択の場合はTrue、そうでない場合はFalseを指定する。今回は、複数選択は不可としている。
Showメソッドでダイアログを表示する(11行目)。
E2のセルに選択したファイル名をフルパスで表示する(12行目)。「SelectedItems(1)」で選択したファイル名がフルパスで表示される。SelectedItemsがコレクションなのは、AllowMultiSelectプロパティをTrueにすることで、ファイルを複数選択することもあるからだ。SelectedItemsのインデックスは1から始まる。
ファイルの属性の値を取得するFile.Attributesプロパティ
変数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行目)。
ファイルの更新日時を取得するFile.DateLastModifiedプロパティ
セルE4には、DateLastModifiedプロパティで更新日時を表示する(44行目)。
ファイルのサイズを取得するFile.Sizeプロパティ
セル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.
関連記事
- どんなビジネスにも欠かせないリレーショナルデータベースの基礎知識と作り方――テーブル、レコード、フィールド、主キーとは
Accessを通じて、初心者がリレーショナルデータベースやSQLの基本を学び、データベースを使った簡単なシステムの作り方を習得する本連載。初回はデータベースの基本を理解し、Accessを使い始めてみよう。 - スクショをExcelに張り付けるのに役立つ4つのテクニック
システム開発におけるソフトウェアテスト(結合テスト〜システムテスト)において重要視されるエビデンス(作業記録)。前後編の2回にわたって、エビデンスとしてスクリーンショットをキャプチャし、テスト仕様書や納品書に張り付けていく作業を自動化するためのVBA/マクロのテクニックを紹介する。後編は、画像ファイルをシートに張り付け、Excel 2013のメニューからスクショを直に張り付け、画像を縮小し、指定した時間にマクロを実行する方法を解説。 - [Esc]キーによるExcel VBAの実行中断を防止する
ExcelではVBA(Visual Basic for Applications)によってさまざまな処理を自動的に実行できる。しかし、VBAの実行中にユーザーが[Esc]キーあるいは[Ctrl]+[Break]キーを押すと、自動処理が止まってしまう。止めたくない場合は、Application.EnableCancelKeyプロパティの設定を変更する。 - Windows TIPSディレクトリ > プラットフォーム別 > Office > Excel