教えて!ExcelVBA!

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

【ExcelVBA API操作】ログイン名を取得(GetUserName)する方法を教えて!

GetUserName関数は、WindowsAPIの一部であり、Windowsオペレーティングシステム上で実行されているプログラムから、現在ログインしているユーザーの名前を取得するために使用されます。

API宣言

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

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long

解説

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

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

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

使い方

GetUserName関数を使用して、現在ログインしているユーザーの名前を取得するための手順です。

1.API宣言を行う

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long

2.バッファを作成する

Dim userName As String
Dim bufferSize As Long
bufferSize = 255
userName = Space(bufferSize)

※このコードでは、255文字分のバッファを作成しています。Space関数は、指定された数のスペースで構成される文字列を返します。この場合、バッファの初期値として使用されます。

3.GetUserName関数を呼び出す

Dim result As Long
result = GetUserName(userName, bufferSize)

※このコードでは、GetUserName関数を呼び出して、現在ログインしているユーザーの名前をバッファに格納します。関数が成功すると、TRUEが返され、バッファにユーザー名が格納されます。

4.バッファからユーザー名を取得する

If result = 1 Then
  userName = Left(userName, InStr(userName, Chr(0)) - 1)
  MsgBox "Current user: " & userName
Else
  MsgBox "Failed to get the current user name"
End If

※このコードでは、GetUserName関数が成功した場合、バッファからユーザー名を取得します。Left関数は、指定された文字列の左端から指定された数の文字列を返します。InStr関数は、指定された文字列内で指定された文字列が最初に出現する位置を返します。この場合、Chr(0)は、NULL文字を表します。バッファ内のNULL文字以降の文字列は、無視されます。

プログラミング例

以下は、GetUserName関数を使用して、現在ログインしているユーザーの名前を取得するための完全なプログラム例です。

Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long

Sub GetCurrentUserName()
    Dim userName As String
    Dim bufferSize As Long
    Dim result As Long
    bufferSize = 255
    userName = Space(bufferSize)
    result = GetUserName(userName, bufferSize)
    If result = 1 Then
        userName = Left(userName, InStr(userName, Chr(0)) - 1)
        MsgBox "Current user: " & userName
    Else
        MsgBox "Failed to get the current user name"
    End If
End Sub

このコードを実行すると、現在ログインしているユーザーの名前が表示されます。

まとめ

Windowsプログラミングを学ぶ場合、API関数の使用方法を理解することが非常に重要です。GetUserName関数を使用することで、現在ログインしているユーザーの名前を簡単に取得できるだけでなく、WindowsAPI関数の使用方法について学ぶことができます。より高度なWindowsプログラミングに進むためには、より高度なAPI関数やWin32 APIを学習する必要があります。