Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Update einspielen

Begonnen von Blaupunkt79, März 07, 2026, 09:53:42

⏪ vorheriges - nächstes ⏩

Blaupunkt79

Moin Zusammen,

ich habe eine Excel Datei mit Makros erstellt, die Deutschland im Einsatz ist. Regelmäßig arbeite ich weiter an diesem Tool (Fehlerbeseitigung sowie neue Funktionen).

Bisher bin ich folgendermaßen Vorgegangen, damit alle anderen User ebenfalls von den Erweiterungen profitieren können.

Abgleich der Versionsnummern, bei vorhandener neuer Version, kann der User diese Herunterladen (Firmen Sharepoint), sich einen Ordner auswählen, sein "altes" Tool schließen und per Copy & Paste die neue Version ersetzen, funktioniert erstmal soweit.

Ich bin fälschlicherweise davon ausgegangen, dass diese Vorgehensweise einfach zu bedienen ist, leider tun sich da einige User sehr schwer und es herrscht immer "Panik", sobald die Meldung "Neue Version vorhanden" aufploppt. Mir ist bewußt, dass Menschen mein Tool nur dann nutzen, wenn es für sie einfach zu bedienen ist, diese "Panik" wird also nur dazu führen, dass man es eher ignoriert, anstatt sich damit auseinanderzusetzen.

Welche Vorschläge hättet Ihr, damit ich es dem Enduser noch einfacher machen kann? Sozusagen ein automatisches Ersetzen des Tools durch die neue Version. Nach meinem Verständnis benötige ich dafür ein drittes "Programm/Script", welches den "Tausch" durchführt oder? Ein laufendes Programm kann ich ja nicht ersetzen.

Danke Euch

Grüße



Knobbi38

#1
Klar kannst du ein Script vorschalten. Dafür würde sich AutoIt anbieten.

Alternativ hier ein Pseudocode, den du an deine Verhältnisse anpassen müßtest:
Sub AutoUpdate()
  If FileExists(ActiveWorkbook.FullName & ".upd")  Then
    Dim wkb As Workbook
    Dim curFilename As String
   
    Set wkb = ActiveWorkbook
    curFilename = ActiveWorkbook.FullName
   
    wkb.SaveAs curFilename & ".bak"
    Workbooks.Open curFilename & ".upd"
    ActiveWorkbook.SaveAs curFilename
    wkb.Close SaveChanges:=False
  End If 
End Sub

Knobbi38

Blaupunkt79

Moin Knobbi,

Danke für Dein Input, bin jetzt schon soweit, dass mein "Script" aus dem Excel Tool übernimmt. Ich muss alles in VBA schreiben, um Adminrechte zu umgehen.

Das "Script" arbeitet mit der Workbook_Open Methode und springt direkt in ein Modul rein. Es wird eine Textdatei eingelesen, in der das Excel Tool verschiedene Dateipfade gespeichert hat:
a(0) = Pfad meines "Scriptes"
a(1) = Pfad Alte Version Tool
a(2) = Pfad Neue Version Tool
a(3) = Versionsnummer

Anschließend wird mein altes Tool geschlossen und gelöscht, danach soll die neue Version geladen werden. Allerdings passiert nach dem schließen des alten Tools nichts mehr. Wo liegt der Fehler, ich übergebe doch wieder an mein "Script"? Später soll dann das neue Tool geöffnet werden und mein "Script" sich schließen. Beim Start des neuen Tools erfolgt dann der Hinweis, dass das Update mit Version XY erfolgreich war.

Sub Start()
Dim Jetzt As Workbook
Dim myFSO As Object
Dim FSO As Object
Dim excwb As Workbook
Dim a(4) As String
Set Jetzt = ThisWorkbook
If Dir(ActiveWorkbook.Path & "\U_000001.txt") = "" Then Exit Sub
b = 0
'Textdatei lesen
Dim strDatei As String, strZeile As String
   strDatei = ActiveWorkbook.Path & "\U_000001.txt"
   Open strDatei For Input As #1
   Do Until EOF(1)
      Line Input #1, strZeile
      a(b) = strZeile
      b = b + 1
   Loop
   Close #1
Set excwb = Workbooks.Open(a(1))
excwb.Close SaveChanges:=False
Set excwb = Nothing
Jetzt.Activate

'altes Tool löschen
Kill a(1)
'neues Tool kopieren
myFSO.copyfile a(2), a(1), True
If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then Kill ActiveWorkbook.Path & "U_000001.txt"
Dim ts As Object  ' TextStream
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
   
strDatei = ActiveWorkbook.Path & "\U_000001.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ts = FSO.CreateTextFile(strDatei, True)
ts.Writeline "1"
ts.Writeline ActiveWorkbook.Path & "\BLSCC_Master_DB_deutsch.xlsm"
ts.Writeline ActiveWorkbook.Path & "\U_000001.txt"
ts.Writeline a(3)

ts.Close
Set ts = Nothing
Set FSO = Nothing

'neues Tool öffnen
Dim Wksh_Q As Workbook
Dim WkSh_Z As Workbook

Set Wksh_Q = ThisWorkbook
Set WkSh_Z = Workbooks.Open(Filename:=a(1))

Wksh_Q.Close SaveChanges:=False
WkSh_Z.Activate

End Sub

Knobbi38

Hallo,

mir ist nicht ganz klar, wo jetzt deine Prozedur abläuft. Das Beispiel von mir befindet sich in einem Modul, welches sowohl in der alten als auch in der neuen XL-Datei enthalten ist.

Du kannst dir natürlich nicht selbst den "Boden unter den Füssen" wegziehen und musst schon aufpassen, in welcher Reihenfolge was ausgeführt wird. Die Reihenfolge in meinem Beispiel sollte eigentlich stimmen.

Noch eine Anmerkung am Rande:
Wenn du schon das FSO verwendest, solltest du es auch durchgängig verwenden und nicht zwischen VBA Anweisungen und FSO wechseln, z.B. beim Lesen/Schreiben von Dateien, Prüfen, ob eine Datei existiert usw.

Wieso überhaupt eine derart strukturierte Textdatei? Wenn es unbedingt eine externe Datei sein muss, dann sollte es zumindest eine INI-Datei sein. Das ist auf jeden Fall intuitiver und besser lesbar.

Knobbi38

Blaupunkt79

Moin Knobbi,

ich versuche es zu erläutern, der Benutzer öffnet mein Tool, existiert ein Update, so erscheint folgendes Bild:



Der Benutzer wählt einen Ordner aus (Textbox7, möchte ich später automatisieren) und klickt auf "Version herunterladen". Anschließend wird folgender Code ausgeführt:


a = 0
Call lesen
Label182.Visible = False
If Dir("T:\Transfer TG\BL-Tool\Experiment\BLSCC_Master_DB_deutsch.xlsm") = "" Then MsgBox ("Masterdatei auf dem Server nicht gefunden!"): Exit Sub
If Dir("T:\Transfer TG\BL-Tool\Experiment\Update.xlsm") = "" Then MsgBox ("Datei für automatisches Update auf dem Server nicht gefunden!"): a = 88
If TextBox7 = "" Then MsgBox ("Bitte vorher Verzeichnis auswählen!"): Exit Sub
If Dir(TextBox7, vbDirectory) = "" Then MsgBox ("Verzeichnis ist nicht erreichbar!"): Exit Sub
If laufwerk_start = TextBox7 & "\" Then MsgBox ("In diesem Ordner befindet sich das aktuell aktive BL-Tool, bitte daher anderen Ordner wählen!"): Exit Sub
If Left(TextBox7, 1) = "T" Then MsgBox ("Bitte BL-Tool nicht im Laufwerk T herunterladen!"): Exit Sub
If Dir(TextBox7 & "\BLSCC_Master_DB_deutsch.xlsm") <> "" Then Kill TextBox7 & "\BLSCC_Master_DB_deutsch.xlsm"
'BL Tool kopieren
Dim myFSO As Object
Dim FSO As Object
Dim objOrdner As Object
Set myFSO = CreateObject("Scripting.FileSystemObject")
Label182.Visible = True
DoEvents
myFSO.copyfile "T:\Transfer TG\BL-Tool\Experiment\BLSCC_Master_DB_deutsch.xlsm", TextBox7 & "\BLSCC_Master_DB_deutsch.xlsm", True
'Update Datei kopieren
If a = 0 Then myFSO.copyfile "T:\Transfer TG\BL-Tool\Experiment\Update.xlsm", laufwerk_start & "Update.xlsm", True

Label182.Visible = False

