webentwicklung-frage-antwort-db.com.de

Wie fülle ich Farbe in einer Zelle in VBA?

Ich möchte Zellen mit "# N/A" -Wert in der aktuellen Tabelle einfärben. Dazu verwende ich folgendes Makro:

Sub ColorCells()

Dim Data As Range
Dim cell As Range
Set currentsheet = ActiveWorkbook.Sheets("Comparison")
Set Data = currentsheet.Range("A2:AW1048576")

For Each cell In Data
If cell.Value = "#N/A" Then
   cell.Interior.ColorIndex = 3
End If
Next

End Sub

Die Zeile If cell.Value = "#N/A" Then gibt jedoch einen Fehler aus: Typenkonflikt. Vielleicht kann jemand helfen zu verstehen, wo der Fehler liegt? Vielen Dank

13
Ale

Nicht-VBA-Lösung:

Bedingte Formatierungsregel mit der Formel verwenden: =ISNA(A1) (zum Hervorheben von Zellen mit all errors - nicht nur #N/A, verwenden Sie =ISERROR(A1))

enter image description here

VBA-Lösung:

Ihr Code durchläuft 50 mln Zellen. Um die Anzahl der Zellen zu reduzieren, verwende ich .SpecialCells(xlCellTypeFormulas, 16) und .SpecialCells(xlCellTypeConstants, 16), um nur fehlerhafte Zellen zurückzugeben (Hinweis: Ich verwende If cell.Text = "#N/A" Then).

Sub ColorCells()
    Dim Data As Range, Data2 As Range, cell As Range
    Dim currentsheet As Worksheet

    Set currentsheet = ActiveWorkbook.Sheets("Comparison")

    With currentsheet.Range("A2:AW" & Rows.Count)
        .Interior.Color = xlNone
        On Error Resume Next
        'select only cells with errors
        Set Data = .SpecialCells(xlCellTypeFormulas, 16)
        Set Data2 = .SpecialCells(xlCellTypeConstants, 16)
        On Error GoTo 0
    End With

    If Not Data2 Is Nothing Then
        If Not Data Is Nothing Then
            Set Data = Union(Data, Data2)
        Else
            Set Data = Data2
        End If
    End If

    If Not Data Is Nothing Then
        For Each cell In Data
            If cell.Text = "#N/A" Then
               cell.Interior.ColorIndex = 4
            End If
        Next
    End If
End Sub

Hinweis , um Zellen mit Fehlern (nicht nur "#N/A") hervorzuheben, ersetzen Sie den folgenden Code

If Not Data Is Nothing Then
   For Each cell In Data
       If cell.Text = "#N/A" Then
          cell.Interior.ColorIndex = 3
       End If
   Next
End If

mit 

If Not Data Is Nothing Then Data.Interior.ColorIndex = 3

UPD: (wie man eine CF-Regel über VBA hinzufügt)

Sub test()
    With ActiveWorkbook.Sheets("Comparison").Range("A2:AW" & Rows.Count).FormatConditions
        .Delete
        .Add Type:=xlExpression, Formula1:="=ISNA(A1)"
        .Item(1).Interior.ColorIndex = 3
    End With
End Sub
10
Dmitry Pavliv
  1. Verwenden Sie die bedingte Formatierung anstelle von VBA, um Fehler hervorzuheben.

  2. Wenn Sie eine VBA-Schleife wie die von Ihnen gepostete verwenden, dauert die Verarbeitung sehr lange

  3. die Anweisung If cell.Value = "#N/A" Then wird niemals funktionieren. Wenn Sie darauf bestehen, VBA zum Hervorheben von Fehlern zu verwenden, versuchen Sie es stattdessen.

    Unterfarbzellen ()

    Dim Data As Range
    Dim cell As Range
    Set currentsheet = ActiveWorkbook.Sheets("Comparison")
    Set Data = currentsheet.Range("A2:AW1048576")
    
    For Each cell In Data
    
    If IsError(cell.Value) Then
       cell.Interior.ColorIndex = 3
    End If
    Next
    
    End Sub
    
  4. Seien Sie auf eine lange Wartezeit vorbereitet, da die Prozedur 51 Millionen Zellen durchläuft

  5. Es gibt effizientere Wege, um das zu erreichen, was Sie wollen. Aktualisieren Sie Ihre Frage, wenn Sie einen Sinneswandel haben.

3
teylyn
  1. Wählen Sie alle Zellen in der oberen linken Ecke aus
  2. Wählen Sie [Start] >> [Bedingte Formatierung] >> [Neue Regel].
  3. Wählen Sie [Nur Zellen formatieren, die enthalten].
  4. Wählen Sie in [Nur Zellen formatieren mit:] "Fehler"
  5. Wählen Sie unter [Format ..] die richtigen Formate aus
2
Alpha

Sie müssen cell.Text = "# N/A" anstelle von cell.Value = "# N/A" verwenden. Der Fehler in der Zelle ist eigentlich nur Text, der in der Zelle gespeichert ist.

0
Dustin Knight