Excel-VBA: Andere, geöffnete Excel-Datei speichern?
Hallo zusammen,
Ich denke, eine sehr einfache Frage für VBA-Experten, die ich durch googlen aber nicht lösen kann.
Ich habe 2 verschiedene Excel-Dateien (bsp. '1.xls' & '2.xls').
Beide Dateien sind in Excel geöffnet.
Ich möchte jetzt per Button in '1.xls' die zweite Datei (also '2.xls') speichern können.
Folgendes habe ich getestet, was nicht funktioniert:
Dateinameneu = Range("H6") & "-" & 2.xls.Name
2.xls.SaveAs "C://Dokumente/"&Dateinameneu
Ich kenne das leider nur mit "ActiveWorkbook.Saveas", aber ich will ja die andere Datei speichern.
WICHTIG! 'Saveas' muss es sein, da die Datei '2.xls' wie ihr in dem Codebeispiel sehen könnt, nachher anders heißen soll.
Danke im Voraus!
Dennis
4 Antworten

Dateinamen sind Strings und keine Variablen, deshalb funktioniert das so nicht.
Dateien öffne ich automatisiert in Excel grundsätzlich so, dass ich sie in Variablen vom Typ Workbook setze, etwa so:
Dim ExcelDateinamenListe As Collection, Dateiname As String, i As Integer
Dim wb As Workbook, wbGeöffnet As Boolean, j As Integer
'... Jede Menge Vorbereitungen ...
'3. diese Excel-Dateien durcharbeiten
For i = 0 To ExcelDateinamenListe.Count - 1
Dateiname = ExcelDateinamenListe.Item(1 + i) 'siehe Bemerkung unten
wbGeöffnet = False
For j = 0 To Application.Workbooks.Count - 1 'Leider kennt VBA 6 noch keine "Collection.Contains()"-Methode
Set wb = Application.Workbooks.Item(1 + j)
If wb.Name = Dateiname Then
wbGeöffnet = True
Exit For
End If
Next
If Not wbGeöffnet Then Set wb = Application.Workbooks.Open(Filename:=Dateiname, updatelinks:=False, ReadOnly:=True, addtomru:=False)
wbExportieren wb, i
If Not wbGeöffnet Then wb.Close savechanges:=False
Next i
Wenn mehrere Dateien gleichzeitig geöffnet sein sollen, nehme ich ein Array oder eine Collection.
(Das "(1 + i)" verwende ich übrigens statt des üblicheren "(i + 1)", um bei späteren Revisionen des Codes daran erinnert zu werden, dass "+ 1" bzw. "1 +" da steht, weil VBA 6 noch in viel zu vielen Fällen bei 1 statt bei 0 anfängt zu zählen. Nach ein paar Jahrzehnten Programmieren in mehreren verschiedenen Sprachen hat man Schwierigkeiten damit, wenn der erste Index 1 statt 0 ist und neigt dazu, so was ggf. zu "korrigieren".)

Mein wesentlicher Punkt war, dass ich die Dateien schon beim Öffnen in Variablen nehme, um später problemlos darauf zugreifen zu können. Sorry, hab nicht bemerkt, dass das etwas an der Frage vorbei geht.
Also:
DateinameNeu = Cells(8,6).Text + "-" + DateinameAlt
If Dir(PfadNeu + "\" + DateinameNeu) <> "" Then Kill PfadNeu + "\" + DateinameNeu
wb.SaveAs FileName:=PfadNeu + "\" + DateinameNeu
wb.Close SaveChanges:=False 'Excel fragt manchmal überflüssigerweise nach
Kill PfadAlt + "\" + DateinameAlt

Was spricht denn dagegen, die andere -schon offene- Datei zu ativieren (ist ein Fenster-Befehl, kein Datei-Befehl) , also
Windows("zu speichernde Datei").activate
...saveAs...
anschließend wieder Windows("gewünschteDatei").activate
Ein VBA-Makro läuft ja weiter, solange die es enthaltende Datei offen ist, egal, welche gerade aktiv ist!
Die Infos zum speichern_unter sollte man allerdings vorher in (Text-)Variablen im Makro festschreiben

Mit Workbooks erlangst du Zugriff auf die geöffneten Arbeitsmappen.
Bei dir sollte es Workbooks("2.xls") sein.

was heisst denn 2.xls.SaveAs?
Workbooks("2.xls").SaveAs ...
Vielen Dank für die ausführliche Erläuterung.
Leider verstehe ich sie dennoch nicht ganz :D
Der Code oben bringt mir nicht sehr viel, oder? Ich will die Dateien ja nicht öffnen, sondern unter neuem Namen und in einem neuen Verzeichnis speichern.