Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Code ändern auf 64 Bit - Version

Code ändern auf 64 Bit - Version
19.09.2023 10:30:47
Harald
Hallo zusammen,

folgender Code zur Ermittlung des Benutzernamens funktioniert seit der Umstellung in meiner Firma auf Office365 64 Bit-Variante nicht mehr.

Kann mir jemand helfen? Wie muss der Code verändert werden?

Vielen Dank und Grüße
Harald



Option Explicit
'Aktuellen_Benutzer_ermitteln
Dim BName As String
Declare Function GetUserName Lib "advapi32.dll" _
Alias "GetUserNameA" (ByVal lpBuffer As String, _
nSize As Long) As Long

Function BenutzerName1() 'E......-Nr.
Dim Buffer As String * 100
Dim BuffLen As Long
Application.Volatile
BuffLen = 100
GetUserName Buffer, BuffLen
BenutzerName1 = Left(Buffer, BuffLen - 1)
End Function
Function BenutzerName() 'Vorname Name bzw. alte USERID
Application.Volatile
BenutzerName = Application.UserName
End Function
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code ändern auf 64 Bit - Version
19.09.2023 10:47:44
Ulf
Für 32-Bit gültig


Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, ByRef nMax As Long) As Boolean
Public Function GetUser() As String
On Local Error GoTo getUserERR
Dim strBuffer As String
Dim lngRet As Long
Dim lngBuffer As Long
Dim strRet As String
strBuffer = String(64, 0)
lngRet = GetUserName(strBuffer, lngBuffer)
If lngRet = 0 Then
strBuffer = String(lngBuffer, 0)
lngRet = GetUserName(strBuffer, lngBuffer)
strRet = Left$(strBuffer, lngBuffer - 1)
End If
getUserOUT:
GetUser = strRet
Exit Function
getUserERR:
strRet = ""
Debug.Print Err.Number & vbCrLf & Err.Description
Resume getUserOUT
End Function


Sollte in 64:


Public Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, ByRef nMax As LongPtr) As Boolean
Public Function GetUser() As String
On Local Error GoTo getUserERR
Dim strBuffer As String
Dim lngRet As Long
' Test: Dim lngBuffer As LongPtr
Dim lngBuffer As Long
Dim strRet As String
strBuffer = String(64, 0)
lngRet = GetUserName(strBuffer, lngBuffer)
If lngRet = 0 Then
strBuffer = String(lngBuffer, 0)
lngRet = GetUserName(strBuffer, lngBuffer)
strRet = Left$(strBuffer, lngBuffer - 1)
End If
getUserOUT:
GetUser = strRet
Exit Function
getUserERR:
strRet = ""
Debug.Print Err.Number & vbCrLf & Err.Description
Resume getUserOUT
End Function

Ausprobieren, hab kein 64Bit
hth
Ulf
Anzeige
AW: Code ändern auf 64 Bit - Version
19.09.2023 10:48:52
Yal
Hallo Harald,

in https://www.office-hilfe.com/support/threads/getusername-in-win7-x64.43003/ aus einem Beitrag von auch hier sehr geschätztem Nepumuk:

#If Win64 Then

Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" _
Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#Else
Private Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#End If


Wenn der Code nur auf eine Maschine läuft, dann nur der ersten Block verwenden:
Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" _

Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long


VG
Yal
Anzeige
AW: Code ändern auf 64 Bit - Version
19.09.2023 12:38:21
volti
Hallo,

in Ergänzung zu Yal's Aufführung:

Für diese Funktion reicht die Ergänzung des Schlüsselworts PtrSafe, alles andere bleibt gleich.

Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" _

Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long


Die Funktion funktioniert so für 32-Bit und 64-Bit unter VBA7, also alle neueren Excel-Versionen. Lediglich für 32 Bit, VBA 6 muss die alte Version benutzt, also auch deklariert werden.

Für die neueren Excel-Versionen ist demnach hier keine Unterscheidung nach 64-Bit (Kompilierschalter #IF) nötig.

Eine Unterscheidung nach 64-Bit ist nur für ein paar wenige Funktionen überhaupt erforderlich.

Gruß KH
Anzeige
AW: Code ändern auf 64 Bit - Version
19.09.2023 14:59:44
Harald
Hallo zusammen,

vielen Dank an die Profis!!! Jetzt funktioniert die Datei DANK EUCH wieder.

Ich bin sehr froh, weil viele Kolleg*innen betroffen waren.

Ich wünsche allen einen schönen Tag und bleibt gesund.

Harald

AW: Code ändern auf 64 Bit - Version
19.09.2023 16:46:38
daniel
HI
kurze Frage, was macht dieser Code?
Usernamen kann man mit Environ("Username") (windows-Anmeldename) oder mit Application.Username (In die MS-Produkte eingetragener Name des Anwenders) ermitteln, damit wäre man Versionsunabhängig, sofern das gezeigte Makro das gleiche ermittelt.
Gruß Daniel
Anzeige
AW: Code ändern auf 64 Bit - Version
19.09.2023 17:06:48
volti
Hallo Daniel,

GetUsername gibt wie Environ("Username") den Windows-Anmeldenamen zurück. Ist damit das selbe.

Die Anwendung ist Geschmacksache. Die API-Version hat mehr code und ist für den Laien m.E. schwerer zu durchschauen.

Die Versionsabhängigkeit war jetzt so wie ich das sehe eine einmalige Sache bis das Betriebssystem mal wieder einen Sprung nach vorne macht, falls überhaupt.

Gruß KH
Anzeige
AW: Code ändern auf 64 Bit - Version
19.09.2023 17:13:17
daniel
"Die API-Version hat mehr code und ist für den Laien m.E. schwerer zu durchschauen."

also einfach nur Angeberrei, um Menschen zu beeindrucken, die keine Ahnung haben?
AW: Code ändern auf 64 Bit - Version
19.09.2023 17:49:21
Ulf
In gesicherten Umgebungen kann es sein, dass der (priviligiertere) Anwender
(Powershell, Webdev usw) SET Befehle an der Konsole ausführen können muss und somit per
cmd
SET username=iwas
die Schranken per Variable umgeht. Der Anmeldename an AD o. MS bleibt unveränderlich.
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Code anpassen für 64-Bit Excel


Schritt-für-Schritt-Anleitung

Um deinen bestehenden VBA-Code für die Ermittlung des Windows-Benutzernamens auf 64-Bit Excel anzupassen, folge diesen Schritten:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.
  2. Finde den bestehenden Code:

    • Suche den Code, der die GetUserName Funktion nutzt.
  3. Ändere die Deklaration:

    • Ersetze die Zeile:
      Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

      mit:

      Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, ByRef nMax As LongPtr) As Boolean
  4. Passe die Funktion an:

    • Stelle sicher, dass alle Variablen, die Long verwenden, auf LongPtr umgestellt werden.
    • Ein Beispiel für die angepasste Funktion sieht so aus:
      Public Function GetUser() As String
       Dim strBuffer As String
       Dim lngRet As Long
       Dim lngBuffer As LongPtr
       Dim strRet As String
       strBuffer = String(64, 0)
       lngRet = GetUserName(strBuffer, lngBuffer)
       If lngRet = 0 Then
           strBuffer = String(lngBuffer, 0)
           lngRet = GetUserName(strBuffer, lngBuffer)
           strRet = Left$(strBuffer, lngBuffer - 1)
       End If
       GetUser = strRet
      End Function
  5. Testen:

    • Schließe den VBA-Editor und teste deinen Code, um sicherzustellen, dass alles wie erwartet funktioniert.

Häufige Fehler und Lösungen

  • Fehler beim Kompilieren:

    • Wenn du den Fehler erhältst: „Der Code in diesem Projekt muss für die Verwendung auf 64-Bit-Systemen aktualisiert werden“, stelle sicher, dass du PtrSafe in deinen Deklarationen verwendest.
  • VBA Prozedur zu groß:

    • Wenn deine Prozeduren zu groß werden, kann dies die Performance beeinträchtigen. Teile große Funktionen in kleinere Unterfunktionen auf.

Alternative Methoden

Falls du eine einfachere Methode zur Ermittlung des Benutzernamens verwenden möchtest, kannst du folgende VBA-Alternativen nutzen:

  1. Umgebungsvariablen:

    Dim userName As String
    userName = Environ("USERNAME")
  2. Excel Anwendung:

    Dim userName As String
    userName = Application.UserName

Diese Methoden sind versionsunabhängig und funktionieren sowohl in 32-Bit als auch in 64-Bit Excel.


Praktische Beispiele

Hier sind einige Beispiele, die dir helfen, den GetUserName-Code effektiv zu nutzen:

  1. Benutzernamen in eine Zelle schreiben:

    Sub WriteUserNameToCell()
       Dim userName As String
       userName = GetUser()
       Range("A1").Value = userName
    End Sub
  2. Benutzername in einer MsgBox anzeigen:

    Sub ShowUserName()
       MsgBox "Der aktuelle Benutzer ist: " & GetUser()
    End Sub

Tipps für Profis

  • Achte darauf, die advapi32.dll nur zu verwenden, wenn es wirklich notwendig ist. In vielen Fällen reichen die integrierten Excel-Funktionen.
  • Teste deine VBA-Prozeduren in verschiedenen Excel-Versionen, um sicherzustellen, dass sie in 64-Bit und 32-Bit ordnungsgemäß funktionieren.
  • Halte deine VBA-Projekte modular, um die Wartung zu erleichtern und die Übersichtlichkeit zu verbessern.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen 32-Bit und 64-Bit Excel? Der Hauptunterschied liegt in der Speicherkapazität. 64-Bit Excel kann mehr Arbeitsspeicher nutzen, was bei großen Datenmengen von Vorteil ist.

2. Warum muss ich PtrSafe verwenden? PtrSafe ist notwendig, um sicherzustellen, dass dein Code auf 64-Bit-Versionen von Excel funktioniert und keine Kompilierungsfehler auftreten.

3. Wie kann ich sicherstellen, dass mein Code in beiden Versionen funktioniert? Verwende den Kompilierschalter #If Win64 Then, um die Deklarationen je nach Excel-Version anzupassen.

4. Was mache ich, wenn ich den Fehler "Excel Fehler beim kompilieren 64-bit" bekomme? Überprüfe deine Deklarationen und stelle sicher, dass alle erforderlichen Funktionen mit PtrSafe deklariert sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige