Supportnet / Forum / Tabellenkalkulation
Datei speichern und schließen...
Frage
Hallo,
gibt es eine Möglichkeit für folgendes Problem:
ich will über einen Makro mehrere Dateien öffnen. Das habe ich hinbekommen. Wenn ich nun einen Knopf drücke, sollen die geöffneten Dateien (nicht ALLE Exceldateien, da ja noch andere geöffnet sein könnten) gespeichert und geschlossen werden.
Das habe ich hierdurch gemacht:
Windows("abc.xls").Activate
ActiveWorkbook.Save
ActiveWorkbook.Close
Windows("xyz.xls").Activate
ActiveWorkbook.Save
usw. usw.
Wenn jetzt aber jemand zwischendurch eine der Dateien manuel geschlossen hat, erscheint ein Fehler in VBA. Kann man hier irgendwie einbauen "wenn die Datei geöffnet ist, dann speichern, schließen und zur nächsten gehen"???
Danke im Voraus!
Antwort 1 von piano
Hallo
wie wärs mit einer Schleife:
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
wie wärs mit einer Schleife:
Sub Schliessen()
i = Workbooks.Count
On Error Resume Next
Do While True
Windows(i).Activate
If ActiveWorkbook.Name <> "Mappe1.xls" Then
ActiveWorkbook.Save
ActiveWorkbook.Close
End If
i = i - 1
If i < 1 Then Exit Sub
Loop
End Sub
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 2 von qwerewq
Danke für den Tipp - wie kann ich das jetzt aber einbinden? Muss ich das kopieren und für jede Arbeitsmappe abändern?
Antwort 3 von piano
Hallo
In dem Beispiel werden alle offenen Mappen geschlossen, ausser "Mappe1.xls" (das ist die Master-Datei!). Du musst natürlich hier nur den (oder die) Namen der Mappe(n) eingeben, die offenbleiben soll(en).
Diesen Makro würde ich in ein "Zeichnen"-Objekt (Autoformen - Standardformen - Rahmen) der Master-Datei einbinden. (daher logischerweise diese Mappe nicht schliessen)
Gruss piano
In dem Beispiel werden alle offenen Mappen geschlossen, ausser "Mappe1.xls" (das ist die Master-Datei!). Du musst natürlich hier nur den (oder die) Namen der Mappe(n) eingeben, die offenbleiben soll(en).
Diesen Makro würde ich in ein "Zeichnen"-Objekt (Autoformen - Standardformen - Rahmen) der Master-Datei einbinden. (daher logischerweise diese Mappe nicht schliessen)
Gruss piano
Antwort 4 von qwerewq
Achso, verstehe. Aber das heißt doch, dass ALLE Mappen geschlossen werden. Wie kann ich erreichen, dass nur die Mappen geschlossen werden sollen, die zum Projekt gehören? Es könnte ja sein, dass eine andere Mappe geöffnet ist, die damit nichts zu tun hat?
Antwort 5 von piano
Hast Du ein Kriterium für die Projekt-Mappen?
z.Bsp. "_MyProject" irgendwo im Dateinamen:
als zusätzliche Bedingung.
oder wenn in bestimmten Pfad, dann:
als Bedingung.
z.Bsp. "_MyProject" irgendwo im Dateinamen:
If InStr(1, ActiveWorkbook.Name , "_MyProject") > 0 then
ActiveWorkbook.Save
ActiveWorkbook.Close
end if
als zusätzliche Bedingung.
oder wenn in bestimmten Pfad, dann:
if ActiveWorkbook.Path = "C:Dokumente und EinstellungenpianoEigene Dateien" then
als Bedingung.
Antwort 6 von qwerewq
Mhmm, mit Pfadangaben könnte das gehen, allerdings sind einige Dateien in Unterordnern geöffnet... Kann man irgendwie auf den Hauptordner Bezug nehmen??
Antwort 7 von piano
Machs wie ich beim Namen gezeigt habe (Teilstringsuche) :
If InStr(1, ActiveWorkbook.Path , "MyProjectHauptordner") > 0 then
Antwort 8 von qwerewq
Klasse! Das klappt wunderbar! Habe jetzt folgenden Code hinter Deine Anweisung geschrieben, um die Excelmappe zu speichern und zu schließen, in der der Makro ausgeführt wird. Leider klappt das nicht und diese Datei bleibt als einzige offen. Kann man da noch was machen?
Windows("start.xls").Activate
ActiveWorkbook.Save
ActiveWorkbook.Close
Windows("start.xls").Activate
ActiveWorkbook.Save
ActiveWorkbook.Close
Antwort 9 von piano
Wenn dieser Code unmittelbar vor "End Sub" steht und der Name der Arbeitsmappe richtig ist, dann muss es klappen!
Teste eventuell mit
vor
Teste eventuell mit
MsgBox ActiveWorkbook.Name
vor
Windows("start.xls").Activate
Antwort 10 von qwerewq
Das klappt leider nicht. Kann es sein, dass er aus der Schleife direkt an das Ende der Anweisung springt und somit die letzte Anweisung, die außerhalb der Schleife steht, nicht mehr berückstichtigt?
Antwort 11 von piano
Nein, kann nicht - höchstens im Fehlerfall!
Nimm die Anweisung
mal heraus und teste!
Nimm die Anweisung
On Error Resume Next
mal heraus und teste!