Microsoft Excel - Zellformatierung "Ränder" suchen

Ich habe eine Excel Tabelle mit Artikelnummern von Kleidern, daneben sind Kolonnen S, M, L, XL, wo markiert ist welche Grössen verfügbar sind.

Nun hat der Ersteller netterweise das so gelöst, dass er die entsprechenden Zellen in der Zellformatierung „Ränder“ mit den gekreuzten Diagonalen formatiert hat, wenn die entsprechende Grösse nicht verfügbar ist. Hinzu kommt, dass diese Formatierung dann je nach Lage der Zelle oben, unter, rechts oder links oder in Kombination dicke oder dünne Aussenränder haben kann.
Für die Weiterverarbeitung sollte ich diese Formatierung durch einen Zellinhalt, zB. X oder 0 / 1 ersetzen.

Kennt jemand einen Trick, wie man diese Formatierung gezielt suchen kann. Egal welche Kombination der Ränder ich eingebe Excel findet nichts!

Danke für Eure Hilfe!

hi,

die Formatierung muss ja irgendwo definiert sein bzw. sich auf irgend was beziehen.
und genau da würde man ansetzen.

Also nicht die Formatierung auswerten, sondern (auch) die Zellen auswerten, die für die Formatierung benutzt werden.

Die Zellen werden ja sicher nicht per Hand so gestaltet sein, sondern sich dem Lagerbestand anpassen.

grüße
lipi

VBA cellformat.borders mit benutzerdefinierter Funktion auswerten. Den Reinhard haben sie leider vergrault, der würde sich dir Mühe machen, dir das näher auseinanderzusetzen.

Hallo und vielen Dank

Womit habe ich denn den Reinhard vergrault?

Gruss aus Prag!

Heinz

Hallo und vielen Dank

Nein, die Firma , welche diese Artikel und Preislisten erstellt sind absolute Excel Anarchisten :smile:

Die haben eine Liste und wenn was aus ist, formatieren sie diese Zelle von Hand mit den Diagonalen und senden die Liste neu aus. Und ich kann dann suchen, was geändert hat.

Das möchte ich von einer Mastertabelle aus mit Verweisfunktionen automatisieren, aber eine Verweisfunktion (Offset-Match-Kombination, weil auch nix sortiert ist) kann keine Formatierung erkennen.

Ich hoffe, ich habe mich einigermassen verständlich ausgedrückt.

Moin,

ich kann nur eine VBA-Lösung anbieten:

  • Schleife über alle Zellen (Bereich musst Du anpassen)
  • Abfrage, ob ein Rahmen vorhanden
  • wenn ja, Rahmen entfernen und Wert 0 eintragen

Gruß Ralf

Sub Über_alle_Zellen()

    Dim r       As Long
    Dim c       As Long
    Dim z       As Variant
    
    For Each z In Worksheets("Tabelle1").range("A1:C20")
        If z.Borders(xlEdgeLeft).LineStyle <> xlNone Then
            z.Select
            r = z.Row
            c = z.Column
            Call Rahmen_weg(r, c)
            z.Value = 0
        End If
    Next z
    
End Sub

Sub Rahmen_weg(r, c)

    With Cells(r, c)
    .Borders(xlDiagonalDown).LineStyle = xlNone
    .Borders(xlDiagonalUp).LineStyle = xlNone
    .Borders(xlEdgeRight).LineStyle = xlNone
    .Borders(xlEdgeLeft).LineStyle = xlNone
    .Borders(xlEdgeTop).LineStyle = xlNone
    .Borders(xlEdgeBottom).LineStyle = xlNone
    End With
End Sub

#edit

Die Abfrage

    If z.Borders(xlEdgeLeft).LineStyle <> xlNone Then

setzt voraus, dass immer eine linke Kante als Rahmen vorhanden ist. Sollten zwei Zellen direkt nebeneinander liegen, könnte es Ärger geben, nachdem die linke geputzt ist. Abhilfe:

    If z.Borders(xlEdgeLeft).LineStyle <> xlNone _
    Or z.Borders(xlEdgeRight).LineStyle <> xlNone Then

Gruß Ralf

Vielen Dank an alle!

@drambeldier/Ralf: das skript macht was, aber eben nicht das was es sollte, Rahmen werden entfernt, aber nicht diejenigen wo die „gekreuzten“ Borders drin sind und auch der Wert wird nicht eingetragen.

Es ist eben genau das Problem, dass diese Diagonalen in allen möglichen Kombinationen von Kanten vorkommen, auch noch mit Strichdicken Varianten.

Ich habe die KISS Lösung gewählt und Sohnemann angestellt, dort wo ein Kreuz ist, mach ein Kreuz rein. Excel für die 2. Klasse :smile:

So sieht das aus, die Kreuze vom Sohn sind jetzt schon drin

dort wo ein Kreuz ist, mach ein Kreuz rein.

Wenn’s hilft …

Nichts sollte DIch aber davon abhalten, die richtigen Fragen zu stellen:

   If z.Borders(xlDiagonalUp).LineStyle <> xlNone _
   Or z.Borders(xlDiagonalDown).LineStyle <> xlNone _

Gruß Ralf

Hallo Ralf, danke für Deine Mühe!

Das Resultat wäre also folgendes:

Sub Über_alle_Zellen()

Dim r       As Long
Dim c       As Long
Dim z       As Variant

For Each z In Worksheets("Blatt 2").Range("g6:j90")
    If z.Borders(xlEdgeLeft).LineStyle <> xlNone _
Or z.Borders(xlEdgeRight).LineStyle <> xlNone Then
        z.Select
        r = z.Row
        c = z.Column
        Call Rahmen_weg(r, c)
        z.Value = "X"
    End If
Next z

End Sub

Sub Rahmen_weg(r, c)

With Cells(r, c)
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
.Borders(xlEdgeRight).LineStyle = xlNone
.Borders(xlEdgeLeft).LineStyle = xlNone
.Borders(xlEdgeTop).LineStyle = xlNone
.Borders(xlEdgeBottom).LineStyle = xlNone
End With

End Sub

Das funzt einwenig, alle Rahmen verschwinden, und die X schreibt er in alle Zellen des Bereichs. :smile:

Hallo Heinz,
nein, du hast Reinhard nicht vergrault.

bedeutet: Reinhard (der EXCEL-Experte) wurde vergrault. (sie, nicht Sie).
Gruß Pandus