2016-07-13 14 views
0

Ich bin in der guten Gewohnheit, Option Explicit an der Spitze aller meiner MS Access VBA-Skripte zu verwenden. Doch für diese Funktion mir einen Variable not defined Fehler gibt es die Zeile markieren, die mit Set objSysInfo =Variable nicht in VBA-Skript definiert

Public Function GetUser(Optional whatpart = "username") 

    Dim returnthis As String 
    If whatpart = "username" Then GetUser = Environ("USERNAME"): Exit Function 
    Set objSysInfo = CreateObject("ADSystemInfo") 
    Set objUser = GetObject("LDAP://" & objSysInfo.UserName) 
    Select Case whatpart 
     Case "fullname": returnthis = objUser.FullName 
     Case "firstname", "givenname": returnthis = objUser.givenName 
     Case "lastname": returnthis = objUser.LastName 
     Case Else: returnthis = Environ("USERNAME") 
    End Select 
    GetUser = returnthis 

End Function 

Darf ich einen speziellen Hinweis fehlt beginnt?

+1

Wo ist objSysInfo definiert? – Jeremy

+1

@ Jeremy es ist * nicht * definiert, das ist das Problem –

+0

Ah, guter Fang. Ich bin immer noch etwas neu in VBA, also wie würde ich diese Variable definieren? – whatwhatwhat

Antwort

5

Option ExplicitKräfte Sie alle Variablen deklarieren.

Das bedeutet, dass Sie müssen deklarieren Sie alle Variablen, die Sie verwenden, andernfalls wird Ihr Code nicht kompilieren - wie Sie bemerkt haben.

Sie deklarierte lokale Variable returnthis als String, das Dim Schlüsselwort:

Dim returnthis As String 

Das ist, wie Sie eine lokalen (Verfahren Anwendungsbereich) Variable deklarieren.

Sie können Variablen in Modul Umfang erklären mit dem Private Schlüsselwort (Dim wie gut funktioniert, aber besser halten Dim für Einheimische)

Option Explicit 
Private foo As Object 

Wie Sie Umfang Variablen hängt davon ab, wo Sie verwenden sie - wenn eine Variable immer nur in einer einzigen Prozedur verwendet wird, ist es besser, sie auf diese Prozedur zu beschränken und sie als lokale Variable zu deklarieren. In diesem Fall haben Sie objSysInfo und objUser, die nirgends deklariert werden.

Dim objSysInfo As Object 
Dim objUser As Object 

Ich weiß, wir sind nicht auf Code Review, aber während wir hier da sind noch andere Probleme mit dem Code:

  • Der Rückgabetyp der Funktion implizit Variant ist. Hängen Sie As String an das Ende der Signatur der Funktion an.
  • Der optionale Parameter whatpart ist implizit Variant als auch, und implizit ByRef vergangen, aber Sie müssen nur es lesen, nicht Schreib- und zurück zum Anrufer - so erklären es Optional ByVal whatpart As String = "username".
  • Ziehen die Environ$ Funktion über Environ - beide dasselbe tun, aber Environ gibt ein Variant, dass Sie zu einem String implizit konvertieren - beste Nutzung Environ$ und von Anfang an mit einem String arbeiten.
  • Statt auf Magie zu verlassen, hartcodierte Strings, verwenden Sie einen Enum Wert und Select Case über die möglichen rechtlichen Werte:

    Public Enum NamePart 
        EnvironmentDefined 
        FullName 
        FirstName 
        LastName 
    End Enum 
    

Der vollständige Code könnte wie folgt aussehen:

Public Enum NamePart 
    EnvironmentDefined 
    FullName 
    FirstName 
    LastName 
End Enum 

Public Function GetUserName(Optional ByVal part As NamePart = EnvironmentDefined) As String 

    Dim result As String 
    Dim sysInfo As Object 
    Dim userInfo As Object 

    If Namepart = EnvironmentDefined Then 
     GetUser = Environ$("USERNAME") 
     Exit Function 
    End If 

    Set sysInfo = CreateObject("ADSystemInfo") 
    Set userInfo = GetObject("LDAP://" & sysInfo.UserName) 
    Select Case part 
     Case FullName 
      result = userInfo.FullName 
     Case FirstName 
      result = userInfo.GivenName 
     Case LastName 
      result = userInfo.LastName 
     Case Else 
      result = Environ$("USERNAME") 
    End Select 

    GetUserName = result 

End Function 

Hinweis, ich habe kein GivenName enum-Mitglied enthalten, da es redundant ist; Calling Code kann dies tun:

Dim value As String 
value = GetUserName(FirstName) 
+0

"bis zum Ende der Signatur der Funktion." ...das was? Wo befindet sich die Signatur einer Funktion? Erste Linie? – whatwhatwhat

+0

@whatwhatwhat Die "Signatur" eines Mitglieds ist der Zugriffsmodifikator, der Elementtyp, der Name, die Parameterliste und der Rückgabetyp. –

+0

Ich habe meine Frage bearbeitet, um die von Ihnen gemachten Vorschläge einzubeziehen. Ich bin mir nicht sicher, ob ich den letzten Punkt korrekt implementiert habe. – whatwhatwhat

Verwandte Themen