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

umgebungsvariable setzen per VBA in 64bit

Forumthread: umgebungsvariable setzen per VBA in 64bit

umgebungsvariable setzen per VBA in 64bit
14.03.2019 09:16:29
Leo
Hallo Allerseits,
zunächst einmal ein großes Danke für dieses Forum mit den vielen hilfreichen Infos und nützlichen Hilfestellungen!

Hier in kurz meine Problemstellung für die ich Hilfe benötige:


Wie kann ich aus VBA Umgebungsvariablen setzen?
Ich habe im Internet bereits Anleitungen gefunden, aber die scheinen alle nur für 32bit zu funktionieren. Da ich aber sowohl Windows als auch Office in 64 bit habe, funktionieren diese Lösungen bei mir nicht.
Private Declare Function SetEnvironmentVariable _
Lib "kernel32.dll" _
Alias "SetEnvironmentVariableA" ( _
ByVal lpName As String, _
ByVal lpValue As String _
) As Long
Public Sub SetVar(strName As String, strValue As String)
Call SetEnvironmentVariable(strName, strValue)
End Sub
(ab hier der Kontext dazu, falls das relevant ist)
Ich habe ein Macro programmiert, das in Excel Seiten erstellt, die dann in ein PDF mit integriertem Briefpapier exportiert werden sollen.
Ich nutze dafür den PDF24 Drucker.
Für die vollständige Automatisierung fehlt mir jetzt nur noch der Schritt, dass ich den Namen der PDF Datei irgendwie per VBA bestimmen kann (einfach nur als PDF speichern geht meines Wissens nicht, weil es dabei dann nicht die Funktion mit dem Briefpapier gibt wie bei PDF24). Ich habe rausgefunden, dass man bei PDF24 das so einstellen kann, dass in den Namen eine Umgebungsvariable eingesetzt wird. Daher wollte ich es so lösen, dass vba den Namen in solch eine Variable schreibt.
Vielen Dank im Voraus!
Leo
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: umgebungsvariable setzen per VBA in 64bit
14.03.2019 09:23:30
Nepumuk
Hallo Leo,
versuch es mal so:
Private Declare PtrSafe Function SetEnvironmentVariableA Lib "kernel32.dll" ( _
ByVal lpName As String, _
ByVal lpValue As String) As Long
Public Sub SetVar(strName As String, strValue As String)
Call SetEnvironmentVariableA(strName, strValue)
End Sub

Gruß
Nepumuk
Anzeige
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 09:58:03
Leo
Hallo Nepumuk, vielen Dank für die Antwort.
Ich habe jetzt folgendes ausprobiert:
Private Declare PtrSafe Function SetEnvironmentVariableA Lib "kernel32.dll" (ByVal lpName As  _
String, ByVal lpValue As String) As Long
Public Sub SetVar(strName As String, strValue As String)
Call SetEnvironmentVariableA(strName, strValue)
End Sub
Sub varsetzen()
SetVar dateiname, "test"
End Sub

Dann habe ich varsetzen per F5 Taste ausgeführt. Dann kommt folgender Fehler:
"Fehler beim Kompilieren:
Nach End Sub, End Function oder End Property können nur Kommentare stehen"

dann wird die erste Zeile ("private declare....") markiert.
Hab ich da jetzt was bestimmtes übersehen oder hängt das mit dem ursprünglichen Problem zusammen?
Liebe Grüße,
Leo
Anzeige
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 12:12:28
Nepumuk
Hallo Leo,
die Zeile: Private Declare PtrSafe Function... muss oberhalb von allen Prozeduren im Modul stehen.
Gruß
Nepumuk
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 12:24:23
Leo
ah, ok danke, das wusste ich nicht.
Jetzt hab ichs nochmal probiert, jetzt kommt der Fehler
"Fehler beim Kompilieren:
Argumenttyp ByRef unverträglich"

Anzeige
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 12:25:24
Leo
(markiert wird dann
Sub varsetzen()
)
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 12:34:31
Nepumuk
Hallo Leo,
die "Variable" Dateiname ist nicht deklariert. Wenn das der Name der Umgebungsvariablen sein soll, dann musst du sie in Anführungszeichen setzen.
Gruß
Nepumuk
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 12:33:11
Leo
oh, ich hatte die Anführungszeichen vergessen...
Jetzt kommen keine Fehlermeldungen mehr. Wenn ich allerdings in der Eingabeaufforderung mit dem Befehl set die Umgebungsvariablen anschaue, ist meine Variable dort nicht zu finden...
Anzeige
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 15:37:50
Nepumuk
Hallo Leo,
ich hab mal nachgeschaut. Um eine neue Umgebungsvariable zu erzeugen ist etwas mehr Aufwand notwendig.
Teste mal:
Option Explicit

