AW: 2 kleine Kopierfragen
15.12.2006 20:35:53
fcs
Hallo Boris
zu 2)
"wksZiel.Cells(2, 2).Range("A1:C3").Value" entspricht also der angebenen "Range-Größe" relativ zu Zelle(2,2), also range("B2:D4")? Richtig?
Das ist richtig!
Könnte man die linke und rechte Seite der "=-Formel" auch vertauschen? Also:
wksQuelle.Range("A2:Z" & LetzteZeile).Value = wksZiel.Cells(FreieZeile, 2).Range("A1:Z" & LetzteZeile - 1).Value
Im Prinzip ja, aber du muss jetzt natürlich aufpassen, welche Werte du den Variablen LetzteZeile und FreieZeile zuweist. Die Werte werden dann aus wksZiel nach wksQuelle geschrieben.
zu 1)
a) Deinen Ausführungen zufolge ist das hier ohne ein Öffnen der Datei also nicht möglich: "Kopiere Sheets 1-5 einer Quelldatei ans Ende dieser Zieldatei"?
Kopieren im eigentlichen Sinne funktioniert nur bei geöffneten Dateien.
Man kann natürlich in einer Schleife sämtliche Zellen der Tabellen nacheinander abarbeiten. Problem es muss in der Tabelle eine Spalte vorhanden sein, in der jede Zeile Daten enthält, damit man mit Funktion ANZAHL2 die Zeilenzahl in der Tabelle ermitteln kann. Lösungsvorschlag siehe unten.
b) Ich öffne mit folgendem Code nacheinander mehrere xl-Dateien und übertrage Daten mit Deiner Formal aus 2):
...
Jetzt müsste es doch funktionieren, das entsprechend deiner Formula-Methode ohne jeweiliges Öffnen der Dateien zu lösen, oder könnte es da Probleme geben? Oder ist gegen meine Lösung nichts einzuwenden?
Der Code ist so prinzipiell ok, jedoch würde ich die Aktualiserung des Bildschirms abschalten und bei Workbooks.Open den Pfad mit reinnehmen und die Datei als ReadOnly öffnen.
Allerdingsverstehe ich nicht, warum du FreieZeile in Spalte 1 von wksQuelle ermittelst und die Daten dann beginnend in Spalte 2 einträgst. Beim Testen werden bei mir so die Daten aus den 5 Dateien alle in den gleichen Zellbereich geschrieben. Oder ist das absichtlich so gewollt?
Application.ScreenUpdating = False
Do While MAPPE <> ""
Workbooks.Open strPfad & MAPPE, UpdateLinks:=0, ReadOnly:=True
Set wksQuelle = Workbooks(MAPPE).Sheets("RR")
LetzteZeile = wksQuelle.Cells(Rows.Count, 1).End(xlUp).Row
FreieZeile = wksZiel.Cells(Rows.Count, 1).End(xlUp).Row + 1
wksZiel.Cells(FreieZeile, 2).Range("A1:Z" & LetzteZeile - 1).Value = wksQuelle.Range("A2:Z" & LetzteZeile).Value
Workbooks(MAPPE).Close savechanges:=False
MAPPE = Dir
Loop
Application.ScreenUpdating = True
Hier ein Beispiel wie du die Daten aus den RR-Tabellen der Dateien ohne Öffnen der Dateien einlesen könntest. Allerdings ist diese Methode relativ langsam, sollte also nur bei kleineren Datenmengen verwendet werden oder wenn das Öffnen der Quelldatei sehr viel Zeit erfordert.
Sub TestFormel()
'Einstellungen zum testen
Dim MAPPE, strPfad As String, wksZiel As Worksheet, SpalteQ As Integer, ZeileQ As Long
Dim FreieZeile As Long, LetzteZeile As Long, I As Long
strPfad = "C:\Test\Daten\"
MAPPE = Dir(strPfad & "*.xls")
Set wksZiel = ActiveWorkbook.Worksheets("Tabelle1")
Application.ScreenUpdating = False
Do While MAPPE <> ""
FreieZeile = wksZiel.Cells(Rows.Count, 1).End(xlUp).Row + 1
'ZeilenZahl in geschlossener Quell-Datei Tabelle "RR" ermitteln, funktioniert nur, _
wenn in Spalte A in jeder Zeile ein Eintrag vorhanden ist
wksZiel.Cells(FreieZeile, 2).FormulaLocal = "=ANZAHL2('" & strPfad & "[" & MAPPE & "]RR'!A:A)"
LetzteZeile = wksZiel.Cells(FreieZeile, 2).Value
I = 0
For ZeileQ = 2 To LetzteZeile
For SpalteQ = 1 To 26 '(A bis Z)
wksZiel.Cells(FreieZeile + I, SpalteQ + 1).FormulaR1C1 = "='" & strPfad & "[" & MAPPE & "]RR'!R" & ZeileQ & "C" & SpalteQ
wksZiel.Cells(FreieZeile + I, SpalteQ + 1).Value = wksZiel.Cells(FreieZeile + I, SpalteQ + 1).Value
Next
I = I + 1
Next
MAPPE = Dir
Loop
Application.ScreenUpdating = True
End Sub
Gruß
Franz