Option Explicit
Krä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)
Wo ist objSysInfo definiert? – Jeremy
@ Jeremy es ist * nicht * definiert, das ist das Problem –
Ah, guter Fang. Ich bin immer noch etwas neu in VBA, also wie würde ich diese Variable definieren? – whatwhatwhat