Excel VBAでオブジェクト指向プログラミング(GetDetailsOf編)

2024-01-05

■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]ボタンを押下。


②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。

  1. Dim shell, folder As Object

③インスタンスの生成
プログラムの処理部でインスタンスを生成。

  1. Set shell = New Shell32.shell
  2. Set folder = shell.Namespace(“C:\work")
  3. 'ここにGetDetailsOfメソッドを使用した処理を記述
  4. Set folder = Nothing
  5. Set shell = Nothing

(参考)「Set shell = New Shell32.shell」の部分を「Set shell = CreateObject(“Shell.Application")」と記述すれば、ステップ①(ライブラリの参照設定)は不要です。

GetDetailsOfメソッドの使用方法

GetDetailsOfメソッドの書式

GetDetailsOfメソッドは以下のように定義されていますので、アイテム(ファイル)とiColumn番号を引数として「folder.GetDetailsOf(vItem, iColumn)」のように記述すれば、結果を文字列型で受け取ることができます。
引数の詳細ついては、次項で説明します。

  1. 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番号に対応する項目名を取得しています。

  1. Dim sht, shell, folder As Object
  2. Dim i As Integer
  3. Private Sub Sample1()
  4.     Set sht = ActiveSheet
  5.     Set shell = New Shell32.shell
  6.     Set folder = shell.Namespace(“C:\work")
  7.     sht.Cells.Clear
  8.     For i = 0 To 511
  9.         sht.Cells(i + 1, 1) = i
  10.         sht.Cells(i + 1, 2) = folder.GetDetailsOf(“", i)
  11.     Next i
  12.     Set folder = Nothing
  13.     Set shell = Nothing
  14. End Sub

指定したフォルダの直下にある音楽ファイルの一覧を表示するExcelツール

指定したフォルダの直下にあるファイルのうち、音楽ファイル(ここでは拡張子がmp3,m4a,wmaのファイル)について、「アルバム名」「トラック番号」「アーティスト名」「曲名」を一覧にして表示するツールです。
⇒このプログラムを作成した環境はWindows10ですので、各項目のiColumn番号は14,26,13,21になります。

行番号12のFor Eachでは、FolderオブジェクトのItemsメソッドでFolderItemsコレクションを取得し、そのコレクションからFolderItemオブジェクト(ファイル)を取得しています。
また、行番号19~22ではGetDetailsOfメソッドを使用して、「アルバム名」「トラック番号」「アーティスト名」「曲名」を取得しています。

  1. Dim sht, shell, folder, item As Object
  2. Dim ext As String
  3. Dim pos, cnt As Integer
  4. Private Sub Sample2()
  5.     Set sht = ActiveSheet
  6.     Set shell = New Shell32.shell
  7.     Set folder = shell.Namespace(“C:\work")
  8.     sht.Cells.Clear
  9.     cnt = 0
  10.     For Each item In folder.Items
  11.         pos = InStrRev(item.Name, “.")
  12.         If pos > 0 Then
  13.             ext = LCase(Mid(item.Name, pos + 1))
  14.             If (ext = “mp3") Or (ext = “m4a") Or (ext = “wma") Then
  15.                 cnt = cnt + 1
  16.                 sht.Cells(cnt, 1) = item.Name
  17.                 sht.Cells(cnt, 2) = folder.GetDetailsOf(folder.ParseName(item.Name), 14)
  18.                 sht.Cells(cnt, 3) = folder.GetDetailsOf(folder.ParseName(item.Name), 26)
  19.                 sht.Cells(cnt, 4) = folder.GetDetailsOf(folder.ParseName(item.Name), 13)
  20.                 sht.Cells(cnt, 5) = folder.GetDetailsOf(folder.ParseName(item.Name), 21)
  21.             End If
  22.         End If
  23.     Next item
  24.     Set item = Nothing
  25.     Set folder = Nothing
  26.     Set shell = Nothing
  27. End Sub

FSOを使用して指定したフォルダの直下にある音楽ファイルの一覧を表示するExcelツール

前項のサンプルプログラムをFSOを使用して書き換えたものです。

行番号13でFSOを使用してFileオブジェクトを取得し、行番号20~23で「アルバム名」「トラック番号」「アーティスト名」「曲名」を取得しています。
ここで紹介しているサンプル・プログラムは、「指定したフォルダの直下」にあるファイルに限定していますが、FSOを使用している部分を少し書き換えれば、サブフォルダも含めて再帰的に処理することもできます。
⇒FSOの詳細については、Excel VBAでオブジェクト指向プログラミング(FSO編)を参照して下さい。

    1. Dim sht, shell, folder, fso, file As Object
    2. Dim ext As String
    3. Dim pos, cnt As Integer
    4. Private Sub Sample3()
    5.     Set sht = ActiveSheet
    6.     Set shell = New Shell32.shell
    7.     Set folder = shell.Namespace(“C:\work")
    8.     Set fso = New FileSystemObject
    9.     sht.Cells.Clear
    10.     cnt = 0
    11.     For Each file In fso.GetFolder(“C:\work").files
    12.         pos = InStrRev(file.Name, “.")
    13.         If pos > 0 Then
    14.             ext = LCase(Mid(file.Name, pos + 1))
    15.             If (ext = “mp3") Or (ext = “m4a") Or (ext = “wma") Then
    16.                 cnt = cnt + 1
    17.                 sht.Cells(cnt, 1) = file.Name
    18.                 sht.Cells(cnt, 2) = folder.GetDetailsOf(folder.ParseName(file.Name), 14)
    19.                 sht.Cells(cnt, 3) = folder.GetDetailsOf(folder.ParseName(file.Name), 26)
    20.                 sht.Cells(cnt, 4) = folder.GetDetailsOf(folder.ParseName(file.Name), 13)
    21.                 sht.Cells(cnt, 5) = folder.GetDetailsOf(folder.ParseName(file.Name), 21)
    22.             End If
    23.         End If
    24.     Next file
    25.     Set file = Nothing
    26.     Set fso = Nothing
    27.     Set folder = Nothing
    28.     Set shell = Nothing
    29. 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」のような形式で取得できます。

  1. Dim locator, service, osset, os As Object
  2. Private Sub Sample4()
  3.     Set locator = New WbemScripting.SWbemLocator
  4.     Set service = locator.ConnectServer
  5.     Set osset = service.ExecQuery(“Select * From Win32_OperatingSystem")
  6.     For Each os In osset
  7.         MsgBox (os.Caption)
  8.     Next os
  9.     Set os = Nothing
  10.     Set osset = Nothing
  11.     Set service = Nothing
  12.     Set locator = Nothing
  13. End Sub

Windowsのバージョンを確認せずにiColumn番号を指定する方法

vItem引数に空値を指定して、iCulumn番号に対応する項目名を取得するロジックを応用し、項目名からiColumn番号を特定する処理を組込めば、Windwosのバージョンを確認しなくても情報を取得することができます。

前述した「指定したフォルダの直下にある音楽ファイルの一覧を表示するExcelツール」を、この方式で書換えたものが以下のサンプル・プログラムです。
行番号9~20で項目名を基にiColumn番号を特定して変数に保存し、行番号31~34で保存した変数でiColumn番号を指定しています。

(参考)サンプル・プログラムの行番号11,15で複数の項目名を指定していますが、これはWindowsのバージョンによって項目名が異なるためです。全てのバージョンで動作確認を行ってはいませんが、Windows XP以降であれば、このロジックで情報を取得できると思います。

(追記)「リリース年」のiColumn番号を特定したい場合は、項目名を『年』にして探して下さい。

  1. Dim sht, shell, folder, item As Object
  2. Dim ext As String
  3. Dim pos, cnt, i, album, track, artist, title As Integer
  4. Private Sub Sample5()
  5.     Set sht = ActiveSheet
  6.     Set shell = New Shell32.shell
  7.     Set folder = shell.Namespace(“C:\work")
  8.     For i = 0 To 511
  9.         Select Case folder.GetDetailsOf(“", i)
  10.         Case “アルバム", “アルバムのタイトル"
  11.             album = i
  12.         Case “トラック番号"
  13.             track = i
  14.         Case “アーティスト", “参加アーティスト"
  15.             artist = i
  16.         Case “タイトル"
  17.             title = i
  18.         End Select
  19.     Next i
  20.     sht.Cells.Clear
  21.     cnt = 0
  22.     For Each item In folder.Items
  23.         pos = InStrRev(item.Name, “.")
  24.         If pos > 0 Then
  25.             ext = LCase(Mid(item.Name, pos + 1))
  26.             If (ext = “mp3") Or (ext = “m4a") Or (ext = “wma") Then
  27.                 cnt = cnt + 1
  28.                 sht.Cells(cnt, 1) = item.Name
  29.                 sht.Cells(cnt, 2) = folder.GetDetailsOf(folder.ParseName(item.Name), album)
  30.                 sht.Cells(cnt, 3) = folder.GetDetailsOf(folder.ParseName(item.Name), track)
  31.                 sht.Cells(cnt, 4) = folder.GetDetailsOf(folder.ParseName(item.Name), artist)
  32.                 sht.Cells(cnt, 5) = folder.GetDetailsOf(folder.ParseName(item.Name), title)
  33.             End If
  34.         End If
  35.     Next item
  36.     Set item = Nothing
  37.     Set folder = Nothing
  38.     Set shell = Nothing
  39. End Sub

 

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