Private Declare PtrSafe Function SetEnvironmentVariableA Lib "kernel32.dll" ( _
    ByVal lpName As String, _
    ByVal lpValue As String) As Long
Private Declare PtrSafe Function SHSetValueA Lib "shlwapi.dll" ( _
    ByVal hKey As Long, _
    ByVal pszSubKey As String, _
    ByVal pszValue As String, _
    ByVal dwType As Long, _
    ByRef pvData As String, _
    ByVal cbData As Long) As Long
Private Declare PtrSafe Function SendMessageTimeoutA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal msg As Long, _
    ByVal wParam As LongPtr, _
    ByVal lParam As String, _
    ByVal fuFlags As Long, _
    ByVal uTimeout As Long, _
    ByRef lpdwResult As LongPtr) As LongPtr

Private Const REG_EXPAND_SZ As Long = 2
Private Const HWND_BROADCAST As LongPtr = &HFFFF&
Private Const WM_WININICHANGE As Long = &H1A
Private Const HKEY_CURRENT_USER As Long = &H80000001
Private Const SMTO_ABORTIFHUNG As Long = &H2

Private Sub SetEnvironmentVar(ByVal strEnvName As String, ByVal strEnvValue As String)
    Dim lngptrReturn As LongPtr
    Call SetEnvironmentVariableA(strEnvName, strEnvValue)
    lngptrReturn = SHSetValueA(HKEY_CURRENT_USER, "Environment", strEnvName, REG_EXPAND_SZ, _
        ByVal strEnvValue, LenB(StrConv(strEnvValue, vbFromUnicode)) + 1)
    Call SendMessageTimeoutA(HWND_BROADCAST, WM_WININICHANGE, 0, _
        "Environment", SMTO_ABORTIFHUNG, 5000, lngptrReturn)
End Sub

Public Sub Main()
    Const ENV_VAR_NAME As String = "dateiname"
    Const ENV_VAR_VALUE As String = "Test"
    Call SetEnvironmentVar(ENV_VAR_NAME, ENV_VAR_VALUE)
End Sub

Voraussetzung ist, du hast schreibenden Zugriff auf die Registry.
Gruß
Nepumuk
Anzeige
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 15:41:52
Leo
super, das funktioniert. vielen Dank!!
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 18:00:37
Leo
doch noch eine Frage dazu: Wie kann ich machen, dass ich auf diese Function von anderen Projekten/Modulen aus zugreifen kann?
Ich habe alle Private und Dim durch Public ersetzt, aber leider kommt dennoch die Fehlermeldung "Sub oder Function nicht definiert" wenn ich versuche sie aus einem anderen Projekt heraus aufzurufen.
LG Leo
Anzeige
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 19:42:30
Nepumuk
Hallo Leo,
Sub's in anderen Projekten kannst du nur per Application.Run - Methode aufrufen.
Gruß
Nepumuk
AW: umgebungsvariable setzen per VBA in 64bit
18.03.2019 20:13:52
Leo
ok vielen Dank.
Gibt es eigentlich unterschiedliche Arten von Umgebungsvariablen? Ich habe nämlich nun eine eigene Umgebungsvariable mit VBA erstellt und kann diese über cmd -> set auch sehen
HNDateiname=Test

aber wenn ich mit PDF24 eine Datei abspeichere passiert nichts, wobei es mit anderen Umgebungsvaiablen einwandfrei funktioniert. z.B. mit %USERNAME% oder %yoticvar% (letztere hatte ich mal per VBScript oder so erstellt, also ist es auch eine eigene). Nur die aus VBA nimmt er irgendwie nicht...
Anzeige
AW: umgebungsvariable setzen per VBA in 64bit
19.03.2019 06:52:36
Nepumuk
Hallo Leo,
keine Ahnung. Ich stell die Frage auf offen.
Gruß
Nepumuk
AW: umgebungsvariable setzen per VBA in 64bit
19.03.2019 11:33:54
Leo
kann es sein, dass die erst nach einem Neustart irgendwo anders eingelesen werden oder so?
Falls jemand eine Idee hat, wie man das umgehen kann wäre ich sehr dankbar, weil falls ein Neustart erforderlich wäre, wäre ja die ganze Automatisierung hinfällig...
LG Leo
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Umgebungsvariablen in VBA für 64-Bit Windows setzen


Schritt-für-Schritt-Anleitung

Um Umgebungsvariablen in VBA für 64-Bit Windows zu setzen, gehe wie folgt vor:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Neues Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" und wähle Einfügen > Modul.

  3. Code einfügen: Kopiere den folgenden Code in das neue Modul:

    Private Declare PtrSafe Function SetEnvironmentVariableA Lib "kernel32.dll" ( _
       ByVal lpName As String, _
       ByVal lpValue As String) As Long
    
    Public Sub SetVar(strName As String, strValue As String)
       Call SetEnvironmentVariableA(strName, strValue)
    End Sub
    
    Sub varsetzen()
       SetVar "dateiname", "test"
    End Sub
  4. Makro ausführen: Drücke F5, um das Makro varsetzen auszuführen. Damit wird die Umgebungsvariable gesetzt.


Häufige Fehler und Lösungen

  • Fehler beim Kompilieren: Wenn du den Fehler "Nach End Sub, End Function oder End Property können nur Kommentare stehen" erhältst, stelle sicher, dass die Private Declare-Anweisung oberhalb aller Prozeduren im Modul steht.

  • Argumenttyp ByRef unverträglich: Dieser Fehler tritt auf, wenn du eine nicht deklarierte Variable verwendest. Stelle sicher, dass der Name der Umgebungsvariable in Anführungszeichen gesetzt wird.

  • Umgebungsvariable nicht sichtbar: Wenn die Umgebungsvariable nicht in der Eingabeaufforderung angezeigt wird, kann es sein, dass sie nicht richtig gesetzt wurde, oder dass du schreibenden Zugriff auf die Registry benötigst.


Alternative Methoden

Eine alternative Methode, um Umgebungsvariablen zu setzen, ist die Verwendung von Registry-Funktionen. Hier ein Beispiel:

Private Declare PtrSafe Function SHSetValueA Lib "shlwapi.dll" ( _
    ByVal hKey As Long, _
    ByVal pszSubKey As String, _
    ByVal pszValue As String, _
    ByVal dwType As Long, _
    ByRef pvData As String, _
    ByVal cbData As Long) As Long

Private Const HKEY_CURRENT_USER As Long = &H80000001
Private Const REG_EXPAND_SZ As Long = 2

Public Sub SetEnvironmentVar(strEnvName As String, strEnvValue As String)
    Call SHSetValueA(HKEY_CURRENT_USER, "Environment", strEnvName, REG_EXPAND_SZ, strEnvValue, Len(strEnvValue) + 1)
End Sub

Diese Methode erfordert, dass du schreibenden Zugriff auf die Registry hast.


Praktische Beispiele

Hier sind einige praktische Beispiele für das Setzen von Umgebungsvariablen:

  • Um eine Umgebungsvariable für den Dateinamen zu setzen:

    Call SetEnvironmentVar("dateiname", "Test")
  • Um eine Umgebungsvariable für den Benutzer zu setzen:

    Call SetEnvironmentVar("USERNAME", "DeinName")

Du kannst die Umgebungsvariablen dann über die Eingabeaufforderung mit dem set-Befehl überprüfen:

set

Tipps für Profis

  • Zugriffsrechte: Achte darauf, dass du die erforderlichen Berechtigungen hast, um Umgebungsvariablen zu setzen. Dies kann bei einigen Unternehmensumgebungen notwendig sein.

  • Umgebungsvariablen in der Registry: Wenn du eine Umgebungsvariable über die Registry setzt, wird sie möglicherweise erst nach einem Neustart oder einer Abmeldung wirksam. Teste dies, indem du die Umgebungsvariable nach dem Setzen erneut überprüfst.

  • Fehlersuche: Nutze Debugging-Tools in VBA, um den Code Schritt für Schritt durchzugehen und Fehler zu identifizieren.


FAQ: Häufige Fragen

1. Wie kann ich auf die gesetzte Umgebungsvariable in anderen Projekten zugreifen?
Du kannst die Application.Run-Methode verwenden, um auf Subroutinen in anderen Projekten zuzugreifen.

2. Warum wird meine Umgebungsvariable nicht in PDF24 erkannt?
Es kann sein, dass die Umgebungsvariable in PDF24 nicht verfügbar ist, bis das Programm neu gestartet wird. Überprüfe, ob dies der Fall ist.

3. Welche Arten von Umgebungsvariablen gibt es?
Es gibt verschiedene Arten von Umgebungsvariablen, einschließlich Benutzervariablen und Systemvariablen. Benutzervariablen sind spezifisch für den aktuellen Benutzer, während Systemvariablen für alle Benutzer gelten.

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