Anzeige
Archiv - Navigation
1212to1216
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Etwas schwieriges zum kopieren

Etwas schwieriges zum kopieren
Kurt
Hallo zusammen,
ich hoffe das mir jemand helfen kann.
Ich habe die Musterdatei beigefügt.
Folgendes:
In der Sheet Gesamt stehen verschiedene Tabellen, zum Beispiel KK oder kpu, können später mehr
werden.
Die Namen stehen in der Spalte "C".Nun möchte ich die Tabellen mit dem Namen "KK" in die Sheet "KK aktuell" kopieren und
zwar sollen alle Tabellen mit "KK" gesucht werden und jedes mal untereinander in die Sheet "KK aktuell"
kopiert werden.
Die Tabellen sollen nicht in der Gesamt-Sheet gelöscht werden.
Allerdings sollten vorher die "alten" Tabellen in der Sheet "KK aktuell" ab Zeile 10
gelöscht werden.
Jetzt kommt das Problem:
Die Tabellenausschnitte können in der Länge unterschiedlich sein, allerdings ist die
Breite immer gleich.
Beim Beispiel "KK" "B10 bis L23" oder "B25 bis L33".
Die Länge wird immer in der Spalte D ermittelt.
Geht sowas ?
Also die 1.Tabelle (Ausschnitt) "KK" ist B10:L23, 2. B25:L33, 3. B65:L71 .
https://www.herber.de/bbs/user/74980.xls
mfg Kurt P
blockweise kopieren mit VBA
24.05.2011 13:22:53
Erich
Hi Kurt,
probier mal diesen (kaum getesteten!) Code:

Private Sub CommandButton1_Click()  '--- Tabellen KK kopieren ---
DoIt "KK"
End Sub
Private Sub CommandButton2_Click()  '--- Tabellen kpu kopieren ---
DoIt "kpu"
End Sub
Sub DoIt(strT As String)
Dim lngZ As Long, qq As Long, lngQ As Long
Dim wsZ As Worksheet, strK As String, lngV As Long
Set wsZ = Sheets(strT & " aktuell")
With wsZ
lngZ = .Cells(.Rows.Count, 4).End(xlUp).Row
If lngZ > 9 Then .Rows(10).Resize(lngZ - 9).Delete
End With
With Sheets("Gesamt")
lngQ = .Cells(.Rows.Count, 4).End(xlUp).Row
lngZ = 10
For qq = 10 To lngQ + 1
If .Cells(qq, 3) = strT Then
If lngV = 0 Then lngV = qq
ElseIf qq > lngQ Or _
(.Cells(qq, 3)  "" And .Cells(qq, 3)  strT) Then
If lngV > 0 Then
.Cells(lngV, 2).Resize(qq - lngV, 11).Copy wsZ.Cells(lngZ, 2)
lngZ = lngZ + qq - lngV
lngV = 0
End If
End If
Next qq
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Das ist perfek, danke ! -)
24.05.2011 13:30:11
Kurt
Hallo Erich,
einwandfrei,
danke für die schnelle Hilfe,
mfg Kurt P
Frage was mach ich, wenn
24.05.2011 13:32:15
Kurt
Hallo Erich,
was muß ich im Makro ändern, wenn ich noch eine Tabelle anlege?
mfg kurt P
AW: Frage was mach ich, wenn
24.05.2011 16:33:27
Erich
Hi Kurt,
damit man bei Anlage einer neuen Tabelle nichts ändern muss, habe ich den Code aus den
Ergeignisprozeduren rausgenommen. Du brauchst, wenn du die Tabelle xyz anlegst, nur einen neuen Button
mit

Private Sub CommandButton3_Click()
DoIt "xyz"
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Geil tausend Dank !!! --))
24.05.2011 17:43:18
Walter
Geil tausend Dank !!! --))
24.05.2011 17:44:13
Kurt
Hallo Erich,
adresse war von meinem Vater sorrryyy.
mfg Kurt P
Anzeige
Beschreibung
24.05.2011 13:38:33
Kurt
Hallo Erich,
kannst Du mal dahinter Schreiben was passiert ?
Sub DoIt(strT As String)
Dim lngZ As Long, qq As Long, lngQ As Long
Dim wsZ As Worksheet, strK As String, lngV As Long
'---- erst die alten Daten löschen ---------------
Set wsZ = Sheets(strT & " aktuell")                      'hier der Name des Sheets
With wsZ
lngZ = .Cells(.Rows.Count, 4).End(xlUp).Row           'Bereich Länge finden
If lngZ > 9 Then .Rows(10).Resize(lngZ - 9).Delete    'Alte Daten löschen
End With
'---- jetzt wird kopiert -------------------------
With Sheets("Gesamt")
lngQ = .Cells(.Rows.Count, 4).End(xlUp).Row
lngZ = 10
For qq = 10 To lngQ + 1
If .Cells(qq, 3) = strT Then
If lngV = 0 Then lngV = qq
ElseIf qq > lngQ Or _
(.Cells(qq, 3)  "" And .Cells(qq, 3)  strT) Then
If lngV > 0 Then
.Cells(lngV, 2).Resize(qq - lngV, 11).Copy wsZ.Cells(lngZ, 2)
lngZ = lngZ + qq - lngV
lngV = 0
End If
End If
Next qq
End With
End Sub

mfg Kurt P
Anzeige
mit Kommentaren
24.05.2011 16:29:22
Erich
Hi Kurt,
so könnte es klarer werden:

Sub DoIt(strT As String)
Dim lngZ As Long, qq As Long, lngQ As Long
Dim wsZ As Worksheet, strK As String, lngV As Long
'---- erst die alten Daten löschen ---------------
Set wsZ = Sheets(strT & " aktuell")                      'hier der Name des Sheets
With wsZ
lngZ = .Cells(.Rows.Count, 4).End(xlUp).Row           'Bereich Länge finden
If lngZ > 9 Then .Rows(10).Resize(lngZ - 9).Delete    'Alte Daten löschen
End With
'---- jetzt wird kopiert -------------------------
With Sheets("Gesamt")
lngQ = .Cells(.Rows.Count, 4).End(xlUp).Row           ' letzte Quell-Zeile
lngZ = 10                                             ' erste Ziel-Zeile
For qq = 10 To lngQ + 1                            ' Schleife über Quelltab.
If .Cells(qq, 3) = strT Then                  ' KK oder kpu in Sp. C?
If lngV = 0 Then lngV = qq       ' lngV = Zeile, ab der kopiert wird
'        merken, wenn lngV = 0 ist
ElseIf qq > lngQ Or _
(.Cells(qq, 3)  "" And .Cells(qq, 3)  strT) Then
' wenn in Sp. C etwas anderes steht,
' müssen die Zeilen darüber kopiert werden,
' wenn lngV nicht 0 ist.
If lngV > 0 Then                       ' Kopiere
.Cells(lngV, 2).Resize(qq - lngV, 11).Copy wsZ.Cells(lngZ, 2)
lngZ = lngZ + qq - lngV          ' berechne nächste Zielzeile
lngV = 0          ' danach: suche neues KK oder kpu in Sp. C
End If
End If
Next qq
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Habe NOCH ein Problem
24.05.2011 20:19:50
Kurt
Guten Abend Erich,
nach dem kopieren haben die Zeilen alle die gleiche Höhe.
Ich muß allerding die Zeilenhöhe auf 5 Pixel
der Zeilen haben, wo in der Spalte "D" ein "a" drin steht.
mfg Kurt P
ganze Zeilen kopieren?
25.05.2011 06:44:53
Erich
Hi Kurt,
wenn es nicht stört, wenn statt nur der Spalten B bis L jeweils ganze Zeilen kopiert werden,
dann werden auch die Zeilenhöhen mitgenommen.
Du brauchst nur die Zeile
.Cells(lngV, 2).Resize(qq - lngV, 11).Copy wsZ.Cells(lngZ, 2)
zu ersetzen durch
.Rows(lngV).Resize(qq - lngV).Copy wsZ.Cells(lngZ, 1)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Das klappt natürlich aber...
25.05.2011 07:27:38
Kurt
Guten Morgen Erich,
das klappt natürlich !!!
Danke.
Frage:
Gabe dieses Makro für das kopieren vom Muster in die andere Sheet,
was muß ich ändern um die Zeilenhöhe ebenfalls mitzunehmen ?
Sheets("Muster").Select
Range("B10:L47").Select
Selection.Copy
Sheets("Aktuell").Select
ActiveSheet.Paste
' ActiveCell = az
ActiveSheet.Range(Cells(lRow1 + 4, 2), Cells(lRow1 + 4, 12)).Select
mfg Kurt P
ohne Select
25.05.2011 10:08:24
Erich
Hi Kurt,
wo kommen die vielen "Select"s her? In meinem Code steht doch kein einziges, und dort wird auch kopiert.
Diese Selektiererei ist (fast) immer unnütz und störend. Du könntest das wissen...
Aus
Sheets("Muster").Select
Range("B10:L47").Select
Selection.Copy
Sheets("Aktuell").Select
ActiveSheet.Paste
kannst du einern Einzeiler machen:
Sheets("Muster").Range("B10:L47").Copy Sheets("Aktuell").cells(1,1)
Und wenn du nicht B10:L47 kopieren willst, sondern die Zeilen 10:47, um die Zeilenhöhen mitzunehmen:
Sheets("Muster").Range("10:47").Copy Sheets("Aktuell").cells(1,1)
oder
Sheets("Muster").Rows(10).resize(38).Copy Sheets("Aktuell").cells(1,1)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Da muß ich doch das Ende abfragen ?
25.05.2011 13:37:16
Kurt
Hallo Erich,
danke für den Hinweis.
Ich muß aber das Ende del letzten belegten Zelle in Aktuell finden + 1 Zeile
und dann in Spalte B einfügen.
Deswegen mein Satz:
ActiveSheet.Range(Cells(lRow1 + 4, 2), Cells(lRow1 + 4, 12)).Select
mfg Kurt P
So geht es nicht, bitte hilfe, danke.
25.05.2011 13:50:07
Kurt
Hallo Erich,
leider geht es so nicht:
Sheets("Aktuell").Select
lRow1 = Cells(Rows.Count, 4).End(xlUp).Row
ActiveSheet.Range(Cells(lRow1 + 2, 2), Cells(lRow1 + 2, 12)).Select
ActiveCell().Select
az = ActiveCell
Sheets("Muster").Range("10:47").Copy Sheets("Aktuell").Cells(lRow1 + 2, 2), Cells(lRow1 + 2, 12)
In der Sheet Aktuell brauch ich die letzte Zelle in Spalte D die beschrieben ist,
dann 2 Zeilen weiter und hier einfügen.
mfg kurt p
Anzeige
so kann es nicht gehen
25.05.2011 17:05:20
Erich
Hi Kurt,
können wir davon ausgehen, dass der Code im Modul des Tabellenblatts "Muster" steht,
also nicht in einem "normalen" Modul (wie Modul1)?
Wenn dem so iost, wird in dem Code
Sheets("Aktuell").Select
lRow1 = Cells(Rows.Count, 4).End(xlUp).Row
lRow1 als letzte Zeile inh Spalte D des Blattes "Muster" bwerechnet, nicht jedoch des Blattes "Aktuel".
Das überrascht auf den ersten Blick, wurde doch davor "Aktuell" per Select aktiviert, ist aber so.
"Cells" beszieht sich auf das Tabellenblatt, zu dem der Code gehört - und das muss nicht das aktive Blatt sein.
Aus diesem Grund hatte ich in meinem Code immer With-Klammern um die Anweisungen.
Damit (und dem Punkt z. B. vor Cells) ist immer klar, welches Blatt angesprochen ist.
Grundsätzlich ist mir jetzt überhaupt nicht klar, um welchen Code es jetzt eigentlich geht.
Bei meinem Code ging es um Blätter "Gesamt", "KK aktuell", "xyz aktuell", ab Zielzeile 10.
Jetzt geht es um "Muster" und "Aktuell". Bist du noch am selben Problem?
Wenn du die letzte Zeile in Aktuell!D:D ermitteln willst, dann besser so:

