Boucle insérée dans une fonction

gdcobra91

XLDnaute Junior
Bonjour,

Dans mon code VBA, au lieu de répéter une vingtaine de fois une boucle IF, j'ai décidé de créer une fonction et de faire appel à cette dernière.

Voici mon code initial avant la création de la fonction (ceci fonctionne):

'Initialisation des variables
M = 65
P = 0
Q = 32
N = Chr(M) 'N=A

If M = 90 Then
M = 65
Q = M + P
N = Chr(Q) & Chr(M)
P = P + 1
Else
M = M + 1
N = Chr(Q) & Chr(M)
End If

'Ici j'appelle une autre fonction.. mais pas utile que je l'insére. Ensuite, je dois ré-exécuter ma boucle

If M = 90 Then
M = 65
Q = M + P
N = Chr(Q) & Chr(M)
P = P + 1
Else
M = M + 1
N = Chr(Q) & Chr(M)
End If

'Idem. Je ré-exécute ma boucle et ainsi de suite...

If M = 90 Then
M = 65
Q = M + P
N = Chr(Q) & Chr(M)
P = P + 1
Else
M = M + 1
N = Chr(Q) & Chr(M)
End If

' ....

Ma solution a été de créer une fonction boucle afin de ne pas devoir la ré-écrire à chaque fois, sauf que j'obtiens systématiquement une erreur de compilation: Type d'argument ByRef incompatible


Function boucleM(ByRef Var_M As String) As String

MsgBox (Var_M)
If Var_M = 90 Then
M = 65
Q = M + P
N = Chr(Q) & Chr(M)
P = P + 1
Else
M = Var_M + 1
N = Chr(Q) & Chr(M)
End If

End Function


Sub Macro20()
'
' Macro20 Macro
'

M = 65
P = 0
Q = 32
N = Chr(M)

boucleM(M)

MsgBox (M)
MsgBox (N)
MsgBox (P)
MsgBox (Q)
End Sub


Questions:
1/ Comment dois-je faire pour que mon code fonctionne?
2/ Les variables gardent-elles la même valeur mais en passant dans une fonction? Si non, je dois donc récupérer les bonnes valeurs après le passage dans la fonction, mais comment faire?
3/ Je ne comprends pas bien comment appeler une fonction:
-> valeurRetournee = appelFonction(Var1, Var2)
-> appelFonction(Var1, Var2)
-> appelFonction Var1, Var2
quelle est la bonne façon de faire??

Je vous remercie par avance de votre aide.
 

Theze

XLDnaute Occasionnel
Re : Boucle insérée dans une fonction

Bonjour,

Ta fonction ne retourne rien donc, tu n'as pas besoin d'une fonction mais d'une procédure :
Code:
Sub boucleM(ByVal Var_M As String)

    MsgBox (Var_M)
    If Var_M = 90 Then
    M = 65
    Q = M + P
    N = Chr(Q) & Chr(M)
    P = P + 1
    Else
    M = Var_M + 1
    N = Chr(Q) & Chr(M)
    End If

End Sub
Et même si tu utilise une fonction, comme tu ne modifie pas la valeur de "Var_M", tu peux la passer par valeur (ByVal) et non par référence (ByRef)

Hervé.
 

gdcobra91

XLDnaute Junior
Re : Boucle insérée dans une fonction

Merci Hervé.

Ca compile parfaitement. En revanche, le résultat n'est pas tout à fait celui que je souhaitais. En effet, les variables qui changent à l'intérieur de la boucle, ne doivent pas être réinitialisées en sortie de la procédure.

Je me ré-explique. Par exemple, si la valeur de Q ou de P change en passant par la procédure, je souhaiterai qu'une fois sortie de la procédure, les valeurs modifiées soient inchangées car j'en ai besoin pour la suite de mon prog. Si Q passe de 65 à 66 alors dans le programme chapeau, Q devra valoir aussi 66.

Merci.
 

gdcobra91

XLDnaute Junior
Re : Boucle insérée dans une fonction

Qui peut m'aider svp?

Comment peut-on faire pour que les valeurs modifiées dans la procédure, soient également modifiées dans le programme chapeau?? Dans la réponse précédente, les valeurs sont réinitialisées, comme si la procédure n'avait rien fait.

Merci par avance.
 

Dranreb

XLDnaute Barbatruc
Re : Boucle insérée dans une fonction

Bonsoir.
Passez le ByRef (assumé par défaut) mais déclarez le impérativement du même type dans le programme appelant que dans la Sub. Là ils ne sont pas déclarés, donc assumés Variant alors que la Sub attend du String
Cordialement.
 

Theze

XLDnaute Occasionnel
Re : Boucle insérée dans une fonction

Bonsoir,

Déclare tes variables en tête de module de façon à ce que leurs portées soit de niveau module et dans ce cas, chaque modification de leurs valeurs sera gardée en mémoire.
Attention au typage de tes variables, tu déclare "Var_M" de type string alors que tu l'utilise en type Integer (M = Var_M + 1) ce qui oblige le compilateur à faire des conversions et donc ralenti l'exécution.
Un bon conseil, oblige la déclaration des variables avec Option Explicit en tête de chaque module ça t"évitera de t'arracher les cheveux bon nombre de fois. Pour que ce soit automatique, menu Outils > Options... > onglet Editeur > case à cocher Déclaration des variables obligatoire :
Code:
Dim M As Integer
Dim Q As Integer
Dim P As Integer
Dim N As String

Sub Test()

    'initialise
    M = 65
    P = 0
    Q = 32
    N = Chr(M)
    
    'appelle la proc
    boucleM 90

End Sub

'Sub boucleM(ByVal Var_M As String) <-- ici, Var_M ne doit pas être de type String
Sub boucleM(ByVal Var_M As Integer) '<-- mais Integer ou Long

    MsgBox (Var_M)
    
    If Var_M = 90 Then
    
        M = 65
        Q = M + P
        N = Chr(Q) & Chr(M)
        P = P + 1
        
    Else
    
        M = Var_M + 1
        N = Chr(Q) & Chr(M)
        
    End If

End Sub

Hervé.
 

Statistiques des forums

Discussions
312 400
Messages
2 088 082
Membres
103 710
dernier inscrit
amin Saadaoui