2016-09-23 113 views
2

我有一個電子表格,其中包含一系列模型輸入,可以加載到SQL Server數據庫中。這個過程的一部分涉及建立誰更新什麼和什麼時候的審計跟蹤 - 我記錄用戶和機器名稱以及時間戳。Excel/VBA環境(「用戶名」)錯誤

在我的VBA代碼,我有以下幾點:

用戶= VBA.environ $( 「用戶名」)

這是一個Win7的機器上運行,與Office 2013

當我運行代碼,它一切正常,但是當生產中的某個人運行它(在同一臺機器上,但他們已登錄,而不是我)時,它會落在上面的行上。我已經使用了上面的變體(user = environ(「username」),user = environ $(「username」)),但總是具有相同的結果 - 它適用於我,但不適用於其他人。

有沒有人有任何想法如何解決這個問題?

回答

1

給你:

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

感謝您的建議。我會在星期一嘗試一下,看看它是否有效。 – John

+0

,也爲我工作。非常感謝您的幫助。 – John

0

我總是用Application.UserName,因爲它幾乎總是更好 - environ$("username")可以給你的東西,如「約翰·〜·史密斯」,而Application.UserName會給你「約翰·史密斯」

+1

'Application.UserName'可以在Excel常規選項中更改,所以我認爲它更不可靠http://blog.contextures.com/archives/2010/09/10/allow-only-specific-user -to-change-excel-list/ – Slai

4

環境變量是不可靠的

  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 
+0

謝謝你。我會在星期一嘗試一下,並讓你知道它是怎麼回事...... – John

+1

我使用了上面的選項2,它非常適合捕獲用戶名和計算機名稱。 – John

0

我總是用

Environ("USERPROFILE") 

但是一般來說我需要引用那個人的桌面。