Supportnet / Forum / Tabellenkalkulation
Problem mit Makro
Frage
Hallo liebe Forengemeinde,
ich habe folgendes Problem:
Ich möchte Daten aus 2 (teilweise auch mehr) verschiedenen Exceldateien in einer 3. Tabelle zusammenfassen (mittels eine Befehlsschaltfläche).
Dieser Vorgang wiederholt sich ständig, so das die Zieldatei ständig wächst. Ich habe ein Makro aufgezeichnet und es der Befehlsschaltfläche zugeordnet.
Das Makro sieht folgendermaßen aus:
Sub Schaltfläche2_BeiKlick()
ActiveWindow.ActivateNext
Range("A1:J55").Select
Selection.Copy
ActiveWindow.ActivateNext
ActiveWindow.ActivateNext
Sheets("GPO 2007").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.End(xlDown).Select
Selection.End(xlDown).Select
Selection.End(xlUp).Select
[b]Range("K1241").Select[/b]
ActiveCell.FormulaR1C1 = "Ende"
[b]Range("A1242").Select[/b]
ActiveWindow.ActivateNext
ActiveWindow.ActivateNext
Range("A1:J55").Select
Selection.Copy
ActiveWindow.ActivateNext
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.End(xlDown).Select
Selection.End(xlDown).Select
Selection.End(xlUp).Select
[b]Range("K1248").Select[/b]
ActiveCell.FormulaR1C1 = "Ende"
[b]Range("A1249").Select[/b]
End Sub
Mein Problem: Die einzulesenden Dateien sind immer unterschiedlich groß von der Zeilenanzahl. Deswegen habe ich den Befehl "Strg + Pfeiltaste down" benutzt, um an das Ende der Tabelle zu gelangen damit die Daten dernachfolgenden Datei direkt darunter eingefügt werden.
Excel erkennt diesen Befehl aber nicht sondern setzt die Zellposition fest im Code ein (siehe Fettschrift im Makro).
Was muss ich tun, damit Excel immer genau eine Zelle unter der zuletzt beschrifteten Zelle geht?
Vielen Dank schon mal im voraus!!
Gruß
Thorsten
Antwort 1 von Beverly
Hi Thorsten,
die letzte belegte Zelle in Spalte A kann man mit diesem Code ermitteln
In deinem Code müsste das dann für die 1. freie Zelle in Spalte K heißen Range("K" & IIf(IsEmpty(Cells(Rows.Count, 11)), Cells(Rows.Count, 11).End(xlUp).Row, Rows.Count + 1).
In VBA kann zu 99% auf Select und Activate verzichtet werden. z.B.
kannt du vereinfachen zu
Oder
wird zu
Bis später,
Karin
die letzte belegte Zelle in Spalte A kann man mit diesem Code ermitteln
IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)
In deinem Code müsste das dann für die 1. freie Zelle in Spalte K heißen Range("K" & IIf(IsEmpty(Cells(Rows.Count, 11)), Cells(Rows.Count, 11).End(xlUp).Row, Rows.Count + 1).
In VBA kann zu 99% auf Select und Activate verzichtet werden. z.B.
Range("A1:J55").Select
Selection.Copykannt du vereinfachen zu
Range("A1:J55").CopyOder
Range("K1248").Select
ActiveCell.FormulaR1C1 = "Ende"wird zu
Range("K1248") = "Ende"Bis später,
Karin
Antwort 2 von Bandog29
Hallo Karin,
vielen dank für die Antwort!
Wo genau muss denn der Code durch deine Änderungen ersetzt werden?
Kannst du vielleicht mein Beispiel nehmen und es so abändern das es funktioniert? In VBA bin ich leider nicht wirklich ein Experte.
Vielen Dank für deine Mühe!
Viele Grüße
Thorsten
vielen dank für die Antwort!
Wo genau muss denn der Code durch deine Änderungen ersetzt werden?
Kannst du vielleicht mein Beispiel nehmen und es so abändern das es funktioniert? In VBA bin ich leider nicht wirklich ein Experte.
Vielen Dank für deine Mühe!
Viele Grüße
Thorsten
Antwort 3 von Beverly
Hi Thorsten,
wenn ich dein Vorhaben richtig verstanden habe, dann sollte es auf diese Weise funktionieren
Wenn du außer den Mappen, aus denen kopiert werden soll noch andere geöffnet hast, musst du in der fett markieren Zeile alle Namen dieser Mappen nach demselben Prinzip aufführen bzw. ergänzen, aus denen nicht kopiert werden darf. ThisWorkbook ist die Mappe mit dem Code, also in die kopiert werden soll. Da es auf den meisten Rechnern eine PERSONL.XLS gibt, habe ich diese gleich mit aufgeführt.
Der Code geht davon aus, dass in Spalte A Zelle A55 immer ausgefüllt ist.
Bis später,
Karin
wenn ich dein Vorhaben richtig verstanden habe, dann sollte es auf diese Weise funktionieren
Sub Schaltfläche2_BeiKlick()
Dim wbMappe As Workbook
Dim wsTabelle As Worksheet
Dim loLetzte As Long
Set wsTabelle = ThisWorkbook.Worksheets("GPO 2007")
loLetzte = IIf(IsEmpty(wsTabelle.Cells(Rows.Count, 1)), wsTabelle.Cells(wsTabelle.Rows.Count, 1).End(xlUp).Row, wsTabelle.Rows.Count)
For Each wbMappe In Excel.Workbooks
If wbMappe.Name <> ThisWorkbook.Name And wbMappe.Name <> "PERSONL.XLS" Then
With wbMappe.Worksheets("Tabelle1") '<== hier den Namen der Tabelle anpassen, aus der kopiert wird
.Range("A1:J55").Copy wsTabelle.Cells(loLetzte + 1, 1)
loLetzte = IIf(IsEmpty(wsTabelle.Cells(Rows.Count, 1)), wsTabelle.Cells(wsTabelle.Rows.Count, 1).End(xlUp).Row, wsTabelle.Rows.Count)
wsTabelle.Cells(loLetzte, 11) = "Ende"
End With
End If
Next wbMappe
End Sub
Wenn du außer den Mappen, aus denen kopiert werden soll noch andere geöffnet hast, musst du in der fett markieren Zeile alle Namen dieser Mappen nach demselben Prinzip aufführen bzw. ergänzen, aus denen nicht kopiert werden darf. ThisWorkbook ist die Mappe mit dem Code, also in die kopiert werden soll. Da es auf den meisten Rechnern eine PERSONL.XLS gibt, habe ich diese gleich mit aufgeführt.
Der Code geht davon aus, dass in Spalte A Zelle A55 immer ausgefüllt ist.
Bis später,
Karin

