XL 2016 incrementation chiffre pour renvoyer lettre

djiska

XLDnaute Junior
Bonjour

j'ai ecris un code qui entre une valeur 0 à 15 qui la retourne lorsqu'elle correspond à cette interval de 0 à 9
mais qui qui dois retourne A quand la valeur entrée est 10
B quand la valeur entrée est 11
C quand la valeur entrée est 12
ainsi de suite..

Je me suis servi de Chr mais cela ne me retourne que A.
pouvez vous m'aider !!




If nb >= 0 And nb <= 9 Then
valeurHexa = nb + i

ElseIf nb > 9 And nb <= 15 Then

valeurHexa = Chr(65 + i)
i = i + 1
end if

Call MsgBox(valeurHexa)

End Sub
 
Solution
Djiska,
Ma fonction n'est autre que la votre remaniée.
Vous n'appelez qu'une InputBox. donc dans la fonction,il n'y en a qu'une.
Testez avec l'appel de fonction ci dessous :
VB:
Sub Test()
    HexaOuPas = ValideNombreHexa(0)
End Sub
Public Function ValideNombreHexa(ByVal chaine As String) As Boolean
Dim validite As Boolean
Dim Valeur As String
Dim i As Integer
chaine = InputBox("entrer une valeur hexadecimal")
validite = False
For i = 1 To Len(chaine)
    Valeur = Val(Asc(UCase(Mid(chaine, i, 1))))
    If (Valeur >= 48 And Valeur <= 57) Or _
       (Valeur >= 65 And Valeur <= 70) Then
            validite = True
    Else
            validite = False
    End If
Next i
ValideNombreHexa = validite
End Function
Par contre si vous...

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @djiska ,

Est ce qu'on peut appliquer le meme raisonnement ,pour convertir un nombre Hexa en nombre entier ??
En remplacant la base 10 dix par base 16?

Vous avez tous les outils pour convertir un nombre x depuis la base 10 vers une autre base (base doit être comprise entre 2 et 36). C'est la fonction DecToBase(x As Long, base As Long).
  • si Base vaut 2, vous convertissez en binaire
  • si Base vaut 8, vous convertissez en octal
  • si Base vaut 16, vous convertissez en Hexadécimal. Exemple: Pour convertir en base 16 le nombre décimal 1345 : =DecToBase(1345,16) en VBA et =DecToBase(1345;16) sur une feuille de calcul
  • si Base vaut 17, vous convertissez en base 17 :p

Pour l'opération réciproque, utilisez la fonction BaseToDec(ByVal x As String, ByVal base As Long). Cette fonction convertit un nombre x écrit en base "base" vers la base 10.
  • si base vaut 2, cette fonction convertit x (binaire) depuis la base 2 vers la base 10
  • si base vaut 8, cette fonction convertit x (octal) depuis la base 8 vers la base 10
  • si base vaut 16, cette fonction convertit x (hexadécimal) depuis la base 16 vers la base 10 Exemple: Pour convertir en base 10 le nombre hexadécimal D38C : =BaseToDec("D38C",16) en VBA et =BaseToDec("D38C";16) sur une feuille de calcul
  • si base vaut 17, cette fonction convertit x (en base 17) depuis la base 17 vers la base 10

Vous pouvez donc convertir depuis n'importe quelle base vers une autre base quelconque. Il suffit de repasser par la valeur en base 10 (décimale) intermédiaire. Exemple Passer "D38C" de la base Hexadécimale vers la base 2: =DecToBase(BaseToDec("D38C",16) ,2) (en VBA)
(remplacer les virgules par des points-virgules sur une feuille de calcul)
 
Dernière édition:

djiska

XLDnaute Junior
permettez moi de revenir sur le sujet .
Là j'essaie de valider avec une Boolean ,si le nombre est un Hexadecimal ou pas mais je me heurte à une boucle infinie...



voici le code :

Public Function valideHexa(ByVal chaine As String) As Boolean

Dim validite As Boolean
Dim valeur As String
Dim i As Integer

chaine = Val(InputBox("entrer une valeur hexadecimal"))

validite = True

i = 1
valeur = Mid(chaine, i, 1)

JE VERIFIE SI LA VALEUR SE TROUVE DANS LES BORNES(0-9)(A-F)

While UCase(valeur) > 9 Or UCase(valeur) < 0 Or UCase(valeur) < Chr(65) Or UCase(valeur) > Chr(70)

validite = False

Wend

i = i + 1


SaisirNombreHexadecimal = validite


End Function
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Djiska,

VB:
chaine = Val(InputBox("entrer une valeur hexadecimal"))
Val renvoie un nombre. Comme le retour est une chaine Hexa, elle comporte surement des lettres. Donc ça ne peut pas marcher.

Code:
While UCase(valeur) > 9 ....
Ucase renvoie des majuscules donc des lettres, donc impossible que Ucase(x)>9
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Avec la même structure que votre fonction. Mais celle ci marche.

VB:
Public Function ValideNombreHexa(ByVal chaine As String) As Boolean
Dim validite As Boolean
Dim Valeur As String
Dim i As Integer
chaine = InputBox("entrer une valeur hexadecimal")
validite = False
For i = 1 To Len(chaine)
    Valeur = Val(Asc(UCase(Mid(chaine, i, 1))))
    If (Valeur >= 48 And Valeur <= 57) Or _
       (Valeur >= 65 And Valeur <= 70) Then
            validite = True
    Else
            validite = False
    End If
Next i
ValideNombreHexa = validite
End Function
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Surtout que ça se teste facilement en une seule instruction :
VB:
If Hex(Val("&H" & Chaine)) <> UCase(Chaine) Then MsgBox "Hexa non valide."
Correction :
VB:
If Right$("000000000" & Hex$(Val("&H" & Chaine)), Len(Chaine)) _
    <> UCase$(Chaine) Then MsgBox "Hexa non valide."
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @Dranreb :),

Tu l'avais sous le coude celui-là ? ;)

Sur l'excel 2007 que j'utilise (forcé et contraint), j'ai une erreur de compil au niveau de:
VB:
Private Declare PtrSafe Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As LongPtr)

Mais je te fais 100% confiance. J'ai de vieux outils qui ne m’appartiennent pas :(
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Corrige comme ceci :
VB:
   #If VBA7 Then
Private Declare PtrSafe Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As LongPtr)
   #Else
Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
      #End If
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG