Impossible de lire la propriété
Bonjour tout le monde !
J'ai un problème avec ma fonction Int2PCode, ma fonction de base qui est celle-ci :
Public Function Int2PCode(dtc As String) As String
Dim HexaCode, Hexa1, Char1 As String
HexaCode = WorksheetFunction.Dec2Hex(dtc):
Hexa1 = Format(WorksheetFunction.Hex2Bin(Left(HexaCode, 1)), "0000")
Select Case Left(Hexa1, 2)
Case Is = "00"
Char1 = "P"
Case Is = "01"
Char1 = "C"
Case Is = "10"
Char1 = "B"
Case Is = "11"
Char1 = "U"
End Select
Int2PCode = Char1 & WorksheetFunction.Bin2Dec(Right(Hexa1, 2)) & Mid(HexaCode, 2, 3) & "-" & Right(HexaCode, 2)
End FunctionPermet de convertir le code DTC d'une valeur numérique en code P, la fonction ci-dessus fonctionne très bien mais le souci c'est que le DTC doit être codé sur 3 octets (24 bits). C'est à dire que lorsque la valeur décimale d’un DTC est inférieure ou égale à 1 048 575 (1111 1111 1111 1111 1111); il faut rajouter 0000 au niveau du bite fort pour avoir 24 bits (0000 1111 1111 1111 1111 1111) avant de faire la conversion en hexa.
J'ai donc modifié ma fonction de base ce qui donne ça :
Public Function Int2PCode(dtc As String) As String
Dim HexaCode, Hexa1, Char1 As String
Dim decimalValue As Long
decimalValue = CLng(dtc)
' Ajouter des zéros au niveau du bit le plus significatif si la valeur décimale est inférieure ou égale à 1 048 575
If decimalValue <= 1048575 Then
' Convertir en binaire avec 24 bits
Hexa1 = Format(WorksheetFunction.Dec2Bin(decimalValue, 24), "000000000000000000000000")
Else
' Convertir en binaire avec 20 bits
Hexa1 = Format(WorksheetFunction.Hex2Bin(Left(WorksheetFunction.Dec2Hex(decimalValue), 1)), "0000")
End If
Select Case Left(Hexa1, 2)
Case Is = "00"
Char1 = "P"
Case Is = "01"
Char1 = "C"
Case Is = "10"
Char1 = "B"
Case Is = "11"
Char1 = "U"
End Select
Int2PCode = Char1 & WorksheetFunction.Bin2Dec(Right(Hexa1, 2)) & _
Mid(Hexa1, 3, 8) & "-" & _
Mid(Hexa1, 11, 8) & "-" & _
Right(Hexa1, 8)
End FunctionMais ça me met une erreur de ce type :
Je n'arrive pas à voir pourquoi, je vous laisse le dossier avec les fichiers pour tester si vous le souhaitez et pour regarder le code, le run prend du temps lorsqu’on lance la macro car il y’a beaucoup de donné dans le fichier XML. Au lancement de la macro le 1er fichier à ouvrir est : Matrix.xlsm ensuite le 2ème à ouvrir est FichierXML.xml
Merci par avance !
bonjour,
ces fonctions de conversion ont des limitations quant aux nombres qu'elles sont capables de gérer (dec2bin est limité à la valeur dec 512 par exemple.)
Bonjour h2so4,
D'accord je vois, ça veut dire que je peux pas utiliser dec2bin.. j'ai vu qu'on pouvait utiliser LongLong est-correct ? Vu que la valeur est comprise entre -9 223 372 036 854 775 808 et 9 223 372 036 854 775 807
En ayant un peu cherché je suis tombé sur ça, ce qui permettrait de résoudre mon problème peut-être :
=DEC2BIN(MOD(QUOTIENT($A$1,256^3),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^2),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^1),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^0),256),8)Re,
J'ai testé en modifiant la fonction, après avoir tester j'ai toujours une erreur "L'indice n'appartient pas à la selection"
Public Function Int2PCode(dtc As String) As String
Dim HexaCode, Hexa1, Char1 As String
Dim decimalValue As Long
decimalValue = CLng(dtc)
' Convertir en binaire avec 32 bits à l'aide de la formule Excel fournie
Hexa1 = WorksheetFunction.Dec2Bin(WorksheetFunction.Mod(WorksheetFunction.Quotient(decimalValue, 256 ^ 3), 256), 8) & _
WorksheetFunction.Dec2Bin(WorksheetFunction.Mod(WorksheetFunction.Quotient(decimalValue, 256 ^ 2), 256), 8) & _
WorksheetFunction.Dec2Bin(WorksheetFunction.Mod(WorksheetFunction.Quotient(decimalValue, 256 ^ 1), 256), 8) & _
WorksheetFunction.Dec2Bin(WorksheetFunction.Mod(WorksheetFunction.Quotient(decimalValue, 256 ^ 0), 256), 8)
Select Case Left(Hexa1, 2)
Case Is = "00"
Char1 = "P"
Case Is = "01"
Char1 = "C"
Case Is = "10"
Char1 = "B"
Case Is = "11"
Char1 = "U"
End Select
Int2PCode = Char1 & WorksheetFunction.Bin2Dec(Right(Hexa1, 2)) & _
Mid(Hexa1, 3, 8) & "-" & _
Mid(Hexa1, 11, 8) & "-" & _
Right(Hexa1, 8)
End Functionbonjour,
une fonction de conversion decimal vers binaire (vite faite)
Sub test()
'pour tester la fonction
MsgBox dectobin(1234004565, 24)
End Sub
Function dectobin(n As Long, Optional numberofbits = 32) As String
Dim s As String
s = ""
Do While n <> 0
s = (n Mod 2) & s
n = Int(n / 2)
Loop
dectobin = Right(String(numberofbits, "0") & s, numberofbits)
End Functionre-bonsoir,
ton code adapté pour utiliser la fonction proposée
Public Function Int2PCode(dtc As String) As String
Dim Hexa1 As String
Dim decimalValue As Long
Hexa1 = dectobin(CLng(dtc), 24)
Select Case Left(Hexa1, 2)
Case Is = "00"
Char1 = "P"
Case Is = "01"
Char1 = "C"
Case Is = "10"
Char1 = "B"
Case Is = "11"
Char1 = "U"
End Select
Int2PCode = Char1 & WorksheetFunction.Bin2Dec(Right(Hexa1, 2)) & _
Mid(Hexa1, 3, 8) & "-" & _
Mid(Hexa1, 11, 8) & "-" & _
Right(Hexa1, 8)
End Function
Function dectobin(n As Long, Optional numberofbits = 32) As String
Dim s As String
s = ""
Do While n <> 0
s = (n Mod 2) & s
n = Int(n / 2)
Loop
dectobin = Right(String(numberofbits, "0") & s, numberofbits)
End Function
Sub test()
MsgBox Int2PCode(12345)
End SubBonjour h2so4,
Je te remercie pour ta contribution à mon problème, si j'ai bien compris la boucle "Do While n <> 0" permet de convertir le nombre décimal en binaire. Tant que le nombre n est différent de zéro, la boucle se répète à chaque tour de boucle, la ligne "s = (n Mod 2) & s" ajoute le reste de la division de n par 2 à la chaîne "s". Le reste de la division est égal à 0 ou 1, ce qui représente le chiffre binaire correspondant. Et la ligne "n = Int(n / 2)" divise n par 2 et arrondit le résultat à l'entier inférieur grâce à la fonction Int ?
J'ai un problème c'est que lorsque je run le code, le run est interminable
bonjour,
je dois l'arrêter de moi même est-ce normal ?
Non,
et si tu lances la macro test (que j'ai mise dans le code), as-tu le même problème ? pour quelle valeur lances-tu la conversion ?
Lorsque je lance la macro test je n'ai pas de problèmes mais le souci je ne dois pas choisir de valeur, je ne sais pas si tu as pu tout regarder mais dans ma macro je boucle dans tout le fichier XML et dans ce fichier XML il y'a des milliers de valeurs :
PCODE = Int2PCode(V_NAME(i).Text)Donc la chose doit se faire automatiquement sans que je rentre les valeurs moi même.
For i = 0 To INSTANCE.Length - 1
'Get LONG-NAME and SHORT-NAME
Set LONG_NAME = INSTANCE(i).FirstChild
Set SHORT_NAME = LONG_NAME.NextSibling
Set V_NAME = LONG_NAME.SelectNodes("//V")
DebugText = SHORT_NAME.Text
PCODE = Int2PCode(V_NAME(i).Text)
Dim label, state, dtc As String
label = "Label"
state = "State"
dtc = "DTC"bonjour,
Je ne sais pas si tu as pu tout regarder mais dans ma macro je boucle dans tout le fichier XML et dans ce fichier XML il y'a des milliers de valeurs :
je n'ouvre pas les fichiers ZIP, mets un fichier réduit contenant ta macro. Mais la fonction ne gère pas les nombres négatifs.
Re bonjour,
Les valeurs sont > à 0 donc normalement par rapport à ça y'a aucun problème (j'espère). Je peux pas t'envoyer le fichier XML il est bcp trop volumineux et je peux pas l'alléger.
bonjour,
une nouvelle version qui gère les nombres négatifs
Public Function Int2PCode(dtc As String) As String
Dim Hexa1 As String
Dim decimalValue As Long
Hexa1 = dectobin(CLng(dtc), 24)
Select Case Left(Hexa1, 2)
Case Is = "00"
Char1 = "P"
Case Is = "01"
Char1 = "C"
Case Is = "10"
Char1 = "B"
Case Is = "11"
Char1 = "U"
End Select
Int2PCode = Char1 & WorksheetFunction.Bin2Dec(Right(Hexa1, 2)) & _
Mid(Hexa1, 3, 8) & "-" & _
Mid(Hexa1, 11, 8) & "-" & _
Right(Hexa1, 8)
End Function
Function dectobin(n As Long, Optional numberofbits = 32) As String
Dim s As String, hexs As String, nh As String
hexs = Right(String(8, "0") & Hex(n), 8)
s = ""
For i = 4 To 1 Step -1
nh = "&H" & Mid(hexs, (i - 1) * 2 + 1, 2)
n = nh
Do While n <> 0
s = (n Mod 2) & s
n = Int(n / 2)
Loop
Next i
dectobin = Right(String(numberofbits, "0") & s, numberofbits)
End Function
Sub test()
MsgBox Int2PCode(12345)
End SubRe Bonjour !
Après avoir tester ça fonctionne dans le sens ou il n'y a pas d'erreur, je te remercie pour ça d'avoir fait le test pour les valeurs negatifs aussi.
Mais en regardant mon fichier DiffClasseur les valeurs de la colonne DTC code (colonne G) n'ont pas le meme format que les valeurs DTC code de la colonne D.
Les valeurs de la colonne G doit avoir le meme format que la colonne D, normalement cette partie est géré par cette partie de code :
Int2PCode = Char1 & WorksheetFunction.Bin2Dec(Right(Hexa1, 2)) & _
Mid(Hexa1, 3, 8) & "-" & _
Mid(Hexa1, 11, 8) & "-" & _
Right(Hexa1, 8)Mais c'est comme si c'etait pas prit en compte
re,
hexa1 contient une chaine de 24 bits. je n'ai pas essayé de comprendre ce que tu attends comme résultat pour cette instruction.
Int2PCode = Char1 & WorksheetFunction.Bin2Dec(Right(Hexa1, 2)) & _
Mid(Hexa1, 3, 8) & "-" & _
Mid(Hexa1, 11, 8) & "-" & _
Right(Hexa1, 8)intp2 retourne le code correspondant aux 2 premiers bits, puis la conversion en decimal de ces mêmes 2 premiers bits, puis écrit les 8 bits suivants, puis un "-" puis les 8 bits suivants, puis un "-", puis les 8 derniers bits en partant de la droite. Je sais décortiquer l'instruction, mais je suis incapable de comprendre le résultat.
D'accord je vois, ce que je cherchais après avoir converti en binaire c'est d'avoir la valeur en hexadecimal comme la colonne D du fichier DiffClasseur.
Exemple :
332 642 (dec)
= 0101 0001 0011 0110 0010 (binaire)
= 0000 0101 0001 0011 0110 0010 (binaire sur 24 bits)
( 0000 = P0; 0101 = 5; 0001 = 1 etc)
= P 0 5 1 3 6 2 (P0513-62)