2016-09-23 3 views
2

SQL Server 데이터베이스로로드되는 모델 입력 범위가 포함 된 스프레드 시트가 있습니다. 이 프로세스의 일부에는 누가 언제 무엇을 업데이트했는지에 대한 감사 추적을 만드는 작업이 포함됩니다. 사용자 및 컴퓨터 이름은 물론 타임 스탬프도 기록합니다. 내 VBA 코드 내에서Excel/VBA Environ ("username") 오류

, 나는 다음 있습니다 : 사무실로,

사용자 = VBA.environ $ ("이름")

이것은 Win7에 시스템에서 실행중인 2013

때 나는 코드를 실행한다. 모두 정상적으로 작동하지만, 프로덕션의 누군가 (동일한 머신에서 실행되지만, 내가 속한 것이 아니라) 로그인하면, 위의 라인에 넘어진다. 나는 위의 (사용자 = environ ("username"), 사용자 = 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을 사용하여 더 나은 - Application.UserName

+1

Excel 일반 옵션에서 '응용 프로그램. 사용자 이름'을 변경할 수 있으므로 신뢰할 수없는 것으로 생각됩니다. http://blog.contextures.com/archives/2010/09/10/allow-only-specific-user ~ - excel-list/ – Slai

4

환경 변수가 신뢰할 수없는

  1. 당신에게 "존 스미스"을 줄 것입니다 반면 environ$("username") 당신에게 "존 ~ 스미스"와 같은 무언가를 줄 수 사용자가 원하는 값으로 편집 할 수 있습니다.
  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") 

하지만 일반적으로 나는 그 사람의 바탕 화면을 꽤 참고해야합니다.