VBA (Excel) Umgebungsvariable setzen

Hallo Wissende,

mit folgendem Code möchte ich eine UmgebungsVariable „MeineBilder“ mit dem Wert „F:“ setzen, was dem alten DOS-Befehl „Set MeineBilder=F:“ entspräche.
Leider wird sie nicht gesetzt, zumindest nicht für mich wiederfindbar.
Wie setzte ich also eine Umgebungsvariable mittels VbA?

Option Explicit
Declare Function SetEnvironmentVariable& Lib "kernel32" Alias \_
"SetEnvironmentVariableA" (ByVal lpName As String, ByVal lpValue As String)
'
Sub test()
Dim SE, N
' Umgebngsvariable wird nicht gesetzt ?
SE = SetEnvironmentVariable("MeineBilder", "F:\")
MsgBox SE ' 1 wird angezeigt, also erfolgreich laut API-Guide
For N = 1 To 100
 If Environ(N) "" Then MsgBox Environ(N) 'Nix zu sehen von "MeineBilder"
Next N
End Sub

Gruß
Reinhard

Hallo,

getestet WinXP Prof, Excel 2002:

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 Declare Function SetEnvironmentVariable Lib "kernel32" Alias "SetEnvironmentVariableA" \_
 (ByVal lpName As String, ByVal lpValue As String) As Long

Sub SetzeMeinPfad()
 SetEnvironmentVariable "MeinPfad", "Y:"
 Debug.Print "MeinPfad = " & GetEnvironmentVar("MeinPfad")
 Debug.Print Shell("CMD /K SET MeinPfad", vbNormalFocus)
End Sub

Function GetEnvironmentVar(Name As String) As String
 GetEnvironmentVar = String(255, 0)
 GetEnvironmentVariable Name, GetEnvironmentVar, Len(GetEnvironmentVar)
 GetEnvironmentVar = TrimNull(GetEnvironmentVar)
End Function

Private Function TrimNull(item As String)
 'Rekursiv das Nul aus dem String entfernen
 item = item & vbNullChar 'wir wollen mindestens ein NULL haben
 Dim iPos As Long
 iPos = InStr(item, vbNullChar)
 TrimNull = IIf(iPos \> 0, Left$(item, iPos - 1), item)
End Function

Das funktioniert.

Gruß, Bernd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Bernd,

ich habe es ausprobiert. Scheinbar benutzen Environ (Excel-Vba) und Set (Dos,Cmd) eine andere Umgebung für die Variablen als GetEnvironmentVariable/SetEnvironmentVariable (API).

Denn mit SetEnvironmentVariable gestzte Variablen sind nur mit GetEnvironmentVariable auszulesen, nicht mit Set, Environ.

Nachstehend das Testmakro „SetzeMeinPfad()“.

Danke ^Gruß
Reinhard

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 Declare Function SetEnvironmentVariable Lib "kernel32" Alias \_
 "SetEnvironmentVariableA" (ByVal lpName As String, ByVal lpValue As String) \_
 As Long
'
Sub SetzeMeinPfad()
 SetEnvironmentVariable "MeinPfad", "Y:"
 MsgBox "MeinPfad = " & GetEnvironmentVar("MeinPfad")
 MsgBox Shell("CMD /c SET MeinPfad", vbNormalFocus)
 MsgBox Shell("CMD /c SET \> f:\t.txt", vbNormalFocus)
 MsgBox Environ("MeinPfad") 'wird nicht gefunden
 MsgBox Shell("CMD /c SET MeinPfad=""123""", vbNormalFocus) 'bringt nix
 MsgBox "MeinPfad = " & GetEnvironmentVar("MeinPfad") ' immer noch "Y:"
End Sub
'
Sub Nachpruefen()
 MsgBox Shell("CMD /c SET \> f:\t.txt", vbNormalFocus)
End Sub
'
Function GetEnvironmentVar(Name As String) As String
 GetEnvironmentVar = String(255, 0)
 GetEnvironmentVariable Name, GetEnvironmentVar, Len(GetEnvironmentVar)
 GetEnvironmentVar = TrimNull(GetEnvironmentVar)
End Function
' 
Private Function TrimNull(item As String)
 'Rekursiv das Nul aus dem String entfernen
 item = item & vbNullChar 'wir wollen mindestens ein NULL haben
 Dim iPos As Long
 iPos = InStr(item, vbNullChar)
 TrimNull = IIf(iPos \> 0, Left$(item, iPos - 1), item)
End Function