Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

Hasco, tu es mon phare dans la tempête .
Merci une fois de plus pour le temps que tu veux bien me consacrer et désolé de te déranger avec mes bêtises.
Je ne veux que un et uniquement un USF à la fois. Je ne renvoie rien entre USF 3, 4 & 5 (enfin, vu mon niveau, je crois pas en tout cas ).
Je quitte toujours mes USF par UNLOAD.

Donc USF3 ne devrait plus exister, me trompe-je?
En conclusion, je dois être moins fainéant et je dois trouver une autre "astuce" pour mon test soi-disant pas bien méchant.

Encore un énorme merci Hasco pour ton aide.
Je ne te dis pas qu'à l'occasion je te renverrai l'ascenseur (vu mon petit niveau, hein) mais si, un jour, tu es du coté de Bruxelles, fais mon signe, je te payerai un verre (un pour commencer bien sûr)
 
G

Guest

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

Re,

Non tu te trompes pas tant que tu ne fais pas référence à eux dans le codes.

Donc si tu veux qu'il soient déchargés et utiliser leur valeur (Checkbox, Textbox etc....) mets conserve ces valeurs dans des variables publiques comme tu l'as fait pour Facturant

donc quand tu est dans USF3 fini les
Code:
 Userform4.TextBox19.Value = Format(avectva€, " € #,##0.00")
et autre joyeusetés qui rapellent en mémoire les userform.

A remplacer par

Code:
MaVariable=Format(avectva€, " € #,##0.00")

Et au besoin dans UserForm4_Initialize
Code:
 TextBox19=MaVariable

Qui sera ainsi à jour.

A+
 

Gourou AWK

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

Il faut savoir que les formulaires sont des objets comme les autres ... enfin presque. Pour d'obscures raisons de compatibilité depuis VB3 on peut les utiliser sans les créer vraiment, le moteur VB(A) se chargeant de le créer à la première utilisatioN. Aussi, quand je dois utiliser des USF je les crée d'abord et je les utilise par show, Hide. Exemple:

VB:
 Option Explicit

Sub Test()

' Un objet qui gèrera le Userform1 qui contient un text box
Dim MyFRM As UserForm1

' Création du FRM - ce qui remplace le Load
Set MyFRM = New UserForm1

With MyFRM
    ' On met quelque chose dans le text box
    .TextBox1.Text = "Gourou AWK"
    ' On affiche le formulaire
    .Show
End With

' on affiche la valeur du text box (qui a peut être été modifié dans le frm
Debug.Print MyFRM.TextBox1.Text

' On plie tout proprement et on s'en va
Set MyFRM = Nothing

'   Et LA CA PLANTE (l'"objet" frm n'existe plus)
Debug.Print MyFRM.TextBox1.Text

End Sub

Ça évite ce qui t'es arrivé car tu "maîtrise" le cycle de vie de tes objets
 

mprexcel

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

Bonjour Gourou,
Merci pour ces précieuses précisions.
J'ai enfin "compris" pourquoi un "truc" qui n'est pas sensé exister .... existe pourtant.
J'ai déjà modifier mon code, et je teste actuellement tous les cas de figures ( j'en ai 3*4*4*4).
Jusqu'à présent, tout fonctionne de façon impeccable. Cela me permet de voir également certaines choses que l'on peut améliorer.
A+
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…