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 Function

Permet 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 Function

Mais ça me met une erreur de ce type :

image

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 Function

bonjour,

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 Function

re-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 Sub

Bonjour 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 je dois l'arrêter de moi même est-ce normal ?

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.

6matrix.zip (494.31 Ko)

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 Sub

Re 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)

Rechercher des sujets similaires à "impossible lire propriete"