VBA : Modification non désirée d'une valeur de variable

mprexcel

XLDnaute Junior
Bonjour à toutes et à tous,
Je me permets de faire appel à nouveau à vos connaissances.
J'utilise plusieurs Userforms (USF) afin de récolter les informations selon certains cas de figures.
Afin de pouvoir passer les informations d'une USF à une autre, j'ai déclaré certaines variables comme étant PUBLIC au début d'un module.
J'ai un problème avec deux USF qui ne passe pas l'information correctement.
Dans un USF, l'information est collectée par une LISTBOX ,dans l'autre USF, l'information est collectée par un TEXTBOX.
Je mets le code ci-dessous pour la listbox en précisant je fais pratiquement la même chose pour le textbox (Facturant = UserForm5.TextBox26.Value)


Code:
Private Sub ListBox1_Click()
Facturant = Userform4.ListBox1.Value
Worksheets("Transfert").Cells(1, 2).Value = Facturant
Userform4.TextBox25.Value = Facturant
MsgBox (Facturant)
End Sub

Vous remarquerez que j'ai pris la précaution d'écrire le contenu de la variable Facturant afin de pouvoir vérifier. J'ai rajouté cette ligne pour essayer de "déverminer" mon code. La valeur de la variable Facturant est correctement écrite dans la feuille "Transfert".
Afin de faciliter la tâche de l'utilisateur et comme j'utilise un MULTIPAGE, je fais apparaître la valeur dans le TextBox25. Pour être complet, le passage d'une page à l'autre se fait par un CommandButton afin d'être certain que l'utilisateur a rentré les informations nécessaires et la dernière page permet d'écrire les valeurs des données récoltées.
Les données récoltées sont écrites dans un tableau en utilisant le code suivant :
Code:
Private Sub CommandButton8_Click()
' Save as PUBLIC
Dim LR As ListRow

Worksheets("INV REC").Select
' toutes les informations obligatoires ont été testées avant
'--------------------------------------------------------
' On remplit le tableau
'--------------------------------------------------------

Range("Tableau1[#Totals]").Select
Set LR = Selection.ListObject.ListRows.Add(alwaysinsert:=True)
LR.Range.Cells(1, 2).Value = Facturant
LR.Range.Cells(1, 3).Value = POsubject
LR.Range.Cells(1, 4).Value = invref
LR.Range.Cells(1, 5).Value = myDate
LR.Range.Cells(1, 6).Value = POref
LR.Range.Cells(1, 7).Value = sanstva£
LR.Range.Cells(1, 8).Value = tva£
LR.Range.Cells(1, 9).Value = avectva£
LR.Range.Cells(1, 10).Value = pourcentage£ * flagtva£
LR.Range.Cells(1, 11).Value = sanstva€
LR.Range.Cells(1, 12).Value = tva€
LR.Range.Cells(1, 13).Value = avectva€
LR.Range.Cells(1, 14).Value = pourcentage€ * flagtva€
LR.Range.Cells(1, 15).Value = sanstvaSEK
LR.Range.Cells(1, 16).Value = tvaSEK
LR.Range.Cells(1, 17).Value = avectvaSEK
LR.Range.Cells(1, 18).Value = pourcentageSEK * flagtvaSEK
LR.Range.Cells(1, 19).Value = 1
LR.Range.Cells(1, 20).Value = datetopay
LR.Range.Cells(1, 21).Value = notes
' On rajoute une numéro d'ordre
LR.Range.Cells(1, 1).Select
ActiveCell.FormulaR1C1 = "=R[-1]C+1"
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Application.CutCopyMode = False
-----------------------------------
'On remet tout à zéro
raz
'----------------------------------
Worksheets("Intro").Select
    Range("K9").Select
Unload UserForm5
End Sub

La routine PUBLIC SUB raz met à zéro toutes les variables qui ont été déclarées comme publique, afin d'éviter des problèmes de "pollution" lorsque je retourne dans un USF.
Le problème que je rencontre est le suivant : la variable Facturant change de valeur lorsque j'exécute cette routine. Elle prend une valeur qui était celle de Facturant précédemment.
J'ai déjà mis un Msgbox juste avant d'écrire dans le tableau mais tout est ok.
L'un(e) d'entre vous aurait-il/elle une idée, une piste ou bien a-t-elle rencontré le même problème?

Je pourrais bien sûr écrire les informations sur une feuille puis les transmettre à l'endroit désiré mais j'aimerais bien élevé quelque peu mon niveau en VBA.

Mon niveau dans VBA n'est pas terrible et le code pour écrire dans un tableau a été "pompé" d'un site où un génie et son disciple ont sévis. ;)

Je cherche depuis vendredi après-midi mais sans succès.
J'espère ne pas avoir été trop long et je vous remercie d'avance pour votre aide.
Michel

Excel 2010 - 32 bit
Windows 7 Ultimate - 64 bit
 

mprexcel

XLDnaute Junior
Re : VBA : Modification non désirée d'une valeur de variable

Essaie UserForm4.repaint
et aussi
DoEvents

Bonjour Gourou AWK et merci de me répondre.
Je présume que je dois mettre le Userform4.repaint après Userform4.TextBox25.Value = Facturant

Mais pour le DoEvents et vu mon faible niveau en VBA, je ne comprends pas. :confused:
J'ai été voir dans le Help de VBA et je ne vois pas le rapport entre DoEvents et mon problème.
Pourrais-tu m'en dire un peu plus STP.
Merci beaucoup
 

Gourou AWK

XLDnaute Nouveau
Re : VBA : Modification non désirée d'une valeur de variable

1) Oui il faut le mettre après l'affectation. Ça provoque un rafraîchissement des zones du formulaire sans attendre une intervention autoritaire d'Excel qui n'est pas maîtrisée
2) DoEvents est une instruction qui redonne la main "à la boucle principale d'évènements" ce qui permet à excel de reprendre la main. Dans ton cas ce ne doit pas être justifié, mais sait-on jamais, sans connaître toute la dynamique de ton classeur.
 
G

Guest

Guest
Re : VBA : Modification non désirée d'une valeur de variable

Bonjour,

Si j'ai bien tout suivi:

Entre le moment où Private Sub ListBox1_Click() est appelée et le moment où Private Sub CommandButton8_Click() est appelée, la variable Facturant change de valeur?

Si c'est cela, le meilleur moyen de savoir ce qui se passe est de mettre des point d'arrêt un peu partout et/ou de faire du débogage en pas à pas, en ayant affiché la fenête espion avec pour espion la variable Facturant.

Tu as aussi la solution de mettre des débug.print un peu partout en ayant la fenêtre exécution affichée:

Debug.Print "NomDeLaProcédure facturant =" , Facturant

Tu verras à quel moment elle change et tu pourras corriger.

A+
 

mprexcel

XLDnaute Junior
Re : VBA : Modification non désirée d'une valeur de variable

Pour Gourou,
J'ai fait une première série de tests.
J'ai essayé REPAINT + DOEVENTS : ne me demande pas pourquoi mais la combinaison des deux me fait perdre ma variable mais aussi d'autres informations (?!)
J'ai essayé REPAINT et cela semble fonctionné.
Je mène une série complète de tests et si j'ai encore d'autres problèmes, je me permettrai de remonter ce post.

Je voudrais profiter de ce post pour remercier tous ceux/toutes celles qui prennent le temps et la peine de répondre à des novices comme moi.
La solidarité existe, ce forum en est la preuve.
 

mprexcel

XLDnaute Junior
Re : VBA : Modification non désirée d'une valeur de variable

Bonjour Hasco,
Merci de me répondre.
1)Entre le moment où Private Sub ListBox1_Click() est appelée et le moment où Private Sub CommandButton8_Click() est appelée, la variable Facturant change de valeur?
Non, j'utilise des Commandbutton pour aller sur d'autres pages de mon Userform/Multipage mais la valeur Facturant ne peut et ne doit être modifiée (ou se modifier toute seule comme dans mon cas :D)

2)Comme tu me le conseille si justement, j'ai mis un "espion" sur Facturant et j'ai suivi la routine pas à pas (Débogage/Pas à pas détaillé) mais je ne voyais rien se modifier dans la fenêtre espion.
D'où mon désarroi et mon appel à l'aide.

Encore un grand merci pour le temps que tu as bien voulu me consacrer.
Si tu as d'autres idées/conseils, je suis preneur. ;)
 
G

Guest

Guest
Re : VBA : Modification non désirée d'une valeur de variable

Re,

Voici un code qui te permettra de voir à quel moment Facturant est changé.
A mettre dans un module (supprimer l'ancienne déclaration de Facturant)

Code:
Option Explicit
Private mFacturant As String
Public Property Let Facturant(ByVal Valeur As String)
    MsgBox "Ancienne valeur: " & mFacturant & vbCrLf & "Nouvelle valeur: " & Valeur, vbInformation, "Changement de facturant"
    mFacturant = Valeur
End Property
Public Property Get Facturant() As String
    Facturant = mFacturant
End Property

A+
 

mprexcel

XLDnaute Junior
Re : VBA : Modification non désirée d'une valeur de variable

Un tout grand merci Hasco.
J'essaie tout de suite et je t'avoue que je suis impatient de voir l'origine du problème.
(J'ai beau lire et relire mon code mais je ne vois rien mais vu mon niveau en VBA, c'est pas difficile de ne rien voir :D.)
J'espère pouvoir découvrir mon erreur (car j'ai certainement fait une erreur qlq part...)
Je te tiens au courant.
 

mprexcel

XLDnaute Junior
Re : VBA : Modification non désirée d'une valeur de variable

Hasco,
Bien pratique tes lignes de codes, je ne connaissais pas mais j'essaierai de comprendre et de pouvoir les utiliser.

Bon, j'ai fait une première batterie de test et je suis encore plus dubitatif.
Premier essai : ça coince. Je réalise d'autres essais pour voir si l'erreur se répète et puis .... rien, ça marche :confused:. Je persiste et ça recoince, je parviens (?) enfin à recréer le changement inopiné de la variable Facturant.
Ma variable passe de Dupont par exemple à rien après avoir compléter un textbox dont voici le code.

Code:
Private Sub TextBox10_AfterUpdate()
' *** Montant Invoice en EURO ***
If IsNumeric(Userform4.TextBox10.Text) = True Then
sanstva€ = CDbl(Userform4.TextBox10.Value)
End If
calcul€
Userform4.TextBox10.Value = Format(sanstva€, " € #,##0.00")
Userform4.TextBox22.Value = Format(tva€, " € #,##0.00")

Userform4.TextBox19.Value = Format(avectva€, " € #,##0.00")
End Sub

Je joins également la routine calcul€

Code:
Public Sub calcul€()
' calcul pour le montant de la tva et avec tva
' *************  en EURO *********************
If UserForm3.CheckBox2.Value = True Or Userform4.CheckBox2.Value = True Or UserForm5.CheckBox2.Value = True Then
flagtva€ = 1
Else: flagtva€ = 0
End If
tva€ = sanstva€ * pourcentage€ * flagtva€
avectva€ = sanstva€ + tva€

End Sub

Il faut savoir que si j'utilise l'USF4, les USF 3 & 5 sont inactifs. Donc, je me dis que mon petit test n'est pas bien méchant, j'essaie juste de trouver si j'ai bien des Euros.

Aurais-tu des idées car je ne comprends rien à ce qui se passe.
Encore merci pour ton aide.
 
G

Guest

Guest
Re : VBA : Modification non désirée d'une valeur de variable

Re,

Je ferai alors un point d'arrêt sur Private Sub TextBox10_AfterUpdate() puis ferai un pas à pas jusqu'à la fin.
Peut-être dans userform4 as-tu un code qui change ta variable lorsque tu modifie un (ou des) de ces textbox.

Quant à ce que j'ai te donné, cela s'appelle une 'Propriété' généralement utilisée dans des modules objets ( ou module de classe) mais qui peut très bien être utilisé dans un module général.

A+
 

mprexcel

XLDnaute Junior
Re : VBA : Modification non désirée d'une valeur de variable

Hasco,
Je crois que j'ai une piste.
Je suis dans l'USF 4, les USF 3 & 5 sont éteint.
En étant dans l'USF4, j'appelle la routine calcul€.
Je passe par mon test (que je ne croyais pas méchant) à savoir :
If UserForm3.CheckBox1.Value = True Or Userform4.CheckBox1.Value = True Or UserForm5.CheckBox1.Value = True Then

et là, je me rends compte que VBA passe par le code qui initialise USF3!

A ton avis, cela est-il possible?
 
G

Guest

Guest
Re : VBA : Modification non désirée d'une valeur de variable

Re,

Ben oui, c'est normal puisque faire référence à un objet ou controle d'un userform déchargé, le charge en mémoire sans l'afficher.

Si tu veux que USF3 et USF5 conserve leur valeur pour une utilisation sur USF4 alors il faut les fermé (cacher) par Me.Hide. (Mais n'oublie pas de les fermer (décharger) ultérieurement) par la méthode Unload.

.Hide les cache sans libérer la mémoire, ils continuent à exister dans la collection des userform.

UnLoad Me les ferme et libère la mémoire, ils ne font plus partie de la collection des UserForm.

A+
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 645
Messages
2 111 536
Membres
111 183
dernier inscrit
angelique76120