With Sheets("Aktuell")
lRow1 = .Cells(.Rows.Count, 4).End(xlUp).Row
end with
Die Punkte sind wichtig.
Wofür ist die Zeile "az = ActiveCell"? Was ist az, wie ist das deklariert?
Der Copy-Befehl könnte evtl. so aussehen:
Sheets("Muster").Range("10:47").Copy Sheets("Aktuell").Cells(lRow1 + 2, 1)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Nicht dein Code !!!
25.05.2011 17:14:34
Kurt
Hallo Erich,
es ging nicht um deinen Code !!!
Ich hatte für mich was erstellt !
Sorry das ich das nicht gesagt habe,
mfg Kurt P
Hier die Erklärung
25.05.2011 21:27:05
Kurt
Guten Abend Erich,
da habe ich eine andere Musterdatei.
Also ich bin im Sheet "Aktuell" und möchte als erstes das ENDE in der Spalte "D" ermitteln + 2 Zeilen.
Dann sollte vom Sheet "Muster" von B10:L47 der Bereich an das Ende der "Aktuell" Sheet
hin kopiert werden, einschließlich der Spaltenbreite und Zeilenhöhe.
Vielleicht kannst Du nochmal schauen,
würde mich freuen,
mfg Kurt P
So ist super DANKE ! Erich ! -)
25.05.2011 22:55:10
Kurt
Guten Abend Erich,
habe so umgesetzt wie Du wolltest, einwandfrei.
With Sheets("Aktuell")
lRow1 = .Cells(.Rows.Count, 4).End(xlUp).Row
End With
Sheets("Muster").Range("10:47").Copy Sheets("Aktuell").Cells(lRow1 + 2, 1)
das ist ja der Hammer nur 2 Zeilen !!!
mfg Kurt P
Anzeige
noch nicht, aber gleich...
26.05.2011 07:48:09
Erich
Hi Kurt,
danke für die Rückmeldung!
Noch ein Tipp - damit sich die With-Klammer richtig lohnt:

With Sheets("Aktuell")
lRow1 = .Cells(.Rows.Count, 4).End(xlUp).Row
Sheets("Muster").Range("10:47").Copy .Cells(lRow1 + 2, 1)
End With
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Jetzt abe rnoch eine...
27.05.2011 21:06:00
Kurt
Guten Abend Erich,
Du bist ja perfekt.
Jetzt zum Abschluss noch eine Frage.
Wenn ich kopiert habe, möchte ich zu der Stelle (1.Zeile) wo sich die
neue Tabelle befindet.
Es könnte ja sein das dies erst bei Zeile 1200 ist, dann müßte ich sonst
unendlich lange scrollen.
mfg Kurt P
dann doch noch Select
27.05.2011 23:06:06
Erich
Hi Kurt,
dann muss doch selektiert werden (ungetestet):

With Sheets("Aktuell")
lRow1 = .Cells(.Rows.Count, 4).End(xlUp).Row
Sheets("Muster").Range("10:47").Copy .Cells(lRow1 + 2, 1)
.Select       ' falls "Aktuell" nicht aktives Blatt ist
.Cells(lRow1 + 2, 1).Select
End With
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Das wars Danke Erich !!! -)
28.05.2011 10:18:31
Kurt
Hallo Erich,
genau so wie ich es wünschte !
Danke und schönes Wochenende,
mfg Kurt P

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige