教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA API操作】Windowsディレクトリのパスを取得(GetWindowsDirectory)する方法を教えて!

f:id:m_kbou:20200419203346p:plain

Windowsディレクトリのパスを取得するWindowsAPI関数(GetWindowsDirectory)について説明します。

 

【目次】

 

構文

記述方法は以下の通りとなります。

(API定義)

Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

(VBA記述)

GetWindowsDirectorylpBuffernSize

[説明]:

Windowsディレクトリのパスを取得するWindowsAPI関数はGetWindowsDirectory関数となります。VBAから呼び出して使用する場合には、Declareステートメントによる「Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long」をプロシージャの外で宣言します。GetWindowsDirectory関数はWindowsアプリケーションや初期ファイル・ヘルプファイル等があるディレクトリのパスを取得します。引数であるlpBuffer取得したWindowsディレクトリパスを格納するエリアとなります。また、もう一つの引数であるnSizeにはWindowsディレクトリパスの文字数を指定します。実行による戻り値には「0」と「0以外」があり、「0以外」の場合は正常終了、「0」の場合はエラーとなります。

 

使い方

[プログラミング例]:

Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

 

Sub サンプル()

    '↓処理①
    Dim Windowsディレクトリパス As String * 260
         
    '↓処理②
    If GetWindowsDirectory(Windowsディレクトリパス, 260) <> 0 Then
        MsgBox Windowsディレクトリパス
    Else
        MsgBox "Windowsディレクトリのパスが取得できません。"
    End If
   
End Sub

処理の流れは以下の通りとなります。

[処理①]:変数定義
DimによるWindowsディレクトリパスを取得・格納する変数定義となります。引数には格納するバッファサイズを指定する必要があり、宣言時には必ず260に指定します。
[処理②]:GetWindowsDirectoryによるWindowsディレクトリパス取得
WindowsAPI関数であるGetWindowsDirectoryを使用したWindowsディレクトリのパスを取得します。取得処理が正常に終了するとWindowsディレクトリのパスが返され、エラーの場合には「0」の値が返されます。よって、戻り値が0以外の場合はWindowsディレクトリのパスがMsgBoxで表示され、0の場合は”Windowsディレクトリのパスが取得できません。”が表示されます。

f:id:m_kbou:20210219175205p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

※Windowsディレクトリのパス「C:\Windows」が表示されます。

f:id:m_kbou:20200324081728p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

WindowsAPIを使用したWindowsディレクトリのパスを取得する方法についての説明は以上です。

 

おわりに

今回はWindowsAPI関数によるWindowsディレクトリのパスを取得する方法について説明しました。是非参考にして下さい。