Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Aktuelle Umgebungsvariable auslesen

Forumthread: Aktuelle Umgebungsvariable auslesen

Aktuelle Umgebungsvariable auslesen
01.07.2004 00:41:56
Folker
Hallo,
ich möchte eine permanente Umgebungsvariable setzen und auch auslesen können. zum Setzen verwende ich die setx.exe mit der das auch gut funktioniert. Zum Auslesen habe ich nun schon verschiedene Codes ausprobiert, stoße aber immer auf das Problem, dass der Wert der ausgelesen wird, nicht refreshed wird, sondern immer der zum Systemstart bleibt. D.h. wenn die Variable zum Systemstart auf 0 steht und ich sie mit der setx.exe auf 5 ändere, dann zeigt mir mein Code trotzdem noch 0 an. Wie schaffe ich es, dass ich den tatsächlich aktuellen Wert der Umgebungsvariblen bekomme?
Vielen Dank für jeden Tipp
Ich benutze derzeit folgenden Code zum Auslesen der Variablen:

Sub SystemVariables()
Dim iIndex As Integer
Dim sResult As String
Dim sKey As String
Dim sValue As String
Dim iPos As Integer
iIndex = 1
Do
sResult = Environ(iIndex)
If sResult <> "" Then
iPos = InStr(sResult, "=")
sKey = Left$(sResult, iPos - 1)
sValue = Mid$(sResult, iPos + 1)
MsgBox (sKey & " , " & sValue)
End If
iIndex = iIndex + 1
Loop Until sResult = ""
End Sub

Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Gefunden
03.07.2004 19:25:56
Folker
So mittlerweile habe ich selbst eine Lösung gefunden, indem einfach der Wert direkt aus der Registry gelesen wird. :-)
Dieser Code liest z.B. den Path aus.
Private Declare

Function RegOpenKeyEx Lib "advapi32.dll" Alias _
"RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) _
As Long
Private Declare 

Function RegQueryValueEx Lib "advapi32.dll" Alias _
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, lpData As Any, _
lpcbData As Long) As Long
Private Declare 

Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey As Long) As Long
' RegOpenKeyEx hKey-Konstanten
' Einstellungen des aktuellen Anwenders
' z.B. Anwender- und Desktop-Einstellungen (Farb-/Soundkonfiguration
' Hardware-Konfiguration, Netzwerkprotokolle, Software-Klassen
Private Const HKEY_LOCAL_MACHINE = &H80000002
' Teil von HKEY_LOCALE_MACHINE
' Enthält Definitionen für Dokumenttypen, Dateizuordnungen
' und Shell-Schnittstelle
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_USERS = &H80000003
' Einstellungen des aktuellen Anwenders
Private Const HKEY_CURRENT_USER = &H80000001
' (Win NT/2000) Performance Dataschlüssel
Private Const HKEY_PERFORMANCE_DATA = &H80000004
' (Win 95/98) Dynamisch Daten
Private Const HKEY_DYN_DATA = &H80000006
' Aktuelle Konfiguration
Private Const HKEY_CURRENT_CONFIG = &H80000005
' RegOpenKeyEx samDesired-Konstanten
' Alle Arten von Zugiffen
Private Const KEY_ALL_ACCESS = &HF003F
' Erlaubt das Erstellen von symbolischen Links
Private Const KEY_CREATE_LINK = &H20
' Erlaubt, Unterschlüssel zu erstellen
Private Const KEY_CREATE_SUB_KEY = &H4
' Erlaubt Unterschlüssel aufzulisten
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
' Aktiviert die Änderungsbenachrichtigung (nicht unter Win95)
Private Const KEY_NOTIFY = &H10
' Erlaubt das Abfragen/Auslesen von Unterschlüssel
Private Const KEY_QUERY_VALUE = &H1
' Lesezugriff
Private Const KEY_READ = &H20019
' Erlaubt das Schreiben von Werten in Unterschlüssel
Private Const KEY_SET_VALUE = &H2
' Schreibzugriff
Private Const KEY_WRITE = &H20006
' RegQueryValueEx lpType-Konstanten
' Binärdaten in beliebigem Format (Bytefolge)
Private Const REG_BINARY = 3
' 32-Bit Zahl (Little Endian)
Private Const REG_DWORD = 4
' 32-Bit Zahl (Big Endian)
Private Const REG_DWORD_BIG_ENDIAN = 5
' nullterminierter String (vbNullChar), der nicht
' aufgelöste Verweise auf Umgebungsvariablen enthält (z.B. "%PATH%")
Private Const REG_EXPAND_SZ = 2
' symbolischer Link zu einem Unterschlüssel (Unicode)
Private Const REG_LINK = 6
' Liste nullterminierter Strings, die durch ein weiteres
' Nullzeichen (vbNullChar) beendet wird
Private Const REG_MULTI_SZ = 7
' Keine Daten
Private Const REG_NONE = 0
' Liste von Ressourcen in einer Ressourcen Map
Private Const REG_RESOURCE_LIST = 8
' nullterminierter String (vbNullChar)
Private Const REG_SZ = 1

Sub readRegKey()
Dim Retval As Long
Dim hKey As Long
Dim TmpSNum As String * 255
Retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
"System\CurrentControlSet\Control\Session Manager\Environment", 0&, KEY_READ, hKey)
If Retval <> 0 Then
MsgBox "Der Schlüssel konnte nicht geöffnet werden."
Exit Sub
End If
Retval = RegQueryValueEx(hKey, "Path", 0, REG_SZ, _
ByVal TmpSNum, Len(TmpSNum))
If Retval <> 0 Then
MsgBox "Der Schlüsselwert konnte nicht gelesen oder gefunden werden."
Exit Sub
End If
MsgBox "Path: " & Left$(TmpSNum, _
InStr(1, TmpSNum, vbNullChar) - 1), , "Produkt-Key"
Retval = RegCloseKey(hKey)
End Sub

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Aktuelle Umgebungsvariable in Excel auslesen


Schritt-für-Schritt-Anleitung

Um eine aktuelle Umgebungsvariable in Excel auszulesen, kannst du VBA verwenden. Befolge diese Schritte:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (DeineDatei.xlsx)" > Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Sub SystemVariables()
       Dim iIndex As Integer
       Dim sResult As String
       Dim sKey As String
       Dim sValue As String
       Dim iPos As Integer
       iIndex = 1
       Do
           sResult = Environ(iIndex)
           If sResult <> "" Then
               iPos = InStr(sResult, "=")
               sKey = Left$(sResult, iPos - 1)
               sValue = Mid$(sResult, iPos + 1)
               MsgBox (sKey & " , " & sValue)
           End If
           iIndex = iIndex + 1
       Loop Until sResult = ""
    End Sub
  4. Führe das Makro aus: Gehe zu Run > Run Sub/UserForm oder drücke F5.

  5. Überprüfe die angezeigten Umgebungsvariablen in den Meldungsfenstern.


Häufige Fehler und Lösungen

  • Problem: Der ausgelesene Wert wird nicht aktualisiert.

    • Lösung: Verwende die setx.exe, um die Umgebungsvariable anzupassen, und danach den Wert direkt aus der Registry auszulesen.
  • Problem: Fehlermeldung beim Zugriff auf Umgebungsvariablen.

    • Lösung: Stelle sicher, dass du die richtigen Berechtigungen hast und dass Excel im richtigen Modus läuft (z.B. als Administrator).

Alternative Methoden

Wenn das Auslesen der Umgebungsvariablen über Environ() nicht die gewünschten Ergebnisse liefert, kannst du die Registry direkt abfragen. Hier ist ein Beispielcode:

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
"RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) _
As Long

Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias _
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, lpData As Any, _
lpcbData As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey As Long) As Long

Sub readRegKey()
    Dim Retval As Long
    Dim hKey As Long
    Dim TmpSNum As String * 255
    Retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
    "System\CurrentControlSet\Control\Session Manager\Environment", 0&, KEY_READ, hKey)
    If Retval <> 0 Then
        MsgBox "Der Schlüssel konnte nicht geöffnet werden."
        Exit Sub
    End If
    Retval = RegQueryValueEx(hKey, "Path", 0, REG_SZ, _
    ByVal TmpSNum, Len(TmpSNum))
    If Retval <> 0 Then
        MsgBox "Der Schlüsselwert konnte nicht gelesen oder gefunden werden."
        Exit Sub
    End If
    MsgBox "Path: " & Left$(TmpSNum, InStr(1, TmpSNum, vbNullChar) - 1), , "Produkt-Key"
    Retval = RegCloseKey(hKey)
End Sub

Praktische Beispiele

Ein praktisches Beispiel zur Nutzung der setx.exe:

setx MY_VARIABLE "5"

Nachdem diese Umgebungsvariable gesetzt wurde, kannst du den oben genannten VBA-Code verwenden, um den aktuellen Wert auszulesen.


Tipps für Profis

  • Achte darauf, dass Änderungen an Umgebungsvariablen möglicherweise erst nach einem Neustart von Excel sichtbar werden.
  • Verwende nullterminierte Strings, um sicherzustellen, dass keine unerwünschten Zeichen bei der Rückgabe von Werten auftreten.
  • Halte deine VBA-Referenzen aktuell, um Komplikationen zu vermeiden.

FAQ: Häufige Fragen

1. Wie oft kann ich eine Umgebungsvariable ändern? Du kannst eine Umgebungsvariable so oft ändern, wie du möchtest. Jede Änderung wird jedoch erst nach einem Neustart von Excel oder des Systems wirksam.

2. Warum wird der Wert der Umgebungsvariable nicht aktualisiert? Wenn du setx.exe verwendest, kann es sein, dass Excel den Wert aus dem Systemstartcache liest. In solchen Fällen solltest du den Wert direkt aus der Registry lesen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige