プログラムが実行されるマシンにログイン(ログオン)しているユーザー名(ユーザーID)をWindowsのAPI関数を使用してVBAで取得するサンプルプログラムを覚書。
サンプルの実行は、ExcelのVBAでもAccessのVBAでも実行できます。
サンプルプログラムは標準モジュールに記載してください。
WindowsのAPI関数を使ったログインユーザー名の取得
VBAでログインしているユーザー名を取得するには、WindowsのAPI関数である"GetUserName"関数を利用します。
もしかすると最新のバージョンのAccessやExcelでは、APIを使わなくても取得できるような関数が用意されているかもしれませんが、この記事を書いた時点ではわからなかったのでAPIを使う方法を紹介します。
WindowsのAPI関数の宣言(Declare文)
最初に標準モジュールの宣言セクション("Option Compare Database"とか"Option Explicit"のすぐ下)に以下のAPI宣言(Declare文と言う)を記述します。
以下がそのDeclare文です。
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, _
nSize As Long) As Long
ログインユーザー名を取得するVBAのサンプルプログラム
次にAPI関数を呼び出してログインユーザー名を取得するVBAのユーザー定義関数"GetUserID"を作成します。
以下にユーザー定義関数のサンプルプログラムを記載します。
Function GetLoginName()
Dim strBuffer As String * 255, retValue As Long
retValue = GetUserName(strBuffer, 255)
GetLoginName = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
End Function
ユーザー定義関数の実行例
上記のユーザー定義関数を実行するプロシージャのサンプルプログラムを以下に記載します。
以下のサンプルプログラムを実行するとログイン名をメッセージボックスで表示します。
Sub sample()
MsgBox GetLoginName()
End Sub
API関数"GetUserName"は、呼び出しが成功すると"0"以外の数値を返し、失敗すると"0"を返すので、エラー時の処理を記述したい場合は、"GetLoginName"関数の戻り値を代入している変数"retValue"の中身をIF文などでチェックして処理を分岐させればよいです。
API関数"GetUserName"について
GetUserName関数は、引数として文字列型の変数とそのサイズを必要とします。
従って、呼び出す前に固定長の文字列型変数を用意しておく必要があります。
サンプルコード中では、サイズを255にしているので"strBuffer"変数の宣言部分が、"dim strBuffer * 255"となっています。
GetUserName関数の呼び出しが正常に終了する(きちんと値が取得できたという意味)と、戻り値として"0"以外の数値を返します。
GetUserName関数の戻り値に直接ユーザー名が戻ってくるわけではないので注意してください。
実際のユーザー名は、引数として渡した文字列型の変数(サンプルでは、strBuff変数)に代入されていまする。
そして、文字列型変数の余分なサイズ部分(255指定していてユーザー名が5文字だったとすると、5文字目以降の250文字分)はNullで埋められます。
ユーザー名部分を純粋に取り出す際には、そのNullを取り除く処理が必要となります。
サンプルコードでは、その処理をInstr関数を利用して行っています。
Instr関数代わりにReplace関数などを使って処理することもできます。
Instr関数代わりにReplace関数を使う場合の例
以下にInstr関数代わりにReplace関数を使ってNull(余った文字列部分)の処理をするサンプルプログラムを記載しておきます。
Replace(strBuffer, vbNullChar, "")
コメント