Variables "liées" ?

Salut tout le monde,

j'ai problème sur un petit bout de code que j'ai écrit, avec un comportement que je n'ai jamais rencontré avant, et qui me laisse perplexe.
à l'aide d'une boucle while, la macro parcourt un array (à partir de la ligne rowCmdFirst, une variable integer) et trouve la prochaine ligne correspondant à un critère donné, et l'enregistre dans une variable integer rowCmdNext. Jusqu'ici tout va bien. Par contre, une fois que j'ai trouvé rowCmdNext, j'ai besoin d'utiliser rowCmdFirst, mais là, elle à changé, alors qu'aucune ligne n'instruit explicitement le changement. En y regardant de plus près, on voit que rowCmdFirst augmente de 1 à chaque boucle, de la même manière que rowTarget, que j'incrémente expressément.

Est ce que vous avez une idée d'où ça peut venir ? Merci d'avance.

voici le code en question, le fichier est dans le post suivant.

(arrTemp est un array 2D, colCmdCode est une constante utilisée pour la deuxième dimension de arrTemp)

Sub subCmdVisReadOne(ByRef arrTemp As Variant, rowCmdFirst As Integer, Optional rowCmdLast As Integer)

If rowCmdLast = 0 Then rowCmdLast = UBound(arrTemp, 1)

Dim CmdCode As String
CmdCode = arrTemp(rowCmdFirst, colcmdcode)

'on trouve le cmdLevel a partir du cmdCode
Dim cmdLevel As Integer
cmdLevel = CInt(Mid(CmdCode, 8, 1))

'on trouve le prochain cmdCode de meme niveau
rowTarget = rowCmdFirst + 1
Dim rowCmdNext As Integer

While rowCmdNext = 0 And rowTarget <= rowCmdLast

    If arrTemp(rowTarget, colcmdcode) <> "" Then
        'si c'est un code de meme niveau
        If CInt(Mid(arrTemp(rowTarget, colcmdcode), 8, 1)) = cmdLevel Then
            MsgBox "trouvé " & rowTarget
            rowCmdNext = rowTarget
        End If
    End If

    rowTarget = rowTarget + 1
Wend

If rowCmdNext <> 0 Then
    MsgBox rowCmdFirst
    Msgbox rowCmdNext
End If

End Sub

J'ai nettoyé le fichier de tout ce qui n'était pas nécessaire, le problème persiste ce n'est donc pas un conflit avec un autre module ou une autre sub, mais je n'ai toujours aucune idée d'ou ça peut venir.

9test.xlsm (43.80 Ko)

Bonjour,

En attendant meilleure réponse, est-ce que vous pourriez essayer comme ceci, en rajoutant byval :

Sub subCmdVisReadOne(ByRef arrTemp As Variant, byval rowCmdFirst As Integer, Optional rowCmdLast As Integer)

Dim CmdCode As String
Dim cmdLevel As Integer
Dim rowCmdNext As Integer

If rowCmdLast = 0 Then rowCmdLast = UBound(arrTemp, 1)

CmdCode = arrTemp(rowCmdFirst, colcmdcode)

'on trouve le cmdLevel a partir du cmdCode

cmdLevel = CInt(Mid(CmdCode, 8, 1))

'on trouve le prochain cmdCode de meme niveau
rowTarget = rowCmdFirst + 1

While rowCmdNext = 0 And rowTarget <= rowCmdLast

    If arrTemp(rowTarget, colcmdcode) <> "" Then
        'si c'est un code de meme niveau
        If CInt(Mid(arrTemp(rowTarget, colcmdcode), 8, 1)) = cmdLevel Then
            MsgBox "trouvé " & rowTarget
            rowCmdNext = rowTarget
        End If
    End If

    rowTarget = rowTarget + 1
Wend

If rowCmdNext <> 0 Then
    MsgBox rowCmdFirst
    Msgbox rowCmdNext
End If

End Sub

Cdlt,

bonsoir,

tu as défini rowtarget comme variable globale.

tu utilises cette variable dans l'appel de ta fonction subCmdVisReadOne, dans ta fonction cette variable reçoit le nom rowCmdfirst (comme par défaut, le passage de variable se fait par référence, rowcmdfirst et rowtarget définissent le même espace mémoire (et donc quand on modifie rowtarget, rowcmdfirst est modifié également). En forçant le passage du paramètre en valeur (comme le propose 3GB), tu solutionnes ce problème, mais tu rencontres une autre erreur plus loin, que je te laisse investiguer.

Salut à vous deux,

merci beaucoup pour vos réponses. Je suis arrivé à la même conclusion hier soir : que le problème vient du fait que j'utilise la même variable pour deux "utilisations" différentes. (autant vous dire que je me suis senti couillon). Je l'ai contourné en déclarant une autre variable pour l'appel de la fonction subCmdVisreadOne plutot qu'en passant l'argument en Byval, mais je vais faire le test et voir ce qui bloque. En tout cas, je crois que je suis bon pour me faire un bon cours sur la portée des variables et byref / byval, apparemment c'est encore un peu flou!

Merci encore sur votre aide, ça soulage vraiment de pouvoir compter sur un regard extérieur.

En forçant le passage du paramètre en valeur (comme le propose 3GB), tu solutionnes ce problème, mais tu rencontres une autre erreur plus loin, que je te laisse investiguer.

Bon ben j'ai continué le code, j'ai passé l'argument en byVal et pour l'instant ça marche parfaitement, il faut que je m'inquiète ?

bonsoir,

Bon ben j'ai continué le code, j'ai passé l'argument en byVal et pour l'instant ça marche parfaitement, il faut que je m'inquiète ?

ben non, si ça fonctionne alors tout va bien. Je ne me suis sans doute pas mis dans le bon contexte pour exécuter cette macro corrigée.

Rechercher des sujets similaires à "variables liees"