Hexadécimal en décimal sous VBA

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.
 
M

Myta

Guest
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å
 
R

Roland

Guest
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
 

paoloadv

XLDnaute Nouveau
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
 

paoloadv

XLDnaute Nouveau
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...
 

patricktoulon

XLDnaute Barbatruc
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
 

dysorthographie

XLDnaute Accro
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
 

Discussions similaires

Statistiques des forums

Discussions
312 231
Messages
2 086 455
Membres
103 216
dernier inscrit
LoshR7