Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Variable Projektübergreifend nutzen

Betrifft: Variable Projektübergreifend nutzen von: Edmund
Geschrieben am: 21.10.2020 10:38:28

Hallo Ihr

Ich habe da mal wieder eine interessante Aufagbe.

Von einer Quelldatei sollen Zellen in eine Zieldatei kopiert werden.
Leider ist der Name der Quelldatei nicht bekannt.
Bisher helfe ich mir so, dass ich den Nutzern sage, sie sollen alle Arbeitsmappen schließen, dann erst die Quelldatei und anschließend die Zieldatei öffnen. Mit dem Makro der Zieldatei spreche ich die Quelle dann per workbooks(1) an.
Das ist natürlich etwas holprig.

Viel besser wäre:
Beim öffnen der Quelldatei wird der Dateiname automatisch in eine Variable gelesen, auf die ich dann im Makro der Zieldatei zugreifen kann.
Die Frage ist: Wie muss die Variable deklariert werden, damit das funktioniert?
Hab es mit Public strDateiname As String versucht, aber das funzt nicht.
Gibt es da überhaupt eine Lösung?

Danke schon mal für Eure Antworten

Betrifft: AW: Variable Projektübergreifend nutzen
von: ChrisL
Geschrieben am: 21.10.2020 11:23:47

Hi

Wenn du die Quelldatei aus der Zieldatei heraus öffnen würdest (z.B. FileOpen Dialog), dann wäre die Quelldatei nachher bekannt. In eine Situation wie von dir beschrieben, bin ich bisher noch nie gekommen, aber theoretisch kannst du die Variable an die andere Mappe übergeben.

Beispiel Zieldatei:
Public x As String

Sub UebergebeVariable(strInput As String)
x = strInput
End Sub

Sub t()
MsgBox x
End Sub

Beispiel Quelldatei:
Sub Uebergabe()
Application.Run "Zieldatei.xlsm!UebergebeVariable", ThisWorkbook.Name
End Sub

cu
Chris

Betrifft: AW: Variable Projektübergreifend nutzen
von: Rudi Maintaire
Geschrieben am: 21.10.2020 11:29:21

Hallo,
warum öffnest du die Quelldatei nicht per Makro aus der Zieldatei heraus?
Schema:
Sub aaaa()
  Dim strQ As String, wkbQ As Workbook
  With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .Title = "Quelle öffnen"
    If .Show = -1 Then strQ = .SelectedItems(1)
  End With
  If Len(strQ) Then
    Set wkbQ = Workbooks.Open(strQ)
  Else
    Exit Sub
  End If
  'dein Code
End Sub

Gruß
Rudi

Betrifft: AW: Variable Projektübergreifend nutzen
von: Edmund
Geschrieben am: 21.10.2020 11:45:47

Danke für Eure Antworten.

Es ist so:
Die Quelldatei ist im Normalfall immer geöffnet, da mit dieser gearbeitet wird. Alle 24 Wochen bekommt sie einen neuen Namen, weshalb ich gesagt habe, name unbekannt.
Einmal im Monat sollen aus dieser Datei einige Daten zum weiteren Bearbeiten kopiert werden.

Stimmt natürlich, ich kann die Quelle auch per Makro öffnen. Da sie aber im Normalfall eh offen ist, müsste sie dann davor aber, wie jetzt auch, erstmal gespeichert und geschlossen werden.
Damit ist zur bisherigen Methode kein wirklicher Gewinn da.

Auch den Namen aktiv übergeben geht zwar so vermutlich, aber am liebsten wäre mir halt einfach eine Variable, die von beiden Dateien genutzt werden kann

Betrifft: AW: Variable Projektübergreifend nutzen
von: Sigi.21
Geschrieben am: 21.10.2020 12:00:28

Hallo,

zuerst sagst du, "Leider ist der Name der Quelldatei nicht bekannt" und jetzt sagst du "Die Quelldatei ist im Normalfall immer geöffnet".
Wenn sie offen ist dann kennst du sie doch! Nimm sie einfach in eine Objektvariable.

Dim Quelle as Workook
Set Quelle = Active.Workbook
...

Sigi

Betrifft: AW: Variable Projektübergreifend nutzen
von: Edmund
Geschrieben am: 21.10.2020 12:10:43

Hallo Sigi

Sorry, dann habe ich mich etwas unglücklich ausgedrückt.
Ich meinte damit natürlich, dass ich in meinem Makro die Datei nicht mit Namen ansprechen kann, weil der sich alle paar Wochen ändert.

Dann schau ich mal, ob ich ds mit der Objektvariablen hinbekomme
Kann ich die dann von meinem Ziel aus nutzen?
Sorry, meine vba Kenntnisse sind halt wirklich nur rudimentär

Betrifft: AW: Variable Projektübergreifend nutzen
von: Sigi.21
Geschrieben am: 21.10.2020 12:20:58

Hallo,

es kommt auch darauf an, in welcher Mappe dein Code steckt. In meinem simplen Bsp. muss die Quelldatei aktiv sein, ansonsten brauchst du doch den Namen: Set Quelle = Workbooks("Name.xlsx")
Bei Quelle und Ziel solltest du beide in eine Objektvariable stecken, dann kannst du sie entsprechend anteuern.

Sigi

Betrifft: AW: Variable Projektübergreifend nutzen
von: Edmund
Geschrieben am: 21.10.2020 12:42:02

Hallo Sigi

Danke für Deine Mühe

Aktiv ist die Zieldatei.
In der befindet sich das Makro für den Datentransfer.
Set Quelle = Workbooks("Name.xlsx") kann ich also nicht nutzen, weil sich der Name ja alle paar Wochen ändert.
Ich denke ich belasse es beim bisherigen "erst Quelle dann Ziel öffnen und alles andere schließen", weil dann weiß ich, dass meine Quelle Workbooks(1) heißt.
Ich denke, einmal im Monat kann man das dem Kollegen zumuten :)

Ich hatte halt gehofft, dass ich beim öffnen der Quelle unter Private Sub workbook_open() gleich einer Variablen den Namen zuteilen und später mit dem Makro der Zieldatei auslesen kann.

Viele Grüße

Edmund

Betrifft: AW: Variable Projektübergreifend nutzen
von: Sigi.21
Geschrieben am: 21.10.2020 13:18:10

Hallo Edmund,

dann lass die Quelldatei vom User öffnen, und dabei setzt du die Objektvariable QM (f. Quelle) (s. Bsp.)

Sigi

https://www.herber.de/bbs/user/141002.xlsm

Betrifft: AW: Variable Projektübergreifend nutzen
von: ChrisL
Geschrieben am: 21.10.2020 12:41:28

Hi Edmund

Nebst dem bereits aufgezeigten Weg (es kann natürlich anstelle des Strings auch das Objekt übergeben werden), könnte man ggf. noch das "Muster" des Dateinamens zur Identifikation der richtigen Datei verwenden z.B. fixerTEXT_variablesDatum.xlsm

Für einen konkreten Vorschlag müsste man das "Muster" der Dateibezeichnung kennen.

cu
Chris

Betrifft: AW: Variable Projektübergreifend nutzen
von: Edmund
Geschrieben am: 21.10.2020 12:56:31

Hallo Chris

Danke für Deine Antwort

oweh, das Muster wäre:
Jahr-lfdNr Kalenderwoche-Kalenderwoche.xlsm
wobei die differenz der KW immer 24 ist.
Wenn dann aber noch ein Jahreswechsel dabei ist, wird der Dateiname erst richtig abenteuerlich.
Das können wir glaub ich vergessen.

Und das mit dem Übergeben gestaltet sich von daher auch schwierig, weil der Name der Zieldatei auch jeden Monat ein anderer ist. Und zuletzt, wenn ich das richtig verstanden habe, müsste man die Übergabe des Namens von der Quelldatei aus starten. Ich denke, das wird für den User komplizierter, als wenn er dann halt einmal im Monat für den Transfer alle anderen Mappen schließen muss, damit ich die Quelle mit Workbooks(1) ansprechen kann.

Wenn es, so wie es sich für mich jetzt darstellt, keine Möglichkeit gibt, eine Variable zu deklarieren, die Projektübergreifend nutzbar ist, werde ich wohl an der bisherigen Lösung festhalten.

Viele Grüße

Edmund

Betrifft: AW: Variable Projektübergreifend nutzen
von: peterk
Geschrieben am: 21.10.2020 13:16:19

Hallo

Du könntest eine Systemvariable definieren z.B. (In Quelle)

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim objUserEnvVars As Object
    Set objUserEnvVars = CreateObject("WScript.Shell").Environment("User")
    objUserEnvVars.Item("ItsMe") = ""
    Set objUserEnvVars = Nothing

End Sub

Private Sub Workbook_Open()
    Dim objUserEnvVars As Object
    Set objUserEnvVars = CreateObject("WScript.Shell").Environment("User")
    objUserEnvVars.Item("ItsMe") = ThisWorkbook.Name
    Set objUserEnvVars = Nothing
End Sub

Definiert die Sytemvariable "ItsMe" beim Öffnen und löscht sie wieder beim schliesen.

In Ziel kannst Du nun die Variable abfragen (wenn nicht vorhanden, dann ist die Quelle nicht offen)
Sub CheckQuelle()
    
    Dim objUserEnvVars As Object
    Dim strEnvVar As String
    
    Set objUserEnvVars = CreateObject("WScript.Shell").Environment("User")
    strEnvVar = objUserEnvVars.Item("ItsMe")
    If strEnvVar = "" Then
        MsgBox "Quelle ist nicht offen"
    Else
        MsgBox "Benutze Quelle: " & strEnvVar
    End If
    
    Set objUserEnvVars = Nothing
    
End Sub


Peter

Betrifft: AW: Variable Projektübergreifend nutzen
von: Edmund
Geschrieben am: 21.10.2020 14:09:11

Hallo peterk

Goil das!
Genau so etwas habe ich gesucht.
Ich weiß zwar (noch) nicht genau, was dein Script im Detail macht, aber es funktioniert.
Damit kann ich etwas anfangen.

Vielen Dank

Beiträge aus dem Excel-Forum zum Thema "Variable Projektübergreifend nutzen"