Retourner variable depuis fonction

Bonjour,

J'ai un code pas du tout optimisé, et j'aimerais retourner une variable depuis celui-ci mais cela bloque, des idées ?

Sub Button2_Click()
    Dim CT As String
    Dim CTmp As String
    Dim Tipe As String

    Dim un As String
    Dim deux As String
    Dim trois As String
    Dim quatre As String
    Dim cinq As Integer
    Dim six As Integer
    Dim sept As Integer
    Dim huit As Integer
    Dim neuf As Integer
    Dim dix As Integer
    Dim onze As Integer

    Dim total As Integer
    total = 0
    Dim reste As Integer
    Dim tmp As Integer
    tmp = 0
    Dim nombre As Integer

    CT = InputBox(CT)

    If Len(CStr(CT)) = 11 Then
        'initialiser variable de traitement'
        CTmp = CT

        'attribuer chaque numéro à une variable'
        un = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        deux = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        trois = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        quatre = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        cinq = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        six = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        sept = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        huit = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        neuf = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        dix = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        onze = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)

        Call Module1.lettre(un)
        MsgBox (nombre)
        total = nombre
        Call Module1.lettre(deux)
        MsgBox (nombre)
        total = total + nombre * 2
        Call Module1.lettre(trois)
        MsgBox (nombre)
        total = total + nombre * 4
        Call Module1.lettre(quatre)
        MsgBox (nombre)
        total = total + nombre * 8

        total = total + cinq * 16 + six * 32 + sept * 64 + huit * 128 + neuf * 256 + dix * 512
        reste = total Mod 11

        If reste = onze Then
            MsgBox ("numéro valide")
        Else
            MsgBox ("numéro INVALIDE !!!!")
        End If

    Else
        MsgBox ("pas 11 caractères")
    End If
End Sub

Sub lettre(lettre)

    If lettre Like A Then
        nombre = 10
    End If
    If lettre Like B Then
        nombre = 12
    End If
    If lettre Like C Then
        nombre = 13
    End If
    If lettre Like D Then
        nombre = 14
    End If
    If lettre Like E Then
        nombre = 15
    End If
    If lettre Like F Then
        nombre = 16
    End If
    If lettre Like G Then
        nombre = 17
    End If
    If lettre Like H Then
        nombre = 18
    End If
    If lettre Like I Then
        nombre = 19
    End If
    If lettre Like J Then
        nombre = 20
    End If
    If lettre Like K Then
        nombre = 21
    End If
    If lettre Like L Then
        nombre = 23
    End If
    If lettre Like M Then
        nombre = 24
    End If
    If lettre Like N Then
        nombre = 25
    End If
    If lettre Like O Then
        nombre = 26
    End If
    If lettre Like P Then
        nombre = 27
    End If
    If lettre Like Q Then
        nombre = 28
    End If
    If lettre Like R Then
        nombre = 29
    End If
    If lettre Like S Then
        nombre = 30
    End If
    If lettre Like T Then
        nombre = 31
    End If
    If lettre Like U Then
        nombre = 32
    End If
    If lettre Like V Then
        nombre = 34
    End If
    If lettre Like W Then
        nombre = 35
    End If
    If lettre Like X Then
        nombre = 36
    End If
    If lettre Like Y Then
        nombre = 37
    End If
    If lettre Like Z Then
        nombre = 38
    End If
    Return
End Sub

Merci d'avance

Bonjour,

voici une proposition de correction

Sub Button2_Click()
    Dim CT As String
    Dim CTmp As String
    Dim Tipe As String

    Dim un As String
    Dim deux As String
    Dim trois As String
    Dim quatre As String
    Dim cinq As Integer
    Dim six As Integer
    Dim sept As Integer
    Dim huit As Integer
    Dim neuf As Integer
    Dim dix As Integer
    Dim onze As Integer

    Dim total As Integer
    total = 0
    Dim reste As Integer
    Dim tmp As Integer
    tmp = 0
    Dim nombre As Integer

    CT = InputBox(CT)

    If Len(CStr(CT)) = 11 Then
        'initialiser variable de traitement'
       CTmp = CT

        'attribuer chaque numéro à une variable'
       un = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        deux = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        trois = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        quatre = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        cinq = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        six = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        sept = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        huit = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        neuf = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        dix = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        onze = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)

        nombre = lettre(un)
        MsgBox (nombre)
        total = nombre
        nombre = lettre(deux)
        MsgBox (nombre)
        total = total + nombre * 2
        nombre = lettre(trois)
        MsgBox (nombre)
        total = total + nombre * 4
        nombre = (quatre)
        MsgBox (nombre)
        total = total + nombre * 8

        total = total + cinq * 16 + six * 32 + sept * 64 + huit * 128 + neuf * 256 + dix * 512
        reste = total Mod 11

        If reste = onze Then
            MsgBox ("numéro valide")
        Else
            MsgBox ("numéro INVALIDE !!!!")
        End If

    Else
        MsgBox ("pas 11 caractères")
    End If
End Sub

Function lettre(l)
lettre = Asc(UCase(l)) - 55
End Function

Cela ne fonctionne pas ce que je souahirterais c'est qu'en appelant la fonction lettre cela retourne la valeur nombre pour pouvoir l'utiliser dans le calcul de la fonction d'appel

en gros j'aimerais une fonction a qui j'envoie la lettre et qui me renvoi la valeur correspondante après les test

Bonjour,

j'ai transformé ton module lettre en fonction de telle sorte quelle renvoie les valeurs telles que tu l'as programmé à savoir

si la fonction reçoit un A, la fonction retourne 10, si elle reçoit un B, elle retourne un 12 etc ...

si ce n'est pas ce que tu attends, peux-tu donner une exemple qui illustre ce que tu attends de cette fonction ?

le paramètre en entrée, le résultat en sortie et ce qu'il faut faire pour transformer le paramètre en résultat.

j'avoue ne pas avoir compris ce que tu voulais faire avec le programme qui appelle cette fonction.

OK, alors je ne comprend pas comment tu passe de

Sub lettre(lettre)

    If lettre Like A Then
        nombre = 10
    End If
    If lettre Like B Then
        nombre = 12
    End If
    If lettre Like C Then
        nombre = 13
    End If
    If lettre Like D Then
        nombre = 14
    End If
    If lettre Like E Then
        nombre = 15
    End If
    If lettre Like F Then
        nombre = 16
    End If
    If lettre Like G Then
        nombre = 17
    End If
    If lettre Like H Then
        nombre = 18
    End If
    If lettre Like I Then
        nombre = 19
    End If
    If lettre Like J Then
        nombre = 20
    End If
    If lettre Like K Then
        nombre = 21
    End If
    If lettre Like L Then
        nombre = 23
    End If
    If lettre Like M Then
        nombre = 24
    End If
    If lettre Like N Then
        nombre = 25
    End If
    If lettre Like O Then
        nombre = 26
    End If
    If lettre Like P Then
        nombre = 27
    End If
    If lettre Like Q Then
        nombre = 28
    End If
    If lettre Like R Then
        nombre = 29
    End If
    If lettre Like S Then
        nombre = 30
    End If
    If lettre Like T Then
        nombre = 31
    End If
    If lettre Like U Then
        nombre = 32
    End If
    If lettre Like V Then
        nombre = 34
    End If
    If lettre Like W Then
        nombre = 35
    End If
    If lettre Like X Then
        nombre = 36
    End If
    If lettre Like Y Then
        nombre = 37
    End If
    If lettre Like Z Then
        nombre = 38
    End If
    Return
End Sub

à ça

Function lettre(l)
lettre = Asc(UCase(l)) - 55
End Function

Bonsoir,

C'est vraiment le foutoir...

Dans le code fourni

A = 10

B = 12

idem on saute de 21 à 23, 32 à 34 ??

... Quelle logique ? Est-ce un codage à la mord moi le nœud ?

On se demande bien quel est le résultat attendu ?

Quel type de saisie est attendue dans CT ?

Quelle est la règle de validation ?

Pour moi le reste d'une division par 11 ne peut jamais être 11 !!!

Sinon si le codage est une suite logique, moi j'en suis là :

Sub Button2_Click()
Dim i%, reste%, total&, CT$, Arr$(1 To 11)

    CT = InputBox(CT)

    If Len(CStr(CT)) = 11 Then
        'initialiser variable de traitement'
        For i = 1 To 11
        Arr(i) = Asc(Mid(StrConv(CT, 3), i, 1)) - 55
        total = total + Arr(i) * (2 ^ ((i - 1)))
        Next

        reste = total Mod 11

        If reste = 11 Then 'impossible !

        Else
            MsgBox reste
        End If

    Else
        MsgBox ("pas 11 caractères")
    End If
End Sub

A+

Alors pour éclairer ta lanterne, cette suite je ne l'ai pas choisi c'est une formule qui sert à vérifier des numéro de conteneur ou les 4 première lettre on leur correspondance selon le tableau donné

je redonne le code allégé

Sub Button3_Click()
    Dim CT As String

    Dim un As String
    Dim deux As String
    Dim trois As String
    Dim quatre As String
    Dim cinq As Integer
    Dim six As Integer
    Dim sept As Integer
    Dim huit As Integer
    Dim neuf As Integer
    Dim dix As Integer
    Dim onze As Integer

    Dim total As Integer
    total = 0
    Dim reste As Integer

    CT = InputBox(CT)

    If Len(CStr(CT)) = 11 Then
        'attribuer chaque numéro à une variable'
        un = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        deux = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        trois = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        quatre = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        cinq = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        six = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        sept = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        huit = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        neuf = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        dix = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        onze = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)

        reste = (lettre(un) + lettre(deux) * 2 + lettre(trois) * 4 + lettre(quatre) * 8 + _
                cinq * 16 + six * 32 + sept * 64 + huit * 128 + neuf * 256 + dix * 512) Mod 11

        If reste = onze Then
            MsgBox ("numéro valide")
        Else
            MsgBox ("numéro INVALIDE !!!!")
        End If

    Else
        MsgBox ("pas 11 caractères")
    End If
End Sub

Function lettre(l)
    lettre = Asc(UCase(l)) - 55
End Function

et "onze" est le nom de la onzième variable du conteneur


le dernier chiffre quoi


en gros je prend le premier chiffre je l'affecte a 1variable puis je le supprime et après je travaille avec les variables afin de savoir si cela respecte la formule ou non


lettre = Asc(UCase(l)) - 55

je revient dessus mais je en comprend vraiment pas comment tu passe de ma série à la "'("'/ à juste une ligne o-O

Bonsoir,

Cette formule c'est juste dans l'hypothèse d'une suite de valeur continue si les omissions que je signale (11,22,33) sont valide, ça change tout (au moins pour moi). Je n'ai pas trop épluché le code de h2so4 mais je suppose qu'il à fait la même erreur.

Sinon le reste d'une division par 11 ne peut jamais être 11 !!!

        reste = total Mod 11
        If reste = 11 Then 'impossible !

Pour pouvoir tester il faut que tu nous donne quelques exemple de CT valide et de CT invalide.

A+

La macro corrigé pour tenir compte des valeurs 11 22 33 qui sont absentes dans la liste de valeurs.

Sub Button2_Click()
Dim i%, reste%, total&, CT$, Arr(1 To 11), Tablo, ii%
Tablo = Split("0 10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 34 35 36 38")
    CT = InputBox(CT)
    'conversion de la saisie en majuscule
    CT = StrConv(CT, 1)
    If Len(CStr(CT)) = 11 Then
        'initialiser variable de traitement'
        For i = 1 To 11
         'valeur de la lettre
         Arr(i) = Tablo(Asc(Mid(CT, i, 1)) - 64)
         total = total + (Arr(i) * (2 ^ ((i - 1))))
        Next
        reste = total Mod 11
        If reste = 11 Then 'impossible !
        Else
            MsgBox reste
        End If
    Else
        MsgBox ("pas 11 caractères")
    End If
End Sub

Mais en l'absence de réponse, je ne sais toujours pas ce qu'il faut faire de ton reste car

reste mod 11 varie toujours entre 0 et 10 et ne peux jamais être égal à 11...

A+

CODE: TOUT SÉLECTIONNER

lettre = Asc(UCase(l)) - 55

je revient dessus mais je en comprend vraiment pas comment tu passe de ma série à la "'("'/ à juste une ligne o-O

j'ai effectivement lu trop vite le code, j'ai supposé une série continue. je n'ai pas mis mes bons yeux. c'est donc faux !

A 10

B 12

C 13

D 14

E 15

F 16

G 17

H 18

I 19

J 20

K 21

L 23

M 24

N 25

O 26

P 27

Q 28

R 29

S 30

T 31

U 32

V 34

W 35

X 36

Y 37

Z 38

Un numéro de conteneur est toujours de la forme suivante :

ABCD 1234567

le dernier chiffre 7 est le chiffre clé (que prend la variable "onze" car c'est le onzième caractère de la séquence que je dés-os.

donc il peux aller de 0-9


Je ne sais pas si c'est une suite logique je ne me suis pas poser la question et j'étais une brelle en récurrence, mais c'est la suite que l'on ma communiquer ^^


et je teste si le nombre de caractère de la chaine est = à 11 car je vérifie qu'il n'y ai pas eu d'erreur de frappe


Si la suite logique fonctionnais ce code serais ok

Sub Button3_Click()
    Dim CT As String

    Dim un As String
    Dim deux As String
    Dim trois As String
    Dim quatre As String
    Dim cinq As Integer
    Dim six As Integer
    Dim sept As Integer
    Dim huit As Integer
    Dim neuf As Integer
    Dim dix As Integer
    Dim onze As Integer

    Dim total As Integer
    total = 0
    Dim reste As Integer

    CT = InputBox(CT)

    If Len(CStr(CT)) = 11 Then
        'attribuer chaque numéro à une variable'
        un = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        deux = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        trois = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        quatre = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        cinq = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        six = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        sept = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        huit = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        neuf = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        dix = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)
        onze = Left(CT, 1)
        CT = Right(CT, Len(CStr(CT)) - 1)

        reste = (lettre(un) + lettre(deux) * 2 + lettre(trois) * 4 + lettre(quatre) * 8 + _
                cinq * 16 + six * 32 + sept * 64 + huit * 128 + neuf * 256 + dix * 512) Mod 11

        If reste = onze Then
            MsgBox ("numéro valide")
        Else
            MsgBox ("numéro INVALIDE !!!!")
        End If

    Else
        MsgBox ("pas 11 caractères")
    End If
End Sub

Function lettre(l)
    lettre = Asc(UCase(l)) - 55
End Function

bonjour,

ben voilà si tu nous dis tout...

J'ai modifié la macro pour un code du type "ABCD1234567"

Sub Test()
Dim i%, reste%, total&, CT$, Arr(1 To 11), Tablo, ii%
Tablo = Split("0 10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 34 35 36 38")
   CT = InputBox(CT)
   'conversion de la saisie en majuscule
   CT = StrConv(CT, 1)
   If Len(CStr(CT)) = 11 Then
      'initialiser variable de traitement'
      For i = 1 To 4
         'valeur de la lettre
         Arr(i) = Tablo(Asc(Mid(CT, i, 1)) - 64)
         total = total + (Arr(i) * (2 ^ ((i - 1))))
      Next
      For i = 5 To 11
         'valeur des chiffres
         Arr(i) = CByte(Mid(CT, i, 1))
         total = total + Arr(i) * (2 ^ ((i - 1)))
      Next
      reste = total Mod 11
      If reste = 11 Then 'impossible !
      Else
         MsgBox reste
      End If
   Else
      MsgBox ("pas 11 caractères")
   End If
End Sub

En revanche, ça ne change rien au fait que reste ne peut JAMAIS être égal à 11 !

Le reste d'une division par 11 ne peut JAMAIS être 11

Tu peux tourner ça dans tout les sens et consulter tous les forums de la terre, je te parie une bière contre un coup de pied au cul que tu ne trouveras pas quelqu'un pour prouver le contraire.

Si tu n'es pas encore convaincu tu peux encore essayer ça :

Sub galopin()
Dim total, reste
For total = 1 To 10000000
   reste = total Mod 11
      If reste = 11 Then 'impossible !
         MsgBox reste
      End If
Next
MsgBox "Tous les restes d'une division par 11 sont < 11 !"
End Sub

Mais ne compte plus sur moi pour continuer sur ce sujet...

A+

reste ne peux jamais etre égal a 11 mais reste peux etre égal à la variable "onze" car onze est une variable qui correspond au dernier numéro de la chaine de caractère


ok merci je vais regarder cela


Autant pour moi je pense que je n'ai pas été claire :

Je souhaite lorsque j'appel la fonction Lettre (avec en argument la lettre en question)

qu'il me retourne le chiffre correspondant que je puisse utiliser dans la macro mère


afin d'éviter d'écrire 4 fois toutes les conditionnelles a=10 b=12 etc

gloutoni a écrit :

reste ne peux jamais etre égal a 11 mais reste peux etre égal à la variable "onze" car onze est une variable qui correspond au dernier numéro de la chaine de caractère

Ah ben ça c'est très différent...

Dans ce cas il faut modifier cette ligne

If reste = 11 Then 'impossible ! par :

if reste =Arr(11 Then)

Le reste sans changement.

Comme je n'utilise pas de Function lettre il faut en créer une :

Function lettre(i%)
Tablo = Split("0 10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 34 35 36 38")
lettre = Tablo(i)
End Function

A+

Je ne comprend pas tout dans ce code mais merci cela fonctionne à merveille

    Sub Test()
    Dim i%, reste%, total&, CT$, Arr(1 To 11), Tablo, ii%
    Tablo = Split("0 10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 34 35 36 38")
       CT = InputBox(CT)
       'conversion de la saisie en majuscule
      CT = StrConv(CT, 1)
       If Len(CStr(CT)) = 11 Then
          'initialiser variable de traitement'
         For i = 1 To 4
             'valeur de la lettre
            Arr(i) = Tablo(Asc(Mid(CT, i, 1)) - 64)
             total = total + (Arr(i) * (2 ^ ((i - 1))))
          Next
          For i = 5 To 11
             'valeur des chiffres
            Arr(i) = CByte(Mid(CT, i, 1))
             total = total + Arr(i) * (2 ^ ((i - 1)))
          Next
          reste = total Mod 11
          If reste = Arr(11) Then
            MsgBox ("valide")
         Else
             MsgBox ("invalide")
          End If
       Else
          MsgBox ("pas 11 caractères")
       End If
    End Sub

s'il te reste un peu de temps quelques explication sur la partie ... , heu non en dehors des conditionnelles classique je ne comprend rien le tableau le split les 2 for, ou sont les lettres de correspondance ?

Super propre condensé nickel, mais moi pas comprendre, serait-il possible d'avoir quelques éclaircissement svp

Bonjour,

Vous pouvez modifier cette ligne

If Len(CStr(CT)) = 11 Then

de la manière suivante :

       If Len(CT) = 11 Then

Explication : Le CStr ne sert à rien puisque la InputBox renvoie toujours du Texte...

Nota : Les variables Arr et Tablo sont des variables complexes de type Array (liste ou tableaux)

Les Array sont un moyens puissant doptimiser votre code...

Le Split transforme la chaine de caractère ("0 10 12...") en liste qui est mémorisée dans Tablo

De la même manière Arr est un Array (vide pour l'instant) destiné à mémoriser plus tard les 11 valeurs (tes fameuses lettres) de chaque caractère.

Pour comprendre le reste du code :

Petit cours de débogage

Si vous regardez la fenêtre de débogage remarquez 2 choses que vous n'utilisez peut-être pas encore :

  • La fenêtre d'exécution
  • La zone des poins d'arrêt (L'espace gris qui figure à gauche de la fenêtre de code)
debug00

Quand vous cliquez sur une ligne de code (par exemple sur la ligne :

CT = StrConv(CT, 1)

Si vous appuyez sur [F9] un gros point rouge apparait.

Si vous appuyez à nouveau sur [F9] le point disparait.

En utilisant judicieusement ces deux zones vous allez pouvoir analyser de nombreuses informations sur le code.

Enfin pour pouvez utiliser l'instruction "Stop"

Placée juste avant le premier Next elle agit comme un point d'arrêt permanent (comme si vous aviez posé un point d'arrêt sur la ligne Next)

Armé de tous ces outils vous allez maintenant pouvoir décortiquer tout le code.

Dans ce qui suit nous n'utiserons que les poins d'arrêt plus facile à manipuler.

Cliquez sur la ligne :

If Len(CT) = 11 Then et posez un point d'arrêt avec [F9] sur la ligne : Le point rouge s'affiche.

debug02

Exécutez maintenant la macro en appuyant [F5] et entrez le code "abcd1234567"

La macro s'interrompt aussitot et la ligne ou vous avez inséré le point d'arrêt se met en surbrillance.

Avec la souris survolez (ligne précédente) la variable CT vous verrez s'afficher le contenu de la variable : "ABCD1234567"

Notez que le survol est quelquefois capricieux, il faut parfois cliquer sur l'expression pour lire résultat.

debug03

Si vous aviez entré "abcd" en minuscule remarquez que l'instruction CStrConv à bien fait son travail en transformant la chaîne en majuscule.

debug04

Survolez maintenant le mot Len vous verrez s'afficher la confirmation que CT comporte bien 11 caractères

Nous aurions pu également utiliser la fenêtre d'exécution et taper :

? Len(CT) puis [Enter]

La fenêtre d'exécution affiche 11

debug05

Prenez l'habitude d'effacer à chaque fois aussitot la fenêtre d'exécution.

Toujours dans la fenêtre d'exécution entrez :

? Len(CT) = 11

Le résultat s'affiche immédiatement

debug06

Ce qui signifie que la macro va donc pouvoir continuer normalement.

Supprimez maintenant le point d'arrêt et posez-en un autre sur le Next suivant.

Exécutez à nouveau la macro [F5] et entrez le code "abcd1234567"

La macro s'interrompt et le Next se met en surbrillance

debug07

La boucle For passe en revue les 4 premiers caractères :

Survolez le i (ligne précédente) : Pour l'instant VBA évalue le premier caractère

Dans la fenêtre d'exécution entrez

? Mid(CT, i, 1)

Vous constatez que le premier caractère est bien un A

Notez que dans cette expression complexe un simple survol ne fonctionnerait pas :

L'usage de la fenêtre d'exécution est alors indipensable.

Attention aux parenthèses : Dans une expression, il doit y avoir autant de parenthèse ouvrantes que fermantes...

debug08

Dans la fenêtre d'exécution entrez

Asc(Mid(CT, i, 1))

Constatez que A vaut 65

debug09

Dans cette ligne

Arr(i) = Tablo(Asc(Mid(CT, i, 1)) - 64)

l'instruction

Tablo(Asc(Mid(CT, i, 1)) - 64) va donc stocker dans Arr(i) la première valeur stockée dans Tablo

debug10

Vérifions en survolant (ou en cliquant) Arr :

Arr(1) contient bien la valeur prévue pour la lettre A

Dans la fenêtre d'exécution entrez :

? Arr(i) * (2 ^ ((i - 1))) 

ou

?  total

Vous pouvez maintenant entrer [F5] pour analyser le deuxième caractère de votre code ;

Dans la fenêtre d'exécution entrez :

? Arr(2) 

et constatez que Arr(2) contient bien la valeur prévue pou B (12) et :

?  total

renvoie bien la valeur prévue...

Vous pouvez maintenant poser un point d'arrêt sur le Next suivant pour voir comment sont évalués successivement tous les caractères numériques.

Vous disposez maintenant de tous les outils nécessaires pour comprendre et analyser votre code.

Enfin n'oubliez pas que l'aide de VBA (touche [F1]) peux vous donner des explications détaillés sur les mots clefs VBA.

A+

Bonsoir merci beaucoup pour le code est surtout pour les explications je vais étudier cela en détail.

Merci beaucoup

Rechercher des sujets similaires à "retourner variable fonction"