【问题标题】:Excel/VBA Environ("username") errorExcel/VBA 环境(“用户名”)错误
【发布时间】:2016-09-23 09:04:13
【问题描述】:

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

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

user = VBA.environ$("username")

这是在装有 Office 2013 的 Win7 机器上运行的。

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

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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    环境变量不可靠

    1. 用户可以将值编辑为他们想要的任何值
    2. 用户可以删除环境变量。

    试试这些 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
    

    【讨论】:

    • 谢谢你。我会在星期一试一试,然后告诉你进展如何......
    • 我使用了上面的选项 2,它非常适合捕获用户名和计算机名称。
    • 逐案。如果我正在创建一个临时环境变量并立即使用它,那么用户就没有机会触摸它。
    【解决方案2】:

    你在这里:

    Sub Test()
        With CreateObject("WScript.Network")
            Debug.Print .UserName
            Debug.Print .ComputerName
            Debug.Print .UserDomain
        End With
    End Sub
    

    【讨论】:

    • 感谢您的建议。我会在星期一尝试一下,看看它是否有效。
    • 这也对我有用。非常感谢您对此提供的帮助。
    【解决方案3】:

    我总是使用Application.UserName,因为它几乎总是更好 - environ$("username") 可以给你类似“john~smith”,而Application.UserName 会给你“约翰史密斯”

    【讨论】:

    【解决方案4】:

    我总是用

    Environ("USERPROFILE")
    

    但一般来说,我需要相当多地参考那个人的桌面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 2016-07-19
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多