Rahmen um gefüllte Zellen

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von DoSchwob.

    Rahmen um gefüllte Zellen

    Hallo,

    ich fülle mit einem Makro eine Exceltabelle mit einer txt-Datei.
    Nun leider weiß ich nicht wieviele Datensätze in der Textdatei sind. Die Anzahl der Spalten ist bekannt.

    Meine VBA Kenntnisse sind leider gleich 0 und beschränken sich auf das Aufzeichnen von Makros. (Nagut ein bischen kann ich schon auch)

    Ich dachte an sowas:

    Loop über Tabelle
    if Feld <> ""
    rahmen drum
    else
    exit
    endif.
    endloop.

    Aber wie implementiere ich das in VBA?

    mfg hyperion
    Loop über Tabelle? o_O

    Bitte konkreter ... welche Bereich sollen geprüft werden, nur eine Spalte oder wirklich komplett jede Zelle ... wird mit Excel 2007 lustig bei über 1 Mio Zellen PRO Spalte, hoffe Du hast einen wirklich schnellen Rechner. ^^

    Und wenn wirklich jede Zelle geprüft werden sollte dann wäre wohl eher eine For Each Next Schleife zu empfehlen.

    Um was willst Du einen Rahmen machen? Nur um die einzelne Zelle? Stelle mir das gerade vor ... 5.000 Zellen untereinander, alle erfüllen Bedingung und alle haben für sich alleine einen Rahmen.

    Grundsätzlich solltest Du ein wenig mehr zu dem Problem erzählen/erklären. ;)

    Gruß

    Rainer

    Visual Basic-Quellcode

    1. Zeile = 1
    2. Spalte = 1
    3. Do Until Cells(Zeile, Spalte) = ""
    4. Cells(Zeile, Spalte).Borders(xlEdgeTop).LineStyle = xlContinuous
    5. Cells(Zeile, Spalte).Borders(xlEdgeBottom).LineStyle = xlContinuous
    6. Cells(Zeile, Spalte).Borders(xlEdgeLeft).LineStyle = xlContinuous
    7. Cells(Zeile, Spalte).Borders(xlEdgeRight).LineStyle = xlContinuous
    8. Zeile = Zeile + 1
    9. Loop

    Hier eine sehr einfache Variante, die allerdings auch nur die Zellen in der ersten Spalte umrahmt. Allerdings wäre es einfacher die Zellen gleich zu umrahmen beim einlesend er Textdatei.
    Jungs, Schleifen in Excel nur da, wo sie gebraucht werden ;)


    Visual Basic-Quellcode

    1. Sub test()
    2. 'Aufruf mit beliebigem Range
    3. 'auch alle: ActiveSheet.Cells
    4. 'oder Selection ;-)
    5. Call SetShape([A1:G20])
    6. End Sub
    7. Private Sub SetShape(myRange As Range)
    8. On Error GoTo Err_SetShape
    9. Dim i As Long
    10. Dim myCell, myRange2 As Range
    11. Set myRange2 = myRange.SpecialCells(xlCellTypeConstants, _
    12. xlErrors + xlLogical + xlNumbers + xlTextValues)
    13. For Each myCell In myRange2
    14. With myCell
    15. .Borders(xlDiagonalDown).LineStyle = xlNone
    16. .Borders(xlDiagonalUp).LineStyle = xlNone
    17. For i = xlEdgeLeft To xlEdgeRight
    18. .Borders(i).LineStyle = xlContinuous
    19. .Borders(i).Weight = xlThin
    20. .Borders(i).ColorIndex = xlAutomatic
    21. Next
    22. End With
    23. Next
    24. Exit_SetShape:
    25. Exit Sub
    26. Err_SetShape:
    27. Select Case Err.Number
    28. Case 0: Resume
    29. Case Else
    30. Call MsgBox(Err.Description)
    31. Resume Exit_SetShape
    32. End Select
    33. End Sub
    Aha ja ... danke für die Belehrung @ DoSchwob ;)



    Wenn wir aber schon dabei sind, auch ein paar Kleinigkeiten für Dich:

    1. Erste Regel nur soviel wie wirklich nötig schreiben, also lass bitte den Quatsch nach xlCellTypeConstants ... sind ja standardmäig eh alle Values beinhaltet, setzt man nur wenn man nicht alle Values haben will. Und zweitens um Speicher zu sparen kannst Du Dir die zweite Variabele myRange2 auch sparen. Geht auch mit Set myRange = myRange.SpecialCells(xlCellTypeConstants).

    2. Sprungmarken wirklich nur da wo auch gebraucht ... wo bitte wird Exit_SetShape angesprungen oder gebraucht? Bei Resume Exit_SetShape nicht wirklich, stattdessen reicht dort eindeutig ein Exit Sub aus.

    3. Was aber die Zeile mit SelectCase Err.Number und dann Case 0 : Resume soll ... bitte erklär mir das mal. Also Du kommst per Error in die Casebehandlung und springst bei Case 0 wieder zurück in die gleiche Zeile die dich dahin gebracht hat ... ohne irgendeine Behandlung des Fehlers? Wenn dieser Fall tatsächlich mal eintreten sollte, dann viel Spaß in der Deadzone. *g*

    Und für 2 Fälle von denen einer nicht eintreten darf da sonst eine Endlosschleife eintritt, eine Select Case Anweisung zu schreiben ... hhmmm ... eine einfache MsgBox "Es tratt Fehler " & Err.Number & vblf & Err.Description mit einer gefolgten Exit Sub Anweisungen wäre da völlig ausreichend. Mache Select Case Err.Number nur wenn Du auch tatsächlich vor hast eine Fehlerbehandlung einzubauen.

    4. Ja nee, scho klar ... Schleifen nur da wo sie gebraucht werden ... hier wird aber eine Schleife gebraucht. Kommst ja auch nicht ohne aus, bzw. Du brauchst sogar 2 Schleifen. *g*

    5. Und zum P.S. wenn bitte schön heisst es Set myRange2 = Nothing, aber nicht wirklich notwendig da nach Beendigung der Sub die Variabele myRange2 eh obsolet ist. myRange2 = Nothing lässt Dich sauber in den Err.Handler laufen ... hast nur Glück das es nicht Case 0 ist. *g*

    Aber ansonsten schöne Lösung, bisserl umständlich aber gut gemacht.

    Gruß

    Rainer

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „raist10“ ()

    Sehr schöne Lösung, die ich mir auf jeden Fall merken werde.
    Allerdings gibt es eine Fehlermeldung, wenn alle Zellen Leer sind. Vielleicht ist es besser die MsgBox in der Fehlerbehandlung weg zu lassen.

    Visual Basic-Quellcode

    1. Private Sub SetShape(myRange As Range)
    2. Dim i As Long
    3. Dim myCell As Range
    4. On Error GoTo Err_SetShape
    5. For Each myCell In myRange.SpecialCells(xlCellTypeConstants)
    6. With myCell
    7. For i = xlEdgeLeft To xlEdgeRight
    8. .Borders(i).LineStyle = xlContinuous
    9. Next
    10. End With
    11. Next
    12. Err_SetShape:
    13. End Sub

    Außerdem stoppt dieses Programm nicht bei der ersten leeren Zeile. Jedenfalls habe ich es so verstanden, dass dies gewünscht war.
    lol, fühlt sich da jemand auf den Schlips getreten? War nicht meine Absicht.

    Ansonsten: Zu 1: Und nun übernimm den Code schnell in ein anderes Projekt, wer ist schneller: Du mit dem neuen Werten suchen oder ich, falls ich einfach z.B. die Errors rauslösche... Was ist verständlicher? ... Zu 2: Nennt man Programmierstil Spungmarken mit Fehlerbehandlung zu kombinieren. Zu 3. Nun denn, wenn du mal größere Räder drehst wirst an mich denken mit Case 0: Resume - mehr sag ich dazu nicht. zu 4. Aber vergleich mal die Performance von SpecialCells mit einer Schleife durch alle Zellen ;) --> da wartest ne Woche, spätestens wenn du das mit Excel 2007 machst. Zu 5. Kannst dir einen Lolly kaufen, dass ich das Set vorher verschluckt hab beim P.S. Kommentar. Es erhöht die Performance.

    Und zu "bisserl umständlich" fehlen mir die Worte. Ich sag trotzdem eins: Hab dir gern geholfen, auch wenn man manchmal statt einem einfachen Danke vermeintlich den Marsch geblasen bekommt. Also viel Spass noch und vielleicht hilfst mir mal bei meinen ungelösten Problemen hier in diesem Theater.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DoSchwob“ ()