Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1440to1444
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zwei Prozeduren, nur eine wird ausgeführt

Zwei Prozeduren, nur eine wird ausgeführt
12.08.2015 08:21:56
Frank
Hallo zusammen,
ich habe in einer Datei beim Start dieser Datei folgenden Code laufen
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.Run "Daten_aus_manueller_Steuerung_aktualisieren"
Application.Run "alles_aktualisieren"
Workbooks.Open Filename:="Q:\rz\bank21-Reporting\UpdateKundenstamm.xlsm"
Workbooks.Open Filename:="Q:\rz\bank21-Reporting\UpdateKontostammdaten.xlsm"
Application.ScreenUpdating = True
End Sub
Die beiden Prozeduren ...Kundenstamm.xlsm und ... Kontostammdaten.xlsm sollen dafür sorgen, dass auf einem Laufwerk alte Stammdatendateien von den neuen überschrieben werden. Das läuft auch für die jeweils obere Anweisung, egal wie ich das drehe. Es wird nur eine dieser Anweisungen durchgeführt, die andere wird übergangen.
Die Prozeduren sehen übrigens so aus (Aufbau ist gleich, Dateiname unterschiedlich). Sie starten beim öffnen der Dateien Kundenstamm bzw. Kontostammdaten. Die Anweisungen sollen in separaten Dateien stehen, da ich auch von anderen Excel-Dateien darauf zugreifen muss.
'Code in der Persönlichen Makroarbeitsmappe in einem allgemeinen Modul
Sub UpdateKundenstamm()
'Neueste Kundenstammdaten-Datei setzen
Dim strDatei As String
Dim strNeu As String
Dim strDatum As String
Dim strVerzeichnis As String
Dim strName As String
'Verzeichnis mit den Kundenstammdaten -  anpassen !!!
strVerzeichnis = "Q:\rz\bank21-Reporting"
'Dateiname bis zum Beginn des Datums    -  ggf. anpassen !!!
strName = "Kundenstammdaten.xlsx-de."
'neue Stammdatendatei(en) suchen
strDatei = Dir(strVerzeichnis & "\" & strName & "*.xlsx")
If strDatei = "" Then
'Dateiname bis zum Beginn des Datums    -  ggf. anpassen !!!
strName = "Kundenstammdaten.xlsx-de-de."
'neue Stammdatendatei(en) suchen
strDatei = Dir(strVerzeichnis & "\" & strName & "*.xlsx")
End If
If strDatei  "" Then
'neueste Stammdatendatei ermitteln
strNeu = strDatei
'    strDatum = FileDateTime(strDatei)
strDatum = Mid(strDatei, Len(strName) + 1, 8)
Do
strDatei = Dir
If strDatei = "" Then Exit Do
'If strDatum  "" Then
VBA.Kill strVerzeichnis & "\Kundenstammdaten.xlsx"
End If
'neue Datei als Stammdatendatei kopieren
VBA.FileCopy strVerzeichnis & "\" & strNeu, strVerzeichnis & "\Kundenstammdaten.xlsx"
'neue Datei mit Datum-Zeit-Stempel löschen
If strVerzeichnis & "\" & strNeu  "" Then
VBA.Kill strVerzeichnis & "\" & strNeu
End If
End If
'Arbeitsmappe schließen
ActiveWorkbook.Close SaveChanges:=False
End Sub

Was kann ich tun?
Gruß
Frank

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zwei Prozeduren, nur eine wird ausgeführt
13.08.2015 23:42:06
Jürgen
Hallo Frank,
von Genosse zu Genosse (so schließe ich das aus den Verzeichnisnamen ;-) ) will ich eine Antwort versuchen. So wie ich das verstehe, möchtest Du Code so ablegen, dass man ihn zentral pflegen und von mehreren Dateien aus nutzen kann. Dein Ansatz, je Arbeitspaket eine eigene Datei anzulegen und den benötigten Code automatisch beim Öffnen der Datei ausführen zu lassen, ist recht kreativ. Ohne die Dateien zu sehen und zu testen kann ich nur spekulieren, warum er scheitert. Ich vermute einfach Timing-Probleme. Wenn der Code der beiden Dateien parallel ausgeführt wird, wird z. B. das "ActiveWorkbook.close" der ersten Datei die zweite Datei schließen, weil diese ja inzwischen das ActiveWorkbook ist. Dies könntest Du umgehen, wenn Du stattdessen "Thisworkbook" verwendest.
Für zentral gepflegten Code würde ich Dir jedoch dringend die Nutzung eines Add-Ins empfehlen. Aus diesem könntest Du die benötigten Prozeduren aufrufen und wärst sicher, dass die Ausführung nacheinander erfolgt.
Ich hoffe, das hilft Dir weiter!
Gruß, Jürgen

Anzeige
AW: Zwei Prozeduren, nur eine wird ausgeführt
14.08.2015 08:18:04
Frank
Hallo Jürgen,
das Problem sehe ich genauso. Die Befehle werden sich wohl überlagern. Mit Add-Ins kenne ich mich nun aber noch weniger aus als mit VBA ;-).
Ich habe das jetzt aber anders gelöst bekommen. Ich lasse eine Datei "Update" aufrufen. Beim Start dieser Datei werden die nötigen Makros UpdateKundenstamm und UpdateKontostamm per Call ausgeführt. Dabei liegen diese Makros direkt in der Datei "Update" und nicht mehr in verschiedenen Dateien. Nach meinem Wissen wird dann das zweite Makro erst dann ausgeführt, wenn das erste beendet ist.
Übrigens scharf beobachtet, mit dem Genossen.
Gruß
Frank

Anzeige
AW: Zwei Prozeduren, nur eine wird ausgeführt
14.08.2015 08:23:28
Frank
Kommando zurück,
die Idee mit den Call-Befehlen läuft leider doch nicht rund. Hat noch jemand einen Vorschlag?
Gruß
Frank

AW: Zwei Prozeduren, nur eine wird ausgeführt
14.08.2015 08:34:11
Frank
So, jetzt klappt's wirklich. Wenn das erste Module die "Steuerdatei" schon schließt, laufen die anderen auch wohl nicht mehr durch.
Schönes WE
Frank

AW: Zwei Prozeduren, nur eine wird ausgeführt
17.08.2015 21:40:26
Jürgen
Hallo Frank,
gut, dass Dein ursprüngliches Problem nun gelöst ist.
Ich möchte Dich noch auf eine logische Schwäche des Codes aufmerksam machen. Angenommen Du hast eine Datei A und eine jüngere Datei B im Ordner mit den Datenlieferungen. Dein Code ermittelt Datei B als die aktuellste, kopiert sie als Kundenstammdatei und löscht sie. Beim nächsten Codedurchlauf wird nun Datei A als jüngste Datei ermittelt (B gibt es ja nicht mehr) und mangels Prüfung, ob die jüngste Datenlieferung jünger als die aktuelle Kundenstammdatei ist, ersetzt der Code nun letztere mit der älteren Datei B! Das lässt sich meiner Meinung nach nur umgehen, wenn entweder alle älteren Datenlieferungsdateien gelöscht werden, oder aber keine.
Die Prüfung, welche Datei die jüngste ist, läuft im übrigen auch nicht perfekt, wenn tatsächlich der Namensbestandteil vor dem Datum variiert, denn wenn es Dateien wie "Kundenstammdaten.xlsx-de." gibt, findest Du eine jüngere Datei, die mit "Kundenstammdaten.xlsx-de-de." beginnt, nicht.
Gruß, Jürgen

Anzeige
AW: Zwei Prozeduren, nur eine wird ausgeführt
18.08.2015 08:14:36
Frank
Hallo Jürgen,
besten Dank für den Hinweis. Nun bin ich leider (noch) nicht so fit in VBA. Diesen Code hat mir ein Teilnehmer des Forums zusammengestellt (und dafür bin ich dankbar ;-)).
Kann Du mir vielleicht einen Tip geben, wie ich den Code verändern muss?
Gruß
Frank

AW: Zwei Prozeduren, nur eine wird ausgeführt
18.08.2015 13:13:14
Jürgen
Hallo Frank,
das kann ich versuchen, hilfreich wäre dafür, wenn Du mir konkrete Beispiele für Dateinamen nennen kannst (u. a. für das konkrete Format des Datums).
Gruß, Jürgen

AW: Zwei Prozeduren, nur eine wird ausgeführt
18.08.2015 16:06:29
Frank
Hallo Jürgen,
Kontostammdaten-de.20150818-064.xlsx
Kundenstammdaten.xlsx-de.20150818-064.xlsx
Gruß
Frank

Anzeige
AW: Zwei Prozeduren, nur eine wird ausgeführt
18.08.2015 22:14:03
Jürgen
Hallo Frank,
ausgehend von dem vorhandenem Code und den Dateinamen sollte die folgende Prozedur das Gewünschte erledigen:
Sub DateiUpdate(Stammdatentyp As String)
Dim strAktDateiname As String
Dim strAktDatum As String
Dim strNeuestesDatum As String
Dim strNeuesteDatei As String
Dim Antwort As VbMsgBoxResult
Const strDateiEnde As String = "-064.xlsx"
Const strVerzeichnis As String = "Q:\rz\bank21-Reporting\"
strNeuestesDatum = ""
strNeuesteDatei = ""
strAktDateiname = Dir(strVerzeichnis & Stammdatentyp & "*" & strDateiEnde)
Do Until strAktDateiname = ""
strAktDatum = Left(Right(strAktDateiname, 8 + Len(strDateiEnde)), 8)
If strAktDatum > strNeuestesDatum Then
strNeuestesDatum = strAktDatum
strNeuesteDatei = strAktDateiname
End If
strAktDateiname = Dir()
Loop
If strNeuesteDatei  "" Then
Antwort = MsgBox("Folgende Datei scheint die neueste zu sein: " & _
vbCr & strNeuesteDatei & vbCr & vbCr & "Fortfahren?", _
vbQuestion + vbYesNo + vbDefaultButton2, "Sicherheitsabfrage")
If Antwort = vbYes Then
FileCopy (strVerzeichnis & strNeuesteDatei), (strVerzeichnis & Stammdatentyp & ".xlsx") _
End If
Else
MsgBox "Keine " & Stammdatentyp & "-Datei gefunden!", vbInformation
End If
End Sub

Da der Code für Kundenstammdaten und Kontostammdaten fast identisch ist, ist die obige Prozedur so gestrickt, dass durch Übergabe von "Kundenstammdaten" oder "Kontostammdaten" als Parameter die entsprechenden Dateien behandelt werden.
Du brauchst also noch eine Prozedur, die die obige zweimal aufruft:
Sub UpdateAlles()
Call DateiUpdate("Kundenstammdaten")
Call DateiUpdate("Kontostammdaten")
End Sub
Die Lösung löscht keine Dateien, damit verschwindet die aktuellste Datei auch nicht (das war eine der von mir skizzierten Varianten des Vorgehens, alternativ zum Löschen aller Dateien).
Für den Test habe ich die Sicherheitsabfrage vor dem Kopieren übrigens beibehalten.
Was allerdings jetzt noch schiefgehen kann ist, dass z. B. die Datei "Kundenstammdaten.xlsx" bereits in Excel geöffnet ist und deshalb nicht überschrieben werden kann.
Ich hoffe das hilft Dir noch ein bisschen weiter.
Gruß, Jürgen

Anzeige
AW: Zwei Prozeduren, nur eine wird ausgeführt
20.08.2015 08:03:07
Frank
Hallo Jürgen,
besten Dank für den Code. Mit dem werde ich mich jetzt erstmal beschäftigen und ein bischen von Dir lernen ;-)
Gruß
Frank

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige