web-dev-qa-db-fra.com

Comment mettre en surbrillance une cellule en utilisant la valeur de couleur hexadécimale dans la cellule?

J'ai un tableur de symboles et de couleurs hexagonales correspondantes. Je veux remplir la cellule elle-même (ou celle à côté) avec la couleur hexadécimale à l'intérieur de la cellule. J'ai lu un peu sur le "formatage conditionnel", et je pense que c'est le moyen de le faire.

Comment pourrais-je atteindre le résultat que je voudrais?

16
knowbody

Ne peut être atteint avec la mise en forme conditionnelle pour toutes les couleurs.

En supposant que: La ligne 1 contient des étiquettes de données, que le jeu de données ne comporte pas d'espaces vides, la couleur HEX correspond au remplissage et non à la police. et que vous n’avez pas besoin de le faire souvent, la macro ColourCells peut convenir:

Sub ColourCells()
Dim HowMany As Integer
On Error Resume Next
Application.DisplayAlerts = False
HowMany = Application.InputBox _
(Prompt:="Enter last row number.", Title:="To apply to how many rows?", Type:=1)
On Error GoTo 0
Application.DisplayAlerts = True
If HowMany = 0 Then
Exit Sub
Else
   Dim i As Integer
   For i = 2 To HowMany
      Cells(i, 3).Interior.Color = RGB(Cells(i, 3), Cells(i, 4), Cells(i, 5))
   Next i
End If
End Sub

et entrez la valeur souhaitée pour n à l'invite.

Exemple de sortie et de formules, etc.:

SO11466034

La fonction RGB () d'Excel crée en fait une valeur BGR (je ne pense pas que quiconque puisse savoir pourquoi dit pourquoi) si bien que Excel affiche les grignotines dans l'ordre inverse. Pour le code, Colonnes3,4,5 était logique, mais je pensais que BGR plutôt que le RVB conventionnel de l’image pouvait paraître étrange. Pour F dans l'image, la valeur C3 (la colonneLEFThand du «trois RVB») est obtenue en appliquant RIGHT () à la couleur Hex.

66
pnuts

Modification mineure de la réponse de Jon Peltier. Sa fonction fonctionne presque, mais les couleurs qu'il rend sont incorrectes car Excel sera rendu au format BGR plutôt que RVB. Voici la fonction corrigée, qui permute les paires de valeurs Hex dans l'ordre 'correct':

Sub ColorCellsByHex()
  Dim rSelection As Range, rCell As Range, tHex As String

  If TypeName(Selection) = "Range" Then
  Set rSelection = Selection
    For Each rCell In rSelection
      tHex = Mid(rCell.Text, 6, 2) & Mid(rCell.Text, 4, 2) & Mid(rCell.Text, 2, 2)
      rCell.Interior.Color = WorksheetFunction.Hex2Dec(tHex)
    Next
  End If
End Sub
18
user3646932

Beaucoup plus simple:

ActiveCell.Interior.Color = WorksheetFunction.Hex2Dec(Mid$(ActiveCell.Text, 2))

Hex2Dec transforme le nombre hexadécimal en une valeur décimale que VBA peut utiliser.

Alors sélectionnez la plage à traiter et lancez ceci:

Sub ColorCellsByHexInCells()
  Dim rSelection As Range, rCell As Range

  If TypeName(Selection) = "Range" Then
  Set rSelection = Selection
    For Each rCell In rSelection
      rCell.Interior.Color = WorksheetFunction.Hex2Dec(Mid$(rCell.Text, 2))
    Next
  End If
End Sub
5
Jon Peltier

Pour cela, un formulaire utilisateur peut être créé avec la fonction Hex2Dec.

Function Hex2Dec(n1 As String) As Long
    Dim nl1 As Long
    Dim nGVal As Long
    Dim nSteper As Long
    Dim nCount As Long
    Dim x As Long
    Dim nVal As Long
    Dim Stepit As Long
    Dim hVal As String

    nl1 = Len(n1)
    nGVal = 0
    nSteper = 16
    nCount = 1
    For x = nl1 To 1 Step -1
       hVal = UCase(Mid$(n1, x, 1))
       Select Case hVal
         Case "A"
           nVal = 10
         Case "B"
           nVal = 11
         Case "C"
           nVal = 12
         Case "D"
           nVal = 13
         Case "E"
           nVal = 14
         Case "F"
           nVal = 15
         Case Else
           nVal = Val(hVal)
       End Select
       Stepit = (nSteper ^ (nCount - 1))
       nGVal = nGVal + nVal * Stepit
       nCount = nCount + 1
    Next x
    Hex2Dec = nGVal
End Function
...
UserForm1.TextBox1 = "RGB(" & Hex2Dec(UserForm1.txtHex1.Value) & "," & _
           Hex2Dec(UserForm1.txtHex2.Value) & "," & Hex2Dec(UserForm1.txtHex3.Value) & ")"

Par exemple, la valeur entrée dans la zone de texte: # FF8800 - Résultat: RGB (255, 136,0)

0
kadrleyn