Excel 2003 Makro: Öffnen, Aktualisieren, Speichern, Schließen

Hakaori

Ensign
Registriert
Mai 2009
Beiträge
225
Aktualisiere

Ich grüße Euch,

Danke und habt einen schönen Tag!
 
Zuletzt bearbeitet:
Du kannst das mit einem Array lösen. Im array gibste die Pfade ein und dann machste dein Makro mit Foreach Eintrag im Array. Sollte net so schwer zum Umsetzen sein.

So sieht die Syntax von Arrays mit For Each aus
Code:
Public Function TeilerGefunden(Zahl As Long) As Long
    Dim TeilerListe As Variant  ' Liste der Primteiler
    Dim Teiler      As Variant  ' Schleifenvariable
    
    TeilerListe = Array(2, 3, 5, 7, 11, 13)
    TeilerGefunden = Zahl
 
    For Each Teiler In TeilerListe
        If Zahl Mod Teiler = 0 Then
            TeilerGefunden = Teiler
            Exit Function
        End If
    Next Teiler
End Function

Sag wenn du mehr Hilfe brauchst :)
 
Ich würde alle Pfad-/Dateiangaben in einer separaten Tabelle hinterlegen.

Die Liste kann man dann in einer Schleife durchlaufen:

Code:
Dim rCell As Range, sFile As String

For Each rCell In Worksheets("Tabelle1").Range("A1:A100")

  sFile = rCell.Value
  Workbooks.Open ...

Next rCell
Evtl. auch mit Pfaden in einer und Dateinamen in einer anderen Spalte:
Code:
Dim rCell As Range, sFile As String, sPath As String

For Each rCell In Worksheets("Tabelle1").Range("A1:A100")

  sPath = rCell.Value
  sFile = rCell.Offset(0, 1).Value
  Workbooks.Open ...

Next rCell
 
Zuletzt bearbeitet:
Richtig, so haben wir das in unserer Firma geloest!
 
Ich danke euch so sehr für eure Hilfe, aber ihr müsst euch vorstellen ihr würdet es einem (dummen) Kind erklären.

Code:
Sub Alle_Exceldateien_nacheinander_öffnen()
Dim rCell As Range, sFile As String, sPath As String
     
    For Each rCell In Worksheets("Tabelle1").Range("A1:A100")
     
    sPath = rCell.Value
    sFile = rCell.Offset(0, 1).Value
    Workbooks.Open ...
     
    Next rCell
ActiveWorkbook.Save
ActiveWorkbook.Close
Loop
End Sub

Auf dem Tabellenblatt "Tabelle1" würde ich dann in A1 den Dateinamen eingeben (mit XLS?) und in B1 den Pfad?
 
In dem Beispiel wäre der Pfad in Spalte A und der Dateiname in Spalte B.

Ob beim Dateinamen die Endung mit dabei steht ist egal. Wenn es immer dieselbe ist, dann kannst du die natürlich auch im Makro anhängen:

Code:
sFile = rCell.Offset(0, 1).Value & ".xls"
 
Ah okay.

Ich kriege bei "Workbooks.Open ..." einen Syntaxfehler bei Excel.

Code:
Sub Alle_Exceldateien_nacheinander_öffnen()
Dim rCell As Range, sFile As String, sPath As String
     
    For Each rCell In Worksheets("Tabelle1").Range("A1:A100")
     
    sPath = rCell.Value
    sFile = rCell.Offset(0, 1).Value & ".xls"
[COLOR="Red"]    Workbooks.Open ...[/COLOR]
     
    Next rCell
ActiveWorkbook.Save
ActiveWorkbook.Close
Loop
End Sub
 
Im Prinzip ist es einfach zu verstehen was passiert.


Du gibst nen Array an. Das ist eine Variable, die mehrere Einträge haben kann, wie oben im Beispiel, viele Zahlen. Das nutzen wir aus, indem wir mehrere Datein/Pfade angeben.

Durch das For Each sagen wir der Maschine, er soll Für jedes dann folgendes Ausführen.


Ich will das nicht einfach lösen, damit haste nichts gelernt, hoffentlich verstehste mich. Du sollst verstehen was da passiert und nicht einfach Copy Paste irgendwas reinhämmern und dann glücklich sein. Wird dir später helfen, wenn du weißt wie das funktioniert.

Wobei VBA meiner Meinung nach, einer der seltsamsten Programmiersprachen ist... Ich mags einfach nicht, die sind so eigenartig in der Syntax ... (; ? BRAUCHEN WIR NICHT! :))




Also nochmal zurück dazu.


Du musst eben mehrere Pfade in einem Array angeben. Sagst einfach Variable = "Pfad1", "Pfad2", "Pfad3" usw. Und dann mit dem For Each geht er jeden Pfad dann einfach durch, und macht dein Makro.


*edit*

Wieso weichst du so weit von deinem Ausgangsmakro ab? Ich meine du willst da was machen, deshalb musste das etwas anpassen nur. Du gibst oben nen Pfad an. Den musste nur in einen Array integrieren :)
 
Zuletzt bearbeitet:
Hakaori schrieb:
Ah okay.

Ich kriege bei "Workbooks.Open ..." einen Syntaxfehler bei Excel.
Da müssen natürlich die Pfad- und Dateiwerte angegeben werden:

Code:
Sub Alle_Exceldateien_nacheinander_öffnen()

Dim rCell As Range, sFile As String, sPath As String

For Each rCell In Worksheets("Tabelle1").Range("A1:A5")

sPath = rCell.Value
sFile = rCell.Offset(0, 1).Value & ".xls"

Workbooks.Open sPath & sFile

ActiveWorkbook.Save
ActiveWorkbook.Close

Next rCell

End Sub
 
in Zukunft nicht mehr nerve?
 
Zuletzt bearbeitet:
Ich habe gerade gesehen, dass Excel evtl. zu schnell ist und nur die erste Datei zuverlässig geöffnet und neu gespeichert wird.

Da kannst du ggf. vor Next rCell noch eine kurze Pause einbauen, bevor die nächste Datei geöffnet wird:
Code:
Application.Wait (Now + TimeValue("0:00:1")) [COLOR="Green"]'Wartezeit in Stunden:Minuten:Sekunden[/COLOR]
Korrekterweise sollte man auch noch prüfen, ob die Datei überhaupt existiert, sonst gibts nen Fehler:
Code:
Sub Alle_Exceldateien_nacheinander_öffnen()

Dim rCell As Range, sFile As String, sPath As String

For Each rCell In Worksheets("Tabelle1").Range("A1:A5")

sPath = rCell.Value
sFile = rCell.Offset(0, 1).Value & ".xls"

If Dir(sPath & sFile) <> "" Then
  Workbooks.Open sPath & sFile

  ActiveWorkbook.Save
  ActiveWorkbook.Close
  
  Application.Wait (Now + TimeValue("0:00:1"))
End If

Next rCell

End Sub
Man könnte das ganze auch so umbauen, dass man ausschließlich die Pfade angibt, und automatisch darin befindliche Exceldateien öffnet. Würde das Pflegen der Dateiliste vereinfachen.
 
Zuletzt bearbeitet:
Hast du den Zellbereich an deine Liste angepasst?

Code:
Worksheets("Tabelle1").Range("A1:A5")

Oben hatte ich mal A1:A100 geschrieben - das Makro läuft also nur bis Zelle A100 bzw. im letzten Code nur bis A5.
 
Besser wäre es da die jeweilige Datei direkt anzusprechen, nicht die aktive.

Ersetze
Code:
  ActiveWorkbook.Save
  ActiveWorkbook.Close
durch
Code:
  Workbooks(sFile).Save
  Workbooks(sFile).Close
 
Gibt es auch eine Möglichkeit
 
Zuletzt bearbeitet:
Benutzt du die Pause im Code?
Code:
Application.Wait (Now + TimeValue("0:00:1"))
Dann dauerts pro Datei natürlich 1 Sekunde + die Zeit für's Öffnen, Speichern und Schließen.

Wenn du die Pause weglässt, gehts entsprechend schneller. Aber du solltest dann prüfen, ob alle Dateien korrekt aktualisiert werden (Änderungsdatum im Explorer prüfen).
 
Was genau soll denn per Hand schneller gehen ?

Wenn du z.B. erst alle Dateien öffnest, geht das wahrscheinlich schneller, als alle Dateien einzeln zu öffnen wie es das Makro macht.
Insgesamt sollte das Makro aber in jedem Fall schneller sein (kannst die Zeit ja mal stoppen) Z.B. kann man nebenbei wunderbar aufs Klo gehen oder sich nen Kaffee holen oder sowas ;)

Eventuell geht es aber schneller, dieses Verhalten per Makro zu simulieren. Dann müsstest du alle Dateien zunächst öffnen und erst danach speichern/schließen.

Des weiteren kann es auch helfen, die Bildschirmaktualisierung abzustellen. Dann siehst du zwar nicht mehr, wie die Dateien geöffnet bzw. geschlossen werden (der Bildschirm verändert sich nicht mehr), aber das Makro müsste schneller durchlaufen.
Das müsste mit "Application.ScreenUpdating = False" (bzw. true am Ende es Makros um es wieder einzuschalten) funktionieren (kann das für 2003 nicht testen).
 
Zurück
Oben