1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Formatierung mittels Makro (<> bedingte Formatierung)

Discussion in 'Office-Programme' started by cmc_2002, Aug 31, 2010.

Thread Status:
Not open for further replies.
  1. cmc_2002

    cmc_2002 Byte

    Hallo zusammen,

    ich möchte eine große Tabelle automatisch formatieren und habe mich als (blutiger) Anfänger dran gewagt, ein Makro zu schreiben... (Derzeit sind es 5 Bedingungen). Es ist noch vieles getrickst und funktionieren tuts auch noch nicht so ganz. Hier kämet ihr ins Spiel :):

    Bisher bin ich hier:

    Code:
    Sub Makro1()
    For r = 1 To 500
        If (Cells(r, 3) = 8) Then
            With Selection.Interior
                .ColorIndex = 37
                .Pattern = xlSolid
        If Cells(r, 3) = 11 Then
            With Selection.Interior
                .ColorIndex = 49
                .Pattern = xlSolid
        If Cells(r, 3) = 16 Then
            With Selection.Interior
                .ColorIndex = 16
                .Pattern = xlSolid
        If Cells(r, 3) = 19 Then
            With Selection.Interior
                .ColorIndex = 23
                .Pattern = xlSolid
        If Cells(r, 3) = 21 Then
            With Selection.Interior
                .ColorIndex = 2
                .Pattern = xlSolid
    End With
    End Sub
    
    Allerdings bekomme ich die If Funktion nicht richtig beendet, bzw. der Debugger meckert immer.

    Für den Fall das ich komplett auf dem Holzweg bin hier noch eine Zielbeschreibung:

    Den einzelnen Reihen soll ein Format entsprechend einer Projektnummer (bzw. deren Länge) zugeordnet werden, damit diese leichter auseinanderzuhalten sind.

    Um dies zu erreichen, habe ich eine Hilfszeile mit "=Länge(AX)" eingefügt und frage diese Werte mittels Makro ab.

    Sollte ich Infos vergessen haben, meldet euch kurz.

    Vielen Dank schon mal für hilfreiche Kommentare

    Grüße

    cmc_2002
     
  2. brum

    brum Kbyte

    Hallo cmc_2002

    1. Jede IF-Bedingung muss mit einem "End If" beendet werden (ausser der bedingte Befehl folgt auf der gleichen Zeile). Bei With gilt dasselbe (End With). Bei einer For-Schleife braucht es am Schluss ein Next.

    2. Zur besseren Lesbarkeit des Codes immer zwischen [CODE] und [/CODE] setzen.

    3. Ich würde nach Möglichkeit jede "Selection" in einem Makro weglassen bzw. anders programmieren (Cells oder Range).

    Kannst Du mal eine überarbeitete Version erstellen und dann nochmals konkret fragen, wo es immer noch hapert.

    Gruss
    Bruno
     
    Last edited: Aug 31, 2010
  3. Hascheff

    Hascheff Moderator

    Hab nachgeholfen.
     
  4. cmc_2002

    cmc_2002 Byte

    @ Hascheff, danke schon mal.

    @ brum: Tja, dass eine If Funktion ein End if braucht, weiß ich. Nur egal wo ich das End if hinsetze, entweder sagt der Debugger, dass ich einen If-Block ohne End If habe, oder aber dass ich eine End IF Anweisung ohne If Block habe… - gleiches gilt übrigens für die End with Anweisung und die Schleife.

    Ich habe schon diverse Kombinationen durch, aber ich poste einfach mal, wie ich denke, dass es eigentlich laufen sollte:

    Code:
    Sub Testmakro()
    For r = 1 To 500
        If (Cells(r, 3) = 8) Then
            With Selection.Interior
                .ColorIndex = 37
                .Pattern = xlSolid
        If Cells(r, 3) = 11 Then
            With Selection.Interior
                .ColorIndex = 49
                .Pattern = xlSolid
        If Cells(r, 3) = 16 Then
            With Selection.Interior
                .ColorIndex = 16
                .Pattern = xlSolid
        If Cells(r, 3) = 19 Then
            With Selection.Interior
                .ColorIndex = 23
                .Pattern = xlSolid
        If Cells(r, 3) = 21 Then
            With Selection.Interior
                .ColorIndex = 2
                .Pattern = xlSolid
    End With
    End If
    Next r
    End Sub
    
     
  5. chipchap

    chipchap Ganzes Gigabyte

    Hallo cmc_2002 !

    So geht es mit Select case:
    Code:
    Sub Test()
    Dim wert
    For r = 1 To 500
    wert = Cells(r, 3)
        Select Case wert
        Case 8
            With Selection.Interior
                .ColorIndex = 37
                .Pattern = xlSolid
            End With
        Case 11
            With Selection.Interior
                .ColorIndex = 49
                .Pattern = xlSolid
            End With
        Case 16
            With Selection.Interior
                .ColorIndex = 16
                .Pattern = xlSolid
            End With
        Case 19
            With Selection.Interior
                .ColorIndex = 23
                .Pattern = xlSolid
            End With
        Case 21
            With Selection.Interior
                .ColorIndex = 2
                .Pattern = xlSolid
            End With
        Case Else
        With Selection.Interior
                .ColorIndex = 0
                .Pattern = xlSolid
        End With
        End Select
    Next r
    End Sub
    .

    ABER: Die Sub gibt immer nur den Wert der letzten Zelle aus, also (500, 3) alle darüberliegenden werden ÜBERSCHRIEBEN.

    Es wird nur die gerade aktive Selection formatiert.

    Zum Lernen reicht es, aber die Experten hier können das sicher noch viel besser.

    Gruß chipchap
     
  6. Beverly

    Beverly Halbes Megabyte

    Hi,

    Pattern = xlSolid ist eine Standardeigenschaft und kann deshalb weggelassen werden.

    Weshalb muss in einer Schleife über alle Zellen gelaufen werden wenn nur der im Moment des Makrodurchlaufs markierte Bereich (Selection) formatiert werden soll? Oder sollen alle Zellen von C1 bis C500 entsprechend ihrem Wert formatiert werden? Dann müsste das Makro so lauten:
    Code:
    Sub Makro1()
        For r = 1 To 500
            If Cells(r, 3) = 8 Then Cells(r, 3).Interior.ColorIndex = 37
            If Cells(r, 3) = 11 Then Cells(r, 3).Interior.ColorIndex = 49
            If Cells(r, 3) = 16 Then Cells(r, 3).Interior.ColorIndex = 16
            If Cells(r, 3) = 19 Then Cells(r, 3).Interior.ColorIndex = 23
            If Cells(r, 3) = 21 Then Cells(r, 3).Interior.ColorIndex = 2
        Next r
    End Sub
     
  7. cmc_2002

    cmc_2002 Byte

    @chipchap & Karin

    Vielen Dank euch für eure Hilfe. Das von Karin war auch eine gute Idee.
    In groben Zügen funktioniert das schon mal. Die einzelnen Schritte will ich aber erst selber nochmal testen und nachvollziehen, bevor es weiter geht.

    In diesem Sinne, nochmals Danke.
     
Thread Status:
Not open for further replies.

Share This Page