Tabellenblätter erstellen

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Tabellenblätter erstellen

    Hallo Zusammen,

    Ich bin an einem Projekt dran, eine Tabelle zu zerlegen. (Für jedes neue Wort soll ein Tabellenblatt generiert werden, dessen Name das "wort ist"):

    Visual Basic-Quellcode

    1. Dim i As IntegerDim nWS As Worksheet
    2. Dim Bool As Boolean
    3. Set Bereich = .Range("BG2:BG" & .Range("A65536").End(xlUp).Row)
    4. For Each Zelle In Bereich
    5. For i = 2 To .Worksheets.Count
    6. If .Worksheets(i).Name = Left$(Zelle.Text, 31) Then
    7. Bool = True Exit For
    8. Else
    9. Bool = False
    10. End If
    11. Next i
    12. If Bool = False Then Set nWS = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))
    13. nWS.Name = Left$(Zelle.Text, 31)
    14. End If
    15. Next Zelle




    Die ersten ca. 100 Tabellenblätter werden sehr schnell erstellt (ungefähr. 20 sekunden) anschliessend dauert es ewig lange noch ca 10 pro Tabellenblatt, kennt jemand die ursache dafür?

    gruss
    Nicht jedesmal die kompletten Sheets abfragen.
    Lass die Engine für dich arbeiten:

    Visual Basic-Quellcode

    1. Function SheetExists (ByVal SheetName As String) as Boolean
    2. On Error Goto Done
    3. SheetExists = ThisWorkbook.Sheets(SheetName).Name = SheetName
    4. Done:
    5. End Function

    Verwendung:

    Visual Basic-Quellcode

    1. Set Bereich = Range("BG2:BG" & Cells(Rows.Count, 59).End(xlUp).Row)
    2. For Each Zelle in Bereich
    3. If Not IsEmpty(Zelle) Then
    4. SheetName = Left$(Zelle.Text,31)
    5. If Not SheetExists (SheetName) Then
    6. Set nWS = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    7. nWS.Name = SheetName
    8. Endif
    9. Endif
    10. Next

    Anmerkung1:
    Verwende die Punkt-Schreibweise nur in Zusammenhang mit einem entsprechenden With-Statement

    Anmerkung2:
    Ist dir klar, welchen Overhead du durch jedes neue Worksheet erzeugst?
    Du solltest so etwas nur machen, wenn die Anzahl der Sheets einigermaßen endlich ist.
    Bei Excel 2003 und früher ist die maximale Anzahl übrigens auf 255 beschränkt.

    Anmerkung3:
    Bei der Auswahl des Bereichs solltest du nicht die letzte Zelle in Spalte A abfragen, wenn du eigentlich BG meinst.

    Anmerkung4:
    Die Annahme Rows.Count=65535 ist seit Excel 2007 unzutreffend und deshalb unsauber.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    schnibli schrieb:

    Anmerkung 4, gibt es dafür auch eine bessere lösung
    Rows.Count verwenden ;)

    schnibli schrieb:

    liset er mir nur die ersten 2 zeilen ein und erstellt 2 register
    Was steht in Bereich.Address?

    Geh halt im Debugger den Code Schritt für Schritt durch.
    Läuft er aus der Schleife raus?
    Wirft er Fehler?

    Steht der Code im Worksheet-Modul?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --