web-dev-qa-db-fra.com

Comment remplir les couleurs d'une cellule dans VBA?

Je souhaite colorer les cellules qui ont la valeur "# N/A" dans la feuille de courant. Pour ce faire, j'utilise la macro suivante:

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

Mais la ligne If cell.Value = "#N/A" Then donne une erreur: incompatibilité de type. Peut-être que quelqu'un peut aider à comprendre où est l'erreur? Merci

13
Ale

Solution non VBA:

Utilisez la règle de mise en forme conditionnelle avec la formule suivante: =ISNA(A1) (pour mettre en surbrillance les cellules avec toutes les erreurs - pas seulement #N/A, utilisez =ISERROR(A1))

enter image description here

Solution VBA:

Votre code parcourt 50 mln cellules. Pour réduire le nombre de cellules, j'utilise .SpecialCells(xlCellTypeFormulas, 16) et .SpecialCells(xlCellTypeConstants, 16) pour ne renvoyer que les cellules contenant des erreurs (note, j'utilise 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

Remarque , pour mettre en surbrillance les cellules sans erreur (pas seulement "#N/A"), remplacez le code suivant

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

avec 

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

UPD: (comment ajouter une règle des FC via VBA)

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. Utilisez la mise en forme conditionnelle au lieu de VBA pour mettre en évidence les erreurs.

  2. L'utilisation d'une boucle VBA telle que celle que vous avez publiée prendra beaucoup de temps.

  3. l'instruction If cell.Value = "#N/A" Then ne fonctionnera jamais. Si vous insistez pour utiliser VBA pour mettre en évidence les erreurs, essayez plutôt ceci.

    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 IsError(cell.Value) Then
       cell.Interior.ColorIndex = 3
    End If
    Next
    
    End Sub
    
  4. Préparez-vous à une longue attente, car la procédure parcourt 51 millions de cellules.

  5. Il existe des moyens plus efficaces de réaliser ce que vous voulez faire. Mettez à jour votre question si vous avez un changement d’esprit.

3
teylyn
  1. Sélectionner toutes les cellules par le coin supérieur gauche
  2. Choisissez [Accueil] >> [Mise en forme conditionnelle] >> [Nouvelle règle]
  3. Choisissez [Formater uniquement les cellules qui contiennent]
  4. Dans [Formater uniquement les cellules avec:], choisissez "Erreurs"
  5. Choisissez les formats appropriés dans le bouton [Format ..]
2
Alpha

Vous devez utiliser cell.Text = "# N/A" au lieu de cell.Value = "# N/A". L'erreur dans la cellule est en réalité juste le texte stocké dans la cellule.

0
Dustin Knight