VBAにおけるFileDialog/エクスプローラー操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します。

» 2017年07月10日 05時00分 公開
[薬師寺国安PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

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


 TIPS「FileSystemObjectを使うための準備――ファイル/フォルダをコピーするには」では、ファイルシステムへアクセスするメソッドなどを提供するFileSystemObjectやMicrosoft Scripting Runtimeの参照設定などを紹介したが、今回は、指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法について解説する。また、FileDialog/エクスプローラー操作の基本も紹介する。

指定したドライブの空き容量を取得する

 Excelのシート上に図1のような項目を作り、「実行」ボタンをクリックすると、指定したドライブの使用容量、空き容量、合計の容量が表示されるようにしてみる。

図1 Excelのシート上に作成した、入力欄と表示覧

 これを実現するコードは、リスト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
リスト1 指定したドライブの使用容量、空き容量、総容量を調べるコード

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:\」と入力しても構わない。ただし、ドライブ以外の値が入力されればエラーになる。エラー処理は行っていないので、各自が追加してみてほしい。

図2 「K:\」に関するディスクの容量が表示された

エクスプローラーを使って、ファイルのタイムスタンプや属性を取得する

 ファイルのタイムスタンプや属性を取得する方法を紹介しよう。ここからはSheet2に表示するので、Sheet2を追加しておいてほしい。Sheet2に図3のような表示項目と欄を作っておく。「エクスプローラーの表示」ボタンも配置しておこう。

図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
リスト2 エクスプローラーを使って、ファイルのタイムスタンプや属性を取得するコード

エクスプローラーを表示するApplication.FileDialogプロパティ

 エクスプローラーを表示するにはFileDialogプロパティを使う。書式は下記の通りだ。

FileDialogプロパティの書式

Application.FileDialog({fileDialogType})


 {fileDialogType}にはファイルのダイアログの種類を指定する(表1)。

表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のような値が用意されている。

表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のような表示になる。

図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.

RSSについて

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

メールマガジン登録

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