教えて!ExcelVBA!

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

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

GetWindowsDirectory関数は、WindowsAPIの一つで、Windowsのシステムフォルダが格納されている場所を取得するために使用される関数です。Windowsのシステムフォルダには、Windowsの動作に必要なファイルやドライバーが格納されています。この関数を使うことで、プログラムからWindowsのシステムフォルダの場所を取得することができます。

API宣言

ExcelVBAでは、GetWindowsDirectory関数を使用する前にAPI宣言を行う必要があります。API宣言を行うことで、ExcelVBAがWindowsAPI関数を認識することができるようになります。API宣言は次のように行います。

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

解説

パラメータ 内容
Lib 使用する動的リンクライブラリ(DLL)の名前を指定します。ここでは "kernel32.dll"となります。
Alias API関数名を指定します。ここでは"GetWindowsDirectoryA"という関数名が指定されています。

引数については以下の通りです。

引数 内容
lpBuffer Windowsディレクトリのパスが格納される文字列へのポインタです。この引数には、関数が呼び出される前に十分なメモリが確保されている必要があります。関数が成功すると、この文字列にディレクトリパスが格納されます。
nSize lpBufferが指すバッファのサイズを指定します。バイト単位でのサイズを表す整数型です。関数が呼び出されると、nSizeに実際に必要なサイズが格納されます。もしlpBufferがNULLの場合、この引数は無視されます。バッファが十分なサイズでない場合、関数はERROR_INSUFFICIENT_BUFFERを返し、nSizeに必要なサイズが格納されます。

使い方

GetWindowsDirectory関数を使うには、以下のように関数を呼び出します。

Dim sBuffer As String
Dim lSize As Long
sBuffer = String$(255, 0)
lSize = Len(sBuffer)
Call GetWindowsDirectory(sBuffer, lSize)
sBuffer = Left$(sBuffer, lSize)
MsgBox "Windowsのシステムフォルダは、" & sBuffer & "です。

この例では、String$関数を使ってsBuffer変数に255バイトの空の文字列を作成し、Len関数で文字列の長さを取得してlSize変数に代入します。次に、GetWindowsDirectory関数を呼び出して、Windowsのシステムフォルダの場所を取得します。取得した場所は、sBuffer変数に格納されます。最後に、MsgBox関数を使って取得した場所を表示します。

プログラミング例

以下は、GetWindowsDirectory関数を使用して、Windowsのシステムフォルダにあるcmd.exeファイルを起動するプログラムの例です。

Private Declare Function ShellExecute Lib "shell32.dll" _
    Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, _
    ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

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

Sub StartCmd()
    Dim sBuffer As String
    Dim lSize As Long
    Dim sCmdPath As String
    sBuffer = String$(255, 0)
    lSize = Len(sBuffer)
    Call GetWindowsDirectory(sBuffer, lSize)
    sBuffer = Left$(sBuffer, lSize)
    sCmdPath = sBuffer & "\System32\cmd.exe"
    Call ShellExecute(0&, "open", sCmdPath, "", sBuffer, vbNormalFocus)
End Sub

この例では、ShellExecute関数を使用して、Windowsのシステムフォルダにあるcmd.exeファイルを起動します。GetWindowsDirectory関数を使用して、Windowsのシステムフォルダの場所を取得し、それをsBuffer変数に代入します。次に、sBuffer変数と"\System32\cmd.exe"を結合して、sCmdPath変数にcmd.exeファイルのパスを作成します。最後に、ShellExecute関数を呼び出して、sCmdPath変数の値を使ってcmd.exeファイルを起動します。

まとめ

GetWindowsDirectory関数を使う方法について解説しました。Windowsのシステムフォルダの場所を取得することで、プログラムの開発や実行に必要なファイルやドライバーを取得することができます。