IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

traduire code C en VBA


Sujet :

VBA

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut traduire code C en VBA
    bonjour,

    J'ai dans excel, une colonne replie de valeurs écrites en hexadecimal (sur deux caractères)
    Ex :
    cellule A1 = 01
    cellule A2 = C1
    cellule A3 = CE
    ...

    J'ai des fonctions écrites en langage C qui me permettent de calculer un checksum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // fonctions de calcul de checksum
     
    unsigned int I2C_CRC;
     
    // initialise la fonction de checksum
    void CRC_Init(void){
    	I2C_CRC = 0xFFFF;
    }
     
    // ajoute un octet au calcul du checksum
    void CRC_AddByte(unsigned char myVal){
    	unsigned char j, myflag;
     
    	I2C_CRC ^= (unsigned int)(myVal); // XOR
     
    	for (j=0; j<8; j++) {
    		myflag = (I2C_CRC & 0x0001); //On récupère le dernier bit
    		I2C_CRC >>= 1; // décalage 1 coup a droite
    		if (myflag){
    			I2C_CRC ^= 0xA001; // si le dernier bit vaut 1 -> on fait un Xor avec 0xA001
    		}
    	}
    }
     
    // récupère la valeur du CRC en cours
    unsigned int CRC_Get(void){
    	return I2C_CRC;
    }
    Mon checksum est compris entre 0 et 65535 (0x0000 et 0xFFFF)

    1- j'initialise le checksum en lançant la fonction CRC_Init()
    2- j'ajoute mes éléments en utilisant la fonction CRC_AddByte(maValeur)
    3- je recupère la valeur de mon checksum en lançant la commande CRC_Get()
    => comment faire pour traduire cette fonction en VBA (je ne vois pas comment faire les opérations logiques (xor), les conversions en hexa et la limitation sur 16 bits de la valeur du checksum en VBA) ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    je vois deux solutions:

    1. Créer une dll en C avec ces fonctions, référencer la dll dans le projet VBA Excel et utiliser les fonctions de la dll via DECLARE ...

    2. Réécrire les fonctions (ce qui me semble plus simple)

    Si solution 2, peux-tu détailler ce que tu souhaites réaliser, car la lecture du C me pose quelques problèmes
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    J'ai besoin de :
    1- convertir une chaine représentant un nombre hexa (2 digits) en nombre décimal (la valeur est mise dans une variable de type integer)
    2- comment fait-on pour travailler sur des variables de 16 bits
    3- faire un ou exclusif entre deux nombres codés sur 16 bits => nbr1 xor nbr2 à l'air de marcher mais je voudrais la confirmation car en vba je ne sais pas du tout comment sont codées les variables
    4- faire un masque (dans mon cas je veux récupérer le bit de poid le plus faible)
    5- faire un décalage de bit vers la droite => une division par puissance de 2 devrait suffire mais n'y a t-il pas plus simple/rapide ?

  4. #4
    Expert confirmé
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Par défaut
    Salut,

    Pour la conversion en hexadécimal, regarde dans la FAQ VB.

    Pour le décalage (qui n'existe pas à ma connaissance en VB/VBA), il va te falloir utiliser du Left et du Right pour effectuer le décalage.

    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    I2C_CRC = Right(I2C_CRC, 1) & Left(I2C_CRC, 7)
    Tu prends la partie de droite (taille : 1 caractère = valeur du décalage) et tu la concatène avec la partie de gauche (ex : longueur 8 - le décalage)

    Pour le Xor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    I2C_CRC = I2C_CRC Xor myVal
    J'ai tenté une conversion de ton code : mais il y a quelque chose qui m'échappe

    Une dernière chose : pour te servir de ta fonction, pour reprendre ton exemple,

    cellule A1 = 01 cellule B1 = "=NomFonction(A1)"
    cellule A2 = C1 cellule B2 = "=NomFonction(A2)"
    cellule A3 = CE cellule B3 = "=NomFonction(A3)"

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    pour le decalage de bit je crois que tu n'as pas compris : je veux faire un decalage de bit sur un nombre et non pas un caractère

    ex:
    myVal = 017E (valeur hexa) => 0000 0001 0111 1110 (en binaire)
    décalage de 1 bit vers la droite de myVal = 0000 0000 1011 1111 => 00BF (valeur hexa)

    j'ai fait une focntion de decalage de 1 bit vers la droite mais ça fait n'importe quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Function Hex2Dec(hex As String) As Long
        Hex2Dec = Val("&h" & hex)
    End Function
     
     
     
    Sub test()
        Dim myVal1 As Long
        Dim myVal2 As Long
     
        myVal1 = Hex2Dec("DFDF")
        myVal2 = myVal1 / 2 'decalage de 1 bit vers la droite correspond normalement a faire une division par 2
     
        'résultat du decalage de 1 bit vers la droite de DFDF
        MsgBox (hex(myVal1) + " >> 1 = " + hex(myVal2))
    End Sub
    => je devrais avoir normalement comme résultat 6FEF

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Un décalage de 1 bit vers la droite sans report revient à diviser par 2, il me semble, donc pas besoin de fonction. Me trompé-je?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Un décalage de 1 bit vers la droite sans report revient à diviser par 2, il me semble, donc pas besoin de fonction. Me trompé-je?
    ben normalement oui mais dans mon cas ça ne marche po (deja la fonction de conversion hexa => decimal fonctionne bizarrement)

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Pas top d'utiliser hex en paramètre dans ta fonction ,car hex est déjà une fonction

    Pas besoin de fonction, sauf pour la clarté du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
    Dim ValeurHex As String
    Dim ValeurRetourHex As String
     
    ValeurHex = "FE"
     
    'Decalage de 1 bit vers la droite
    ValeurRetourHex = Hex(("&h" & ValeurHex) / 2)
    MsgBox ValeurRetourHex
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    pour m'affranchir des problèmes de conversion hex => dec, j'ai mis directement la valeur en decimal mais on peut voir que le decalage ne fonctionne toujours pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub test()
        Dim myVal1 As Long
        Dim myVal2 As Long
     
        Dim myStr1 As String
        Dim myStr2 As String
     
        'myVal1 = CLng(Hex2Dec("DFDF"))
        myVal1 = 57311
        myStr1 = hex(myVal1)
     
        myVal2 = myVal1 / 2
        myStr2 = hex(myVal2)
     
        'résultat du decalage de 1 bit vers la droite de DFDF
        MsgBox (myStr1 + " >> 1 = " + myStr2)
    End Sub
    => si je ne me trompe pas, je devrais normalement avoir comme résultat 6FEF

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/08/2006, 12h34
  2. Utiliser du code SQL dans VBA
    Par a2line dans le forum Requêtes et SQL.
    Réponses: 25
    Dernier message: 30/05/2006, 14h53
  3. Acceder a du code .net via VBA
    Par cedrox dans le forum Access
    Réponses: 1
    Dernier message: 04/05/2006, 11h42
  4. [RegEx] Traduire des "expression régulières" VBA en PHP
    Par jcachico dans le forum Langage
    Réponses: 13
    Dernier message: 19/01/2006, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo