我有一个电子表格,其中包含一系列加载到SQL Server数据库中的模型输入。这个过程的一部分涉及建立谁更新了什么和什么时间的审计跟踪 - 我记录用户和机器名称以及时间戳。
在我的VBA代码中,我有以下内容:
user = VBA.environ $(“username”)
这是在带有Office 2013的Win7计算机上运行。
当我运行代码时,一切正常,但是当生产中的某个人运行它(在同一台机器上,但他们已登录,而不是我)时,它就会落在上面的那一行上。我使用了上面的变体(user = environ(“username”),user = environ $(“username”))但总是有相同的结果 - 它适用于我,但不适用于其他人。
有没有人对如何解决这个问题有任何想法?
答案 0 :(得分:4)
环境变量不可靠
尝试使用其中一种 API 方法。
选项1
Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Sub Sample()
Dim lpBuff As String * 25
Dim ret As Long, UserName As String
ret = GetUserName(lpBuff, 25)
UserName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)
MsgBox UserName
End Sub
选项2
Option Explicit
Private Declare Function GetEnvironmentVariable Lib _
"kernel32" Alias "GetEnvironmentVariableA" _
(ByVal lpName As String, ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
Private Sub Sample()
Dim strUserName As String * 255
Dim x As Integer
x = GetEnvironmentVariable("USERNAME", strUserName, Len(strUserName))
If x > 0 Then
x = InStr(strUserName, vbNullChar)
If x > 0 Then
MsgBox (Left$(strUserName, x - 1))
Else
MsgBox (Left$(strUserName, x))
End If
End If
End Sub
答案 1 :(得分:1)
你在这里:
Sub Test()
With CreateObject("WScript.Network")
Debug.Print .UserName
Debug.Print .ComputerName
Debug.Print .UserDomain
End With
End Sub
答案 2 :(得分:0)
我总是使用Application.UserName
,因为它几乎总是更好 - environ$("username")
可以给你类似“john~smith”的东西,而Application.UserName
会给你“John Smith”
答案 3 :(得分:0)
我总是使用
Environ("USERPROFILE")
但总的来说,我需要引用那个人的桌面。