Excel VBAでオブジェクト指向プログラミング(GetDetailsOf編)
■GetDetailsOfメソッドを利用したExcelツール
ファイルの情報を表示するツールを作りたい場合、基本的な情報であればFileSystemObject(FSO)(※)で取得可能ですが、GetDetailsOfメソッドを利用すると、より多くの情報を取得できます。
GetDetailsOfメソッドは、Shellオブジェクトの下位オブジェクト(サブクラス)である、Folderオブジェクトに実装されたメソッドの1つです。
(※)FSOの詳細については、Excel VBAでオブジェクト指向プログラミング(FSO編)を参照して下さい。
■Shellオブジェクトとは
ShellオブジェクトはMicrosoftから提供されている、Windowsシェルを利用するためのオブジェクトで、さまざまな下位オブジェクト(サブクラス)やメソッドがありますが、本稿ではShellオブジェクトとFolderオブジェクトに絞って説明します。
⇒詳細はMicrosoftのサイト(Shell(シェル)オブジェクト)を参照して下さい。
Shellオブジェクトのメソッド
Shellオブジェクトで提供されているメソッドは、下表の通りです。
項目 | 説明 |
---|---|
AddToRecentメソッド | 最近使用した(MRU) リストにファイルを追加する |
BrowseForFolderメソッド | フォルダを選択するダイアログボックスを作成する |
CanStartStopServiceメソッド | サービスを開始/停止できるかどうか判断する |
CascadeWindowsメソッド | 全てのウィンドウをカスケードする |
ControlPanelItemメソッド | コントロールパネルアプリケーションを実行する |
EjectPCメソッド | ドッキングステーションからコンピュータを取出す |
Exploreメソッド | フォルダをエクスプローラウィンドウで開く |
ExplorerPolicyメソッド | Internet Explorerポリシーの値を取得する |
FileRunメソッド | [実行]ダイアログボックスを表示する |
FindComputerメソッド | [検索:コンピュータ]ダイアログボックスを表示する |
FindFilesメソッド | [検索:すべてのファイル]ダイアログボックスを表示する |
FindPrinterメソッド | [プリンタの検索]ダイアログボックスを表示する |
GetSettingメソッド | グローバルシェル設定を取得する |
GetSystemInformationメソッド | システム情報を取得する |
Helpメソッド | ヘルプとサポートセンタを表示する |
IsRestrictedメソッド | グループの制限設定をレジストリから取得する |
IsServiceRunningメソッド | サービスが実行されているかどうかを返す |
MinimizeAllメソッド | 全てのウィンドウを最小化する |
NameSpaceメソッド | Folderオブジェクトを作成して返す |
Openメソッド | 指定したフォルダを開く |
RefreshMenuメソッド | [スタート]メニューの内容を更新する |
ServiceStartメソッド | サービスを開始する |
ServiceStopメソッド | サービスを停止する |
SetTimeメソッド | [日付と時刻のプロパティ]ダイアログボックスを表示する |
ShellExecuteメソッド | 指定されたファイルを実行する |
ShowBrowserBarメソッド | ブラウザーバーを表示する |
ShutdownWindowsメソッド | [Windowsのシャットダウン]ダイアログボックスを表示する |
Suspendメソッド | (実装されていない) |
TileHorizontallyメソッド | 全てのウィンドウを水平方向に並べる |
TileVerticallyメソッド | 全てのウィンドウを垂直方向に並べる |
ToggleDesktopメソッド | デスクトップを表示または非表示にする |
TrayPropertiesメソッド | [タスクバーとスタートメニューのプロパティ]ダイアログボックスを表示する |
UndoMinimizeALLメソッド | 全てのウィンドウをMinimizeAllメソッド実行前の状態に復元する |
Windowsメソッド | ShellWindowsオブジェクトを作成して返す |
WindowsSecurityメソッド | [新しいWindowsセキュリティ]ダイアログ ボックスを表示する |
WindowSwitcherメソッド | 開いているウィンドウを3Dスタックに表示する |
Folderオブジェクトのメソッド
Folderオブジェクトは、ShellオブジェクトのNameSpaceメソッドを使用し、「shell.NameSpace(フォルダのパス)」のようにして作成します。
Folderオブジェクトで提供されているメソッドは、下表の通りです。
項目 | 説明 |
---|---|
CopyHereメソッド | アイテムをフォルダにコピーする |
GetDetailsOfメソッド | アイテムに関する詳細情報を取得する |
Itemsメソッド | Folderitemsコレクションを返す |
MoveHereメソッド | アイテムをフォルダに移動する |
NewFolderメソッド | 新しいフォルダを作成する |
ParseNameメソッド | FolderItemオブジェクトを作成して返す |
GetDetailsOfメソッドを使用するための事前準備
GetDetailsOfメソッドを使用するための事前準備は、以下の3ステップです。
⇒オブジェクトを使用するための事前準備とオブジェクトブラウザによる調査方法については、Excel VBAでオブジェクト指向プログラミング(事前準備編)を参照して下さい。
①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログでMicrosoft Shell Controls And Automationのチェックボックスにチェックを入れ、[OK]ボタンを押下。
②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。
- Dim shell, folder As Object
③インスタンスの生成
プログラムの処理部でインスタンスを生成。
- Set shell = New Shell32.shell
- Set folder = shell.Namespace(“C:\work")
- 'ここにGetDetailsOfメソッドを使用した処理を記述
- Set folder = Nothing
- Set shell = Nothing
(参考)「Set shell = New Shell32.shell」の部分を「Set shell = CreateObject(“Shell.Application")」と記述すれば、ステップ①(ライブラリの参照設定)は不要です。
GetDetailsOfメソッドの使用方法
GetDetailsOfメソッドの書式
GetDetailsOfメソッドは以下のように定義されていますので、アイテム(ファイル)とiColumn番号を引数として「folder.GetDetailsOf(vItem, iColumn)」のように記述すれば、結果を文字列型で受け取ることができます。
引数の詳細ついては、次項で説明します。
- Function GetDetailsOf(vItem, iColumn As Long) As String
vItem引数
vItem引数は情報を取得したいファイルを指定する引数ですが、FolderItemオブジェクトを指定する必要があるため、FolderオブジェクトのParseNameメソッドを使用して「folder.ParseName(ファイル名)」のように指定します。
なお、vItem引数に空値を指定すると、iCulumn番号に対応する項目名を取得できます。
iColumn引数
iColumn引数には、取得したい情報のiColumn番号を整数で指定します。
MicrosoftのサイトでiColumn番号について調べてみると、「シェルビューに表示される0から始まる列番号」というように説明されています。
エクスプローラでファイルの一覧を表示している時、ファイルメニューから[表示]-[詳細表示の設定]を指定すると、表示する項目を選択することができますが、あの項目を指定するための番号がiColumn番号です。
なお、Windowsのバージョンアップに伴って項目が増えているため、Windowsのバージョンによって対応するiColumn番号が異なります。
使用しているWindowsのiColumn番号を一覧表示するExcelツール
行番号11でvItem引数に空値を指定してGetDetailsOfメソッドを実行し、iCulumn番号に対応する項目名を取得しています。
- Dim sht, shell, folder As Object
- Dim i As Integer
- Private Sub Sample1()
- Set sht = ActiveSheet
- Set shell = New Shell32.shell
- Set folder = shell.Namespace(“C:\work")
- sht.Cells.Clear
- For i = 0 To 511
- sht.Cells(i + 1, 1) = i
- sht.Cells(i + 1, 2) = folder.GetDetailsOf(“", i)
- Next i
- Set folder = Nothing
- Set shell = Nothing
- End Sub
指定したフォルダの直下にある音楽ファイルの一覧を表示するExcelツール
指定したフォルダの直下にあるファイルのうち、音楽ファイル(ここでは拡張子がmp3,m4a,wmaのファイル)について、「アルバム名」「トラック番号」「アーティスト名」「曲名」を一覧にして表示するツールです。
⇒このプログラムを作成した環境はWindows10ですので、各項目のiColumn番号は14,26,13,21になります。
行番号12のFor Eachでは、FolderオブジェクトのItemsメソッドでFolderItemsコレクションを取得し、そのコレクションからFolderItemオブジェクト(ファイル)を取得しています。
また、行番号19~22ではGetDetailsOfメソッドを使用して、「アルバム名」「トラック番号」「アーティスト名」「曲名」を取得しています。
- Dim sht, shell, folder, item As Object
- Dim ext As String
- Dim pos, cnt As Integer
- Private Sub Sample2()
- Set sht = ActiveSheet
- Set shell = New Shell32.shell
- Set folder = shell.Namespace(“C:\work")
- sht.Cells.Clear
- cnt = 0
- For Each item In folder.Items
- pos = InStrRev(item.Name, “.")
- If pos > 0 Then
- ext = LCase(Mid(item.Name, pos + 1))
- If (ext = “mp3") Or (ext = “m4a") Or (ext = “wma") Then
- cnt = cnt + 1
- sht.Cells(cnt, 1) = item.Name
- sht.Cells(cnt, 2) = folder.GetDetailsOf(folder.ParseName(item.Name), 14)
- sht.Cells(cnt, 3) = folder.GetDetailsOf(folder.ParseName(item.Name), 26)
- sht.Cells(cnt, 4) = folder.GetDetailsOf(folder.ParseName(item.Name), 13)
- sht.Cells(cnt, 5) = folder.GetDetailsOf(folder.ParseName(item.Name), 21)
- End If
- End If
- Next item
- Set item = Nothing
- Set folder = Nothing
- Set shell = Nothing
- End Sub
FSOを使用して指定したフォルダの直下にある音楽ファイルの一覧を表示するExcelツール
前項のサンプルプログラムをFSOを使用して書き換えたものです。
行番号13でFSOを使用してFileオブジェクトを取得し、行番号20~23で「アルバム名」「トラック番号」「アーティスト名」「曲名」を取得しています。
ここで紹介しているサンプル・プログラムは、「指定したフォルダの直下」にあるファイルに限定していますが、FSOを使用している部分を少し書き換えれば、サブフォルダも含めて再帰的に処理することもできます。
⇒FSOの詳細については、Excel VBAでオブジェクト指向プログラミング(FSO編)を参照して下さい。
-
- Dim sht, shell, folder, fso, file As Object
- Dim ext As String
- Dim pos, cnt As Integer
- Private Sub Sample3()
- Set sht = ActiveSheet
- Set shell = New Shell32.shell
- Set folder = shell.Namespace(“C:\work")
- Set fso = New FileSystemObject
- sht.Cells.Clear
- cnt = 0
- For Each file In fso.GetFolder(“C:\work").files
- pos = InStrRev(file.Name, “.")
- If pos > 0 Then
- ext = LCase(Mid(file.Name, pos + 1))
- If (ext = “mp3") Or (ext = “m4a") Or (ext = “wma") Then
- cnt = cnt + 1
- sht.Cells(cnt, 1) = file.Name
- sht.Cells(cnt, 2) = folder.GetDetailsOf(folder.ParseName(file.Name), 14)
- sht.Cells(cnt, 3) = folder.GetDetailsOf(folder.ParseName(file.Name), 26)
- sht.Cells(cnt, 4) = folder.GetDetailsOf(folder.ParseName(file.Name), 13)
- sht.Cells(cnt, 5) = folder.GetDetailsOf(folder.ParseName(file.Name), 21)
- End If
- End If
- Next file
- Set file = Nothing
- Set fso = Nothing
- Set folder = Nothing
- Set shell = Nothing
- End Sub
Windowsのバージョンを確認する方法
前述した通り、iColumn番号はWindowsのバージョンによって異なりますので、バージョンの異なる環境でも動作するようにツールを作成するためには、Windowsのバージョンを判定したうえ、指定するiColumn番号を変える必要があります。
Excelの機能を使用した確認方法
ApplicationオブジェクトのOperatingSystemプロパティで、Windowsのバージョンを取得できます。
このプロパティで取得できるバージョンは、通称「NTバージョン」と呼ばれるもので、基本的には下表の通りですが、Excelのバージョンによって戻り値が変ったりするため、注意が必要です。
NTバージョン | プロダクト名 |
---|---|
Windows NT 5.1 | Windows XP |
Windows NT 6.0 | Windows Vista |
Windows NT 6.1 | Windows 7 |
Windows NT 6.2 | Windows 8 |
Windows NT 6.3 | Windows 8.1 |
Windows NT 10.0 | Windows 10 |
WMIを使用した確認方法
WMI(Windows Management Instrumentation)はMicrosoftから提供されている、Windowsのシステム情報を利用するためのオブジェクトです。
⇒詳細はMicrosoftのサイト(WMI(Windows Management Instrumentation))を参照して下さい。
ここではWindowsのバージョンを取得するためのサンプルプログラムをご紹介します。
①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログで
Microsoft WMI Scripting Vx.x Libraryのチェックボックスにチェックを入れ、[OK]ボタンを押下。
(参考)サンプル・プログラムの行番号4「Set locator = New WbemScripting.SWbemLocator」の部分を
「Set locator = CreateObject(“WbemScripting.SWbemLocator")]と記述すれば、ライブラリの参照設定は不要です。
②サンプル・プログラム
行番号9の処理を実行すると、Windowsのバージョンが「Microsoft Windows 10 Home」のような形式で取得できます。
- Dim locator, service, osset, os As Object
- Private Sub Sample4()
- Set locator = New WbemScripting.SWbemLocator
- Set service = locator.ConnectServer
- Set osset = service.ExecQuery(“Select * From Win32_OperatingSystem")
- For Each os In osset
- MsgBox (os.Caption)
- Next os
- Set os = Nothing
- Set osset = Nothing
- Set service = Nothing
- Set locator = Nothing
- End Sub
Windowsのバージョンを確認せずにiColumn番号を指定する方法
vItem引数に空値を指定して、iCulumn番号に対応する項目名を取得するロジックを応用し、項目名からiColumn番号を特定する処理を組込めば、Windwosのバージョンを確認しなくても情報を取得することができます。
前述した「指定したフォルダの直下にある音楽ファイルの一覧を表示するExcelツール」を、この方式で書換えたものが以下のサンプル・プログラムです。
行番号9~20で項目名を基にiColumn番号を特定して変数に保存し、行番号31~34で保存した変数でiColumn番号を指定しています。
(参考)サンプル・プログラムの行番号11,15で複数の項目名を指定していますが、これはWindowsのバージョンによって項目名が異なるためです。全てのバージョンで動作確認を行ってはいませんが、Windows XP以降であれば、このロジックで情報を取得できると思います。
(追記)「リリース年」のiColumn番号を特定したい場合は、項目名を『年』にして探して下さい。
- Dim sht, shell, folder, item As Object
- Dim ext As String
- Dim pos, cnt, i, album, track, artist, title As Integer
- Private Sub Sample5()
- Set sht = ActiveSheet
- Set shell = New Shell32.shell
- Set folder = shell.Namespace(“C:\work")
- For i = 0 To 511
- Select Case folder.GetDetailsOf(“", i)
- Case “アルバム", “アルバムのタイトル"
- album = i
- Case “トラック番号"
- track = i
- Case “アーティスト", “参加アーティスト"
- artist = i
- Case “タイトル"
- title = i
- End Select
- Next i
- sht.Cells.Clear
- cnt = 0
- For Each item In folder.Items
- pos = InStrRev(item.Name, “.")
- If pos > 0 Then
- ext = LCase(Mid(item.Name, pos + 1))
- If (ext = “mp3") Or (ext = “m4a") Or (ext = “wma") Then
- cnt = cnt + 1
- sht.Cells(cnt, 1) = item.Name
- sht.Cells(cnt, 2) = folder.GetDetailsOf(folder.ParseName(item.Name), album)
- sht.Cells(cnt, 3) = folder.GetDetailsOf(folder.ParseName(item.Name), track)
- sht.Cells(cnt, 4) = folder.GetDetailsOf(folder.ParseName(item.Name), artist)
- sht.Cells(cnt, 5) = folder.GetDetailsOf(folder.ParseName(item.Name), title)
- End If
- End If
- Next item
- Set item = Nothing
- Set folder = Nothing
- Set shell = Nothing
- End Sub
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ
ディスカッション
コメント一覧
まだ、コメントがありません