Hexadécimal en décimal sous VBA

  • Initiateur de la discussion Initiateur de la discussion LaurentTBT
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

L

LaurentTBT

Guest
Bonjour à tous.

Peut-on convertir un nombre hexadécimal en décimal sous VBA?

En effet, la fonction existe sous excel grâce à l'utilitaire d'analyse (HEXDEC), et par ailleurs, l'excellent fichier de Ti "Fonctions 2000_XP" (pub, lol) me dit que la traduction en anglais est HEX2DEC. Mais sous VBA, worksheetfunction.hex2dec ne fonctionne pas. Bon, si la version Excel n'existe pas, je pourrai toujours passer par un calcul dans une cellule excel, mais ce n'est pas très propre!

Pour être plus précis, je cherche à mettre un contrôle d'une couleur que je connais sous la forme: #003366. 00, 33 et 66 sont les valeurs en hexadécimal des composantes rouges, vertes et bleues, soit en décimal: 00, 51, 102. Je peux donc forcer la couleur ainsi:
MonContrôle.BackColor=RGB(00,51,102), soit 6697728
Il me manque juste la conversion HEXDEC avant, à moins que quelqu'un connaisse une autre méthode pour obtenir directement le code couleur à partir de la valeur initiale (soit convertir directement #003366 en 6697728)

J'espère avoir été suffisamment clair.

Merci d'avance.

Bon week-end.
 
Salut LaurentTBT

Partant du principe

Dim Couleur As Long
Couleur = RGB(&H00, &H33, &H66)

Couleur va te donner 6697728

Meme chose pour

Dim Couleur As Long
Couleur = RGB(00, 51, 102)

Sinon la formule est

Couleur=(Red * 1) + (Green * 256) + (Blue * 65536)

Donc

Couleur= (0 * 1) + (51 * 256) + (102 * 65536)

ou

Couleur = (&H00 * 1) + (&H33 * 256) + (&H66 * 65536)

Mytå
 
Bonsoir à tous

Fort de tous ces renseignements cette fonction doit faire l'affaire

Function hdc(cc As String) As Long
hdc = (Mid(cc, 2, 1) * 16) + (Mid(cc, 3, 1)) _
+ (Mid(cc, 4, 1) * 16 * 256) + (Mid(cc, 5, 1) * 256) _
+ (Mid(cc, 6, 1) * 16 * 65536) + (Mid(cc, 7, 1) * 65536)
End Function

A+ Roland
 
Bonjour,
Remarquez simplement que l'opération ("&hAABB00")*1 retourne le nombre converti en entier décimal...
D'où ma solution, avec un petit teste sur la forme de chaine transmise en argument d'entrée (qui doit être une chaine de 6 lettres maximum dans l'alphabet hexadécimal).

VB:
Function HexRVBtoDec(cc As String) As Long
    ' Converti un nombre décimal dans une chaine de  type "RRGGBB" en son équivalent entier numérique.
    ' cc sera donc limité à 6 caractères de base 16.
    cc = RegEx("([0-9a-fA-F]){1,6}", Trim(cc))
    cc = Replace(Space(6 - Len(cc)), " ", "0") & cc
    HexRVBtoDec = ("&h" & cc) * 1
End Function

Public Function RegEx(Pattern As String, TextToSearch As String) As String
    Dim RE As Object, REMatches As Object

    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = False
        .Global = False
        .IgnoreCase = False
        .Pattern = Pattern
    End With

    Set REMatches = RE.Execute(TextToSearch)
    If REMatches.Count > 0 Then
        RegEx = REMatches(0)
    Else
        RegEx = vbNullString
    End If
End Function

@+
Paul
 
Ha oui bien vu jmfmarques 😉, je l'avais oubliée celle là. C'est presque aussi simple que de multiplier par 1 la chaine hexadécimale ! 🙂
L'avantage du code plus complet que j'ai posté plus haut est qu'il traite sans erreur toutes les chaines, sans avoir à ajouter "&h" en préfixe. Et si la chaine n'est pas valide, la fonction retourne 0.
La particularité à connaître de la fonction Val() est qu'elle retourne la valeur numérique qu'elle trouve dans la chaine, même si la chaine a des bizarreries intégrées dedans (? Val("&heehuug458") retourne la même chose que Val("&hee"), i.e. 238. Ce qui n'est pas forcément souhaitable. A voir suivant le besoin...
 
une petite démo
VB:
'exemple avec la couleur bleu de base
Sub test()
voir vbBlue  'couleur en vbconstante
End Sub

Sub test2()
voir 16711680  'couleur en long
End Sub

Sub test3()
voir RGB(0, 0, 255) 'couleur en RGB
End Sub
Sub test4()
voir ThisWorkbook.Colors(5) 'couleur en RGB
End Sub


Sub voir(couleur)

chainehex = Right("000000" & Hex(couleur), 6) 'chaine hex pour decanter le RGB
r = Right(chainehex, 2)
g = Mid(chainehex, 3, 2)
b = Left(chainehex, 2)

texte = "couleur en long = " & vbBlue & vbCrLf
texte = "en hex ca donne &H" & Hex(couleur) & vbCrLf
texte = texte & "en long ca donne " & Val("&H" & chainehex) & vbCrLf
texte = texte & "chaine pour re composition  pour B G R=" & chainehex & vbCrLf
texte = texte & "R =" & Val("&H" & r) & vbCrLf
texte = texte & "G =" & Val("&H" & g) & vbCrLf
texte = texte & "B =" & Val("&H" & b) & vbCrLf
texte = texte & " en html ca donne   #" & r & g & b

MsgBox texte
End Sub
 
VB:
Sub test()
Debug.Print HexAsLongRGB("#003366")
End Sub
Function HexAsLongRGB(v As String) As Long
Dim T, x As Integer
T = Split(Format(Replace(v, "#", ""), "@@.@@.@@"), ".")
For x = 0 To 2
    T(x) = Val("&H" & T(x))
Next
HexAsLongRGB = RGB(T(0), T(1), T(2))
End Function
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
7
Affichages
4 K
Retour