goodbytes
Goto Top

Den gefüllten Bereich eines Tabellenblattes kopieren

Hallo,
ich möchte den Bereich eines Tabellenblattes markieren und kopieren vom ersten Feld (z.B. A3) bis zum letzten gefüllten Feld (z.B. CD118). Ich müsste dazu also die letzte ermittelte Zelle ermitteln.

Und noch eine Frage habe ich. In meinem Tabellenblatt habe ich mehrere verbundene Zellen. Vor dem Umkopieren (mit Transponieren) muss ich ja leider diese verbundenen Zellen trennen und den ursprünglichen Wert in jede der nun getrennten Zellen reinschreiben.
Dies habe ich so gemacht:

For Each Zelle In ActiveSheet.UsedRange
    
    If Zelle.MergeCells Then
        Inhalt_alt = Zelle.Value
        ActiveSheet.UsedRange.MergeCells = False
        Inhalt_neu = Zelle.Value
        Inhalt_alt = Inhalt_neu
    Else
        If IsEmpty(Zelle.Value) Then Zelle.Value = Inhalt_alt
    End If
Next Zelle

Leider läuft das ziemlich lange, da die Tabelle sehr gut befüllt ist. Wie kann ich das optimieren?

Gruß
Torsten

Content-Key: 171714

Url: https://administrator.de/contentid/171714

Printed on: April 20, 2024 at 11:04 o'clock

Member: bastla
bastla Aug 18, 2011 at 13:30:49 (UTC)
Goto Top
Hallo TorstenB!

Versuch es mit
Range(ActiveSheet.UsedRange.Address).Copy <Zielzelle>
Grüße
bastla
Member: goodbytes
goodbytes Aug 19, 2011 at 08:05:22 (UTC)
Goto Top
Hallo Bastla,
irgendwie kann ich damit nichts anfangen... face-sad

Ich stoße auch immer wieder auf eine Fehlermeldung beim Selektieren der Zellen. Was stimmt da nicht? Mittels "Cells" muss ich doch einen Bereich markieren können?

Dim Zeilenanzahl As Integer
Dim Spaltenanzahl As Integer

Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Spaltenanzahl = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column

Range(Cells(1, 1), Cells(Spaltenanzahl, Zeilenanzahl)).Select

Die Fehlermeldung lautet: Fehler 1004 "Anwendungs- oder Objektorientierter Fehler".

Gruß
Torsten
Member: bastla
bastla Aug 19, 2011 at 08:37:02 (UTC)
Goto Top
Hallo TorstenB!

Unabhängig davon, dass Du Zeilen und Spalten in der falschen Reihenfolge angibst (und der Variablenname "Zeilenanzahl) eigentlich irreführend ist, da Du ja eine Zeilennummer ermittelst) und auch nur die Spalte A und die Zeile 1 untersucht werden -
Spaltenanzahl = ActiveSheet.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
würde zumindest die letzte Spalte der gefundenen letzten Zeile ermitteln - eine Frage: Befindet sich Dein Code in einem Modul? Den Fehler reproduzieren kann ich eigentlich nur, wenn ich den Code einem Blatt zuordne und beim Ausführen ein anderes Blatt das "ActiveSheet" ist ...

Und noch eine Frage: Wozu "Select"?
Hinsichtlich des Kopierens oben: ".Address" zu verwenden ist natürlich unnötig (auch, wenn es natürlich trotzdem funktionieren müsste) - es sollte zB
ActiveSheet.UsedRange.Copy Worksheets("Tabelle2").Range("C4")
genügen.

Grüße
bastla
Member: goodbytes
goodbytes Aug 19, 2011 at 08:58:34 (UTC)
Goto Top
Hallo Bastla,
ja, mit den Spalten und Zeilen hast du natürlich recht.

Zum Kopieren. Ich habe hier beim Test als Start nur die 1, 1 gewählt. Der zu kopierende Bereich kann auch woanders beginnen, z.B. von B2 bis zum Ende des gefüllten Bereiches (z.B. CA390).
Mit dem Select will ich nur den Bereich markieren und danach kommt ein copy...

Der Code steckt übrigens in einem Modul.

Gruß
Torsten
Member: bastla
bastla Aug 19, 2011 at 09:32:17 (UTC)
Goto Top
Hallo TorstenB!
Dim Zeilenanzahl As Integer
Dim Spaltenanzahl As Integer

Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Spaltenanzahl = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column

Range(Cells(1, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Select
bzw
Dim Zeilenanzahl As Integer
Dim Spaltenanzahl As Integer

Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Spaltenanzahl = ActiveSheet.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column

Range(Cells(1, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Select
funktioniert bei mir aus einem Modul heraus ...
Mit dem Select will ich nur den Bereich markieren und danach kommt ein copy...
Anstelle des "Select" kannst Du auch gleich "Copy" verwenden ...
Die letzte verwendete Zeile / Spalte solltest Du übrigens mit
LetzteZeile = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
LetzteSpalte = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
ermitteln können - bzw für die Adresse der letzten Zelle:
LetzteZelle = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Address
Grüße
bastla
Member: goodbytes
goodbytes Sep 18, 2011 at 19:22:39 (UTC)
Goto Top
Funktioniert jetzt super, Dankeschön !!! face-smile

Torsten