If Image96.Visible = False And a = 88 Then MsgBox ("Neue Version vom BL-Tool heruntergeladen, bitte beenden Sie das Tool, ersetzen es und starten neu! Die Datenbanken brauchen hierbei nicht gelöscht werden!"): Exit Sub
If Image96.Visible = True And a = 88 Then MsgBox ("Neue Version vom BL-Tool heruntergeladen, bitte beenden Sie das Tool, ersetzen es und starten neu! Die Datenbanken bitte vorher ALLE löschen!"): Exit Sub
'Update Datei öffnen
'Textdatei speichern
Dim ts As Object  ' TextStream
If Dir(laufwerk_start & "U_000001.txt") <> "" Then Kill laufwerk_start & "U_000001.txt"
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
   
strDatei = laufwerk_start & "U_000001.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ts = FSO.CreateTextFile(strDatei, True)
ts.Writeline laufwerk_start & "Update.xlsm"
ts.Writeline laufwerk_start & "BLSCC_Master_DB_deutsch.xlsm"
ts.Writeline TextBox7 & "\BLSCC_Master_DB_deutsch.xlsm"
ts.Writeline TextBox45

ts.Close
Set ts = Nothing
Set FSO = Nothing

admin_04.Hide
Unload admin_04

Dim Wksh_Q As Workbook
Dim WkSh_Z As Workbook

Set Wksh_Q = ThisWorkbook
Set WkSh_Z = Workbooks.Open(Filename:=laufwerk_start & "Update.xlsm")
WkSh_Z.Activate

Wksh_Q.Close SaveChanges:=False


Die Datei "Update" wird heruntergeladen, sozusagen mein Script, dieses wird geöffnet und es übernimmt die Steuerung, mein Tool schließt sich dann.

Im Step 2, löscht mein Script das Tool, kopiert das neue Tool, startet es, übernimmt dann die Steuerung und das Script schließt sich und löscht sich danach wieder.

Step 2, der Code vom Script:

Sub Start()
Dim Jetzt As Workbook
Dim myFSO As Object
Dim FSO As Object
Dim a(4) As String
Set Jetzt = ThisWorkbook
If Dir(ActiveWorkbook.Path & "\U_000001.txt") = "" Then Exit Sub
b = 0
'Textdatei lesen
Dim strDatei As String, strZeile As String
  strDatei = ActiveWorkbook.Path & "\U_000001.txt"
  Open strDatei For Input As #1
  Do Until EOF(1)
      Line Input #1, strZeile
      a(b) = strZeile
      b = b + 1
  Loop
  Close #1
  Dim excwb As Workbook
Set excwb = Workbooks.Open(a(1))
excwb.Close SaveChanges:=False
Set excwb = Nothing
Jetzt.Activate

'altes Tool löschen
Kill a(1)
MsgBox ("gelöscht")
'neues Tool kopieren
myFSO.copyfile a(2), a(1), True
MsgBox ("kopiert")
If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then Kill ActiveWorkbook.Path & "U_000001.txt"
MsgBox ("geschrieben")
Dim ts As Object  ' TextStream
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
   
strDatei = ActiveWorkbook.Path & "\U_000001.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ts = FSO.CreateTextFile(strDatei, True)
ts.Writeline "1"
ts.Writeline ActiveWorkbook.Path & "\BLSCC_Master_DB_deutsch.xlsm"
ts.Writeline ActiveWorkbook.Path & "\U_000001.txt"
ts.Writeline a(3)

ts.Close
Set ts = Nothing
Set FSO = Nothing

'neues Tool öffnen
Dim Wksh_Q As Workbook
Dim WkSh_Z As Workbook

Set Wksh_Q = ThisWorkbook
Set WkSh_Z = Workbooks.Open(Filename:=a(1))

Wksh_Q.Close SaveChanges:=False
WkSh_Z.Activate

End Sub

Step 3, Code bei Start des neuen Tools:

If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then
Dim aa(4) As String
bb = 0
'Textdatei lesen
Dim strDatei As String, strZeile As String
  strDatei = ActiveWorkbook.Path & "\U_000001.txt"
  Open strDatei For Input As #1
  Do Until EOF(1)
      Line Input #1, strZeile
      aa(bb) = strZeile
      bb = bb + 1
  Loop
  Close #1
If aa(0) = "1" Then MsgBox ("Update erfolgreich auf Version >>> " & aa(3) & " <<<!")
If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then Kill ActiveWorkbook.Path & "U_000001.txt"

Else
End If



Knobbi38

Kannst du die Dateien bitte zippen und hier im Forum hochladen? Die meisten Helfer greifen ungern bzw. nicht auf fremde Dateihoster zu.

Knobbi38

Blaupunkt79



War nur das Bild, wenn ein Update vorhanden ist.

Knobbi38

Hallo,

das Bild ist schön, aber leider wertlos. Mit deinen Begrifflichkeiten komme ich leider nicht ganz klar, deshalb wäre ein PAP hier hilfreicher gewesen. Du kennst den von dir gewünschten Ablauf und deine Programmteile, ein Außenstehender versteht aber nur Script und Tool usw. und weiß gar nicht, was du da eigentlich meinst. Das macht die Sache nicht einfacher.

Bitte beschreibe das Ganze anders. Verwende Begriffe wie "Version A", die durch "Version B" ersetzt werden soll, usw. und gib an, welcher Code gerade läuft. Vielleicht trägt das zu einem besseren Verständnis bei.
Bitte beachte, dass der Code insgesamt immer nur in einer Instanz ausgeführt wird, die für einen kurzen Zeitraum mit zwei Workbooks hantiert. Um den Code sauber zwischen den Workbooks zu trennen und ihn asynchron ausführen zu können, kannst du die Prozeduren z. B. mithilfe eines Timers entkoppeln. Ansonsten ziehst du dir mit einem Kill oder Close selbst den Boden unter den Füßen weg.

Halte dich einfach an die in meinem Beispiel vorgegebene Ablauffolge, dann sollte es funktionieren. Alle Aktionen zur Durchführung des Updates werden ausschließlich von der aktuellen Version A aus ausgeführt. Version B wird praktisch nur geladen und bereitgestellt und bleibt nach dem Schließen – nicht Kill! – allein geladen. Wenn du bestimmte Update-Prozeduren ausführen möchtest, sollten diese in Version B bereitgestellt werden und können aus Version A heraus aufgerufen werden. So etwas kann man bequem mit Klassen und Interfaces absichern.

Knobbi38


Blaupunkt79

OK, ich erkläre es anders.

Version A ==> altes Tool
Version B ==> neues Tool
Script ==> Hilfsdatei

Der Nutzer startet Version A, liegt ein Update vor, erscheint obiges Bild. Version B wird in den Downloadordner heruntergeladen. Das Script wird in das Verzeichnis heruntergeladen, indem sich Version A befindet. Dann wird eine Textdatei erzeugt, in der sämtliche Pfade drinnen sind. Anschließend startet Version A das Script und übergibt die Steuerung.

Das Script löscht nun Version A und kopiert Version B in das Pfad von Version A. Anschließend wird eine erneute Textdatei geschrieben, mit Versionsnummer. Das Script startet Version B und übergibt die Steuerung. Version B löscht das Script und sämtliche Textdateien. Thats it, in der Theorie.

Funktionieren tut es allerdings nur bis zur Übernahme des Scriptes und schließen von Version A, dann bleibt es stehen.

Die Reihenfolge der Codes:

1. Version A

a = 0
Call lesen
Label182.Visible = False
If Dir("T:\Transfer TG\BL-Tool\Experiment\BLSCC_Master_DB_deutsch.xlsm") = "" Then MsgBox ("Masterdatei auf dem Server nicht gefunden!"): Exit Sub
If Dir("T:\Transfer TG\BL-Tool\Experiment\Update.xlsm") = "" Then MsgBox ("Datei für automatisches Update auf dem Server nicht gefunden!"): a = 88
If TextBox7 = "" Then MsgBox ("Bitte vorher Verzeichnis auswählen!"): Exit Sub
If Dir(TextBox7, vbDirectory) = "" Then MsgBox ("Verzeichnis ist nicht erreichbar!"): Exit Sub
If laufwerk_start = TextBox7 & "\" Then MsgBox ("In diesem Ordner befindet sich das aktuell aktive BL-Tool, bitte daher anderen Ordner wählen!"): Exit Sub
If Left(TextBox7, 1) = "T" Then MsgBox ("Bitte BL-Tool nicht im Laufwerk T herunterladen!"): Exit Sub
If Dir(TextBox7 & "\BLSCC_Master_DB_deutsch.xlsm") <> "" Then Kill TextBox7 & "\BLSCC_Master_DB_deutsch.xlsm"
'BL Tool kopieren
Dim myFSO As Object
Dim FSO As Object
Dim objOrdner As Object
Set myFSO = CreateObject("Scripting.FileSystemObject")
Label182.Visible = True
DoEvents
myFSO.copyfile "T:\Transfer TG\BL-Tool\Experiment\BLSCC_Master_DB_deutsch.xlsm", TextBox7 & "\BLSCC_Master_DB_deutsch.xlsm", True
'Update Datei kopieren
If a = 0 Then myFSO.copyfile "T:\Transfer TG\BL-Tool\Experiment\Update.xlsm", laufwerk_start & "Update.xlsm", True

Label182.Visible = False

If Image96.Visible = False And a = 88 Then MsgBox ("Neue Version vom BL-Tool heruntergeladen, bitte beenden Sie das Tool, ersetzen es und starten neu! Die Datenbanken brauchen hierbei nicht gelöscht werden!"): Exit Sub
If Image96.Visible = True And a = 88 Then MsgBox ("Neue Version vom BL-Tool heruntergeladen, bitte beenden Sie das Tool, ersetzen es und starten neu! Die Datenbanken bitte vorher ALLE löschen!"): Exit Sub
'Update Datei öffnen
'Textdatei speichern
Dim ts As Object  ' TextStream
If Dir(laufwerk_start & "U_000001.txt") <> "" Then Kill laufwerk_start & "U_000001.txt"
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
   
strDatei = laufwerk_start & "U_000001.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ts = FSO.CreateTextFile(strDatei, True)
ts.Writeline laufwerk_start & "Update.xlsm"
ts.Writeline laufwerk_start & "BLSCC_Master_DB_deutsch.xlsm"
ts.Writeline TextBox7 & "\BLSCC_Master_DB_deutsch.xlsm"
ts.Writeline TextBox45

ts.Close
Set ts = Nothing
Set FSO = Nothing

admin_04.Hide
Unload admin_04

Dim Wksh_Q As Workbook
Dim WkSh_Z As Workbook

Set Wksh_Q = ThisWorkbook
Set WkSh_Z = Workbooks.Open(Filename:=laufwerk_start & "Update.xlsm")
WkSh_Z.Activate

Wksh_Q.Close SaveChanges:=False

2. Script

Sub Start()
Dim Jetzt As Workbook
Dim myFSO As Object
Dim FSO As Object
Dim excwb As Workbook
Dim a(4) As String
Set Jetzt = ThisWorkbook
If Dir(ActiveWorkbook.Path & "\U_000001.txt") = "" Then Exit Sub
b = 0
'Textdatei lesen
Dim strDatei As String, strZeile As String
   strDatei = ActiveWorkbook.Path & "\U_000001.txt"
   Open strDatei For Input As #1
   Do Until EOF(1)
      Line Input #1, strZeile
      a(b) = strZeile
      b = b + 1
   Loop
   Close #1
Set excwb = Workbooks.Open(a(1))
excwb.Close SaveChanges:=False
Set excwb = Nothing
Jetzt.Activate

'altes Tool löschen
Kill a(1)
'neues Tool kopieren
myFSO.copyfile a(2), a(1), True
If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then Kill ActiveWorkbook.Path & "U_000001.txt"
Dim ts As Object  ' TextStream
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
   
strDatei = ActiveWorkbook.Path & "\U_000001.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ts = FSO.CreateTextFile(strDatei, True)
ts.Writeline "1"
ts.Writeline ActiveWorkbook.Path & "\BLSCC_Master_DB_deutsch.xlsm"
ts.Writeline ActiveWorkbook.Path & "\U_000001.txt"
ts.Writeline a(3)

ts.Close
Set ts = Nothing
Set FSO = Nothing

'neues Tool öffnen
Dim Wksh_Q As Workbook
Dim WkSh_Z As Workbook

Set Wksh_Q = ThisWorkbook
Set WkSh_Z = Workbooks.Open(Filename:=a(1))

Wksh_Q.Close SaveChanges:=False
WkSh_Z.Activate

End Sub

3. Version B

If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then
Dim aa(4) As String
bb = 0
'Textdatei lesen
Dim strDatei As String, strZeile As String
  strDatei = ActiveWorkbook.Path & "\U_000001.txt"
  Open strDatei For Input As #1
  Do Until EOF(1)
      Line Input #1, strZeile
      aa(bb) = strZeile
      bb = bb + 1
  Loop
  Close #1
If aa(0) = "1" Then MsgBox ("Update erfolgreich auf Version >>> " & aa(3) & " <<<!")
If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then Kill ActiveWorkbook.Path & "U_000001.txt"

Else
End If

Knobbi38

#10
Hallo,

so langsam wird es deutlicher, was du da veranstaltest, aber anstatt "Script" würde ich es dann doch besser mit Update.xlsm bezeichnen, welche ein entsprechendes Makro enthält. Der Begriff "Script" wird nämlich eher für etwas anderes verwendet und ist hier mehr als irreführend.

Der Workflow stimmt nicht mit meinem Beispiel überein. Zum einen sollte man die VersionA nicht löschen, bevor VersionB auch wirklich sauber läuft, sondern VersionA wird nur umbenannt. Dann sehe ich nicht, wie und wann die Prozedur Start() aus Update.xlsm (Script) gestartet wird. Im Übrigen kann man sowieso auf diesen Zwischenschritt verzichten. VersionA prüft und lädt ggf. VersionB, ruft dann ein Makro in VersionB auf und verabschiedet sich dann, sprich wird aus der aktuellen Instanz entladen.
Ein entsprechendes Beispiel mal im Anhang, damit du das mal im Einzelschritt durchgehen kannst. Die beiden Dateien einfach in einen Ordner extrahieren. Den anderen Schnickschnack kannst du dann später einbauen.

Wenn du wirklich nicht auf den Zwischenschritt verzichten möchtest, dann solltest du dafür kein Excel VBA verwenden, sondern ein Batch-Datei oder eine PowerShell-Script. Das ist dann aber eine andere Baustelle.

Knobbi38










Blaupunkt79

Moin,

der Tipp mit dem Umbenennen war sehr gut, habe ich überhaupt nicht dran gedacht, klar damit spare ich mir den Zwischenschritt.

Kannst Du mir den Unterschied erklären:

1. Methode
Set Wksh_Z = ActiveWorkbook
Wksh_Z.Activate

2. Methode
Application.Run Wksh_Z

Die Application.Run Methode sagt mir gar nix.

Version A benennt sich nun um, Version B speichert sich im gleichen Pfad und öffnet sich und übergibt die Steuerung. Version A beendet sich und leider geht es dann nicht weiter im Code.

Private Sub Workbook_Open()
If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then
Dim aa(2) As String
bb = 0
'Textdatei lesen
Dim strDatei As String, strZeile As String
   strDatei = ActiveWorkbook.Path & "\U_000001.txt"
   Open strDatei For Input As #1
   Do Until EOF(1)
      Line Input #1, strZeile
      aa(bb) = strZeile
      bb = bb + 1
   Loop
   Close #1
   
If Dir(ActiveWorkbook.Path & "\U_000001.txt") <> "" Then Kill ActiveWorkbook.Path & "\U_000001.txt"
   
Dim Wksh_Q As Workbook
Dim Wksh_Z As Workbook

Set Wksh_Z = ActiveWorkbook 'Pfad Version B (neu)

Set Wksh_Q = Workbooks.Open(Filename:=ActiveWorkbook.Path & "\BLSCC_Master_DB_deutsch_bak.xlsm") 'Pfad Version A (alt)

Wksh_Q.Close SaveChanges:=False ' Beende Version A (alt)
   
'Hab mal beide Methode reingenommen, jedoch wird ab hier nichts mehr ausgeführt
Wksh_Z.Activate
Application.Run Wksh_Z
   
MsgBox ("Update erfolgreich auf Version >>> " & aa(1) & " <<<!")
If Dir(ActiveWorkbook.Path & "\BLSCC_Master_DB_deutsch_BAK.xlsm") <> "" Then Kill ActiveWorkbook.Path & "\BLSCC_Master_DB_deutsch_BAK.xlsm"

Else
End If

Knobbi38

Hallo,

Mit Application.Run wird ein Makro ausgeführt. In dem Beispiel wird damit von der alten VersionA aus eine Prozedur in der neuen Version B ausgeführt. Dadurch ist es möglich, neben der reinen Update-Funktionalität (Ersetzen) auch Änderungen, z. B. Parameteranpassungen, durchzuführen. Ohne einen solchen Mechanismus wären die Möglichkeiten eines Updates sehr eingeschränkt, da VersionA für solche Anpassungen gar nicht vorbereitet ist und keine Informationen darüber hat, wie dies in VersionB gehandhabt wird. Das hat also mit der Methode <Workbook>.Activate nichts zu tun, das sind zwei vollkommen unterschiedliche Dinge.

Ich wiederhole mich nur ungern, aber halte dich einfach an die Vorgaben aus dem letzten Beispiel, vor allem an die richtige Ablaufreihenfolge.
Auf deinen Code möchte ich jetzt nicht mehr weiter eingehen. Den solltest du noch einmal selbst überdenken.

Knobbi38