Excel / VBA Environ(“用户名”)错误

时间:2016-09-23 09:04:14

标签: excel-vba vba excel

我有一个电子表格,其中包含一系列加载到SQL Server数据库中的模型输入。这个过程的一部分涉及建立谁更新了什么和什么时间的审计跟踪 - 我记录用户和机器名称以及时间戳。

在我的VBA代码中,我有以下内容:

user = VBA.environ $(“username”)

这是在带有Office 2013的Win7计算机上运行。

当我运行代码时,一切正常,但是当生产中的某个人运行它(在同一台机器上,但他们已登录,而不是我)时,它就会落在上面的那一行上。我使用了上面的变体(user = environ(“username”),user = environ $(“username”))但总是有相同的结果 - 它适用于我,但不适用于其他人。

有没有人对如何解决这个问题有任何想法?

4 个答案:

答案 0 :(得分:4)

环境变量不可靠

  1. 用户可以将值编辑为他们想要的任何内容
  2. 用户可以删除环境变量。
  3. 尝试使用其中一种 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")

但总的来说,我需要引用那个人的桌面。