Variables publiques se vident étrangement

Bonjour à tous,

Je créé actuellement un fichier permettant de retraiter des données selon des filtres afin d'alimenter ensuite des graphs

Là où j'ai un problème c'est dans la conservation des données de mes variables publiques.

J'ai 3 userform:

* Un pour définir les plages de date début/fin (2 variables)

* Un pour sélectionner des clients

* Un pour sélectionner les informations à afficher

Les variables publiques sont bien déclarées au début de mon unique module.

Là où ça coince c'est que les variables se vident sans raison apparente entre mes userform ce qui fait que je n'ai plus le contenu de mes variables pour la procédure centrale qui en a besoin.

Quelqu'un aurait-il une idée de la raison expliquant que des variables se vident sans qu'il y ait d'instruction "End"

Je peux vous communiquer le code en revanche je ne peux pas partager le fichier puisqu'il contient des informations confidentielles.

Merci pour votre temps et l'aide que vous pourrez m'apporter à résoudre ce mystère

Voici la fin de mon UserForm qui collecte les dates

Private Sub CommandButtonValider_Click()
    UFDate_Debut = CDate(LabelDate1.Caption)
    UFDate_Fin = CDate(LabelDate2.Caption) + 1
    MsgBox UFDate_Debut
    MsgBox UFDate_Fin
    Unload Me
End Sub

Le MsgBox m'affiche correctement les dates

Mes variables déclarées au début du module

Public UFDate_Debut As Date
Public UFDate_Fin As Date

Le début de ma procédure

Sub Synthese_Client()

    MsgBox UFDate_Debut
    MsgBox UFDate_Fin

Me renvoie 00:00:00 pour les 2

Je ne comprends pas pourquoi ces données disparaissent entre mon userform de dates et ma procédure

Bonjour,

l'unique module dont tu parles est bien un module standard et non le module du userform ?

eric

Bonjour,

Pour qu'une variable garde sa valeur durant tout le temps de l'ouverture du classeur, elle doit être soit déclarée dans un module standard soit déclarée dans le module du classeur ou d'une feuille mais dans ce dernier cas, elle doit impérativement être précédée du mot "Public" afin d'être visible de toutes parts et pour y faire référence ailleurs que dans le module où elle est déclarée, elle doit impérativement être précédée du nom du module où elle se trouve. Exemple :

Dans le module du classeur :

Public MaVariable As String

dans un autre module :

Sub Ecrire()

    ThisWorkbook.MaVariable = "Bonjour !"

End Sub

Sub Lire()

    MsgBox ThisWorkbook.MaVariable

End Sub

Si tu déclares tes variables en tête de module de l'UserForm, elles seront accessibles seulement durant la présence de l'UserForm mais sitôt ce dernier fermé, les variables sont vidées.

Pour lire ou écrire une variable d'un UserForm depuis un autre module, il te faut, comme expliqué plus haut, la faire précédée du nom du module où elle est déclarée donc :

Sub Ecrire()

    UserForm1.MaVariable = "Bonjour !"

End Sub

Sub Lire()

    MsgBox UserForm1.MaVariable

End Sub

et tout ça avec l'UserForm affiché en non modal

Salut Theze,

Merci beaucoup pour ces informations, j'y vois un plus clair.

Donc pour m'assurer de récupérer les informations de la variable créée depuis un UserForm il est préférable que je l'appelle en précisant le nom de l'userform avant, même si ma variable est déclarée "Public" dans mon module.

Est-ce que cela peut expliquer pourquoi parfois ça fonctionne et parfois ça ne fonctionne pas ?

Par exemple le même fichier aujourd'hui fonctionne parfaitement...

Pour ne pas à avoir à indiquer le module il faut les mettre public dans un module standard

eric

Theze,

De nouveau le problème se déclenche sur un autre userform sans raison apparente.

Le code de mon UserForm qui enregistre les infos dans la variable publique UFInfo

Private Sub CommandButtonValider_Click()
    Dim CheckBox As Control
    Dim i As Integer

    ' Boucle sur les controles et la rajoute à l'Array Public UFInfo
    i = 0
    For Each CheckBox In Me.Controls
        If CheckBox.Name Like "CheckBox*" Then
            If CheckBox.Value = True Then
                If i = 0 Then
                    Data.UFInfo = Array(CheckBox.Caption)
                Else
                    ReDim Preserve Data.UFInfo(UBound(Data.UFInfo) + 1)
                    Data.UFInfo(UBound(Data.UFInfo)) = CheckBox.Caption
                End If
                i = i + 1
            End If
        End If
    Next CheckBox

    ' Renvoie l'utilisateur sur le formulaire si aucune case n'a été cochée
    If IsEmpty(Data.UFInfo) Then
        MsgBox "Veuillez cocher au moins 1 élément"
    Else
        Unload Me
    End If

End Sub

Ma variable publique déclarée au début de mon module "Data"

Public UFInfo

Enfin ma procédure, dans mon module "Data"

Private Sub Synthese_Client()

    Application.ScreenUpdating = False

    If IsEmpty(Data.UFInfo) Then
        MsgBox "Vous devez définir les informations à afficher"
        Exit Sub
    End If
  

Et là il trouve UFInfo as Empty.

Je ne comprends vraiment pas, sachant que parfois, sans que je ne change rien, cela fonctionne

C'est un module standard, pas un module de classe

Ok. Ben attend Theze alors...

Une chose m'intrigue, quand on déclare un tableau Variant comme tu le fais :

Public UFInfo

et que je te vois le redimensionner avec Redim Preserve :

ReDim Preserve Data.UFInfo(UBound(Data.UFInfo) + 1)

je suis assez surpris que tu dises ceci :

Est-ce que cela peut expliquer pourquoi parfois ça fonctionne et parfois ça ne fonctionne pas ?

car normalement tu devrais avoir un plantage avec une erreur 13 "Incompatibilité de type" !

Je pense que tu n'as pas tout à fait bien compris mes explications ou alors, je me suis bien mal exprimé

Quand une variable est déclarée Public dans un module standard, comme le précise Eric , il n'est pas nécessaire de préciser le parent c'est à dire le nom du module dans lequel elle est déclarée ! SI ton module standard s'appelle Data, "Data.UFInfo" et "UFInfo" sont tout à fait similaire !

Pour pouvoir dimensionner ou redimensionner un tableau dans le code, il doit être déclaré avec les parenthèses :

Public UFInfo()

comme le précise Eric

Tu m'as vu ? Je croyais que j'avais ma cape d'invisibilité

Mais non Eric, je t'ai bien vu

Je te prie de bien vouloir m'excuser de ne pas t'avoir salué dans mon premier message (un peu fatigué du week-end )

Oh je ne disais pas ça pour toi.

On s'est suffisamment croisés ici pour se contenter d'un signe lointain de la main

Salut Theze, eriiic

Je n'avais pas mis le "Data." dans mon code initialiement, suite à ce que tu m'as dit hier j'ai testé et j'ai oublié de le retirer.

Tu t'étais très bien exprimé et j'avais bien compris, juste une tentative desespérée

Pour l'erreur "Incompatibilité de type" elle ne se produit pas car mon ReDim Preserve n'intervient qu'après avoir donné une première valeur sous forme de tableau à ma variable (si ma logique est bonne)

D'après ce que tu me dis il vaut mieux que je déclare ma variable directement comme ça alors ?

Public UFInfo()

J'ai testé quelque chose hier qui a l'air de corriger le problème.

N'étant pas très au clair sur les variables publiques et leur conservation j'ai fait ceci

Dans mon module:

Private Sub Selection_Info()
    UserFormInfo.Show
End Sub

Dans ma feuille contenant le bouton

Private Sub CommandButtonInfo_Click()
    Application.Run Macro:="Data.Selection_Info"
End Sub

Au lieu de tout simplement faire:

Private Sub CommandButtonInfo_Click()
    UserFormInfo.Show
End Sub

Parce que je pensais qu'il fallait passer par le module pour que la variable se conserve

Apparemment ça a corrigé le problème, mais comme ça se met parfois à fonctionner (et à déconner) sans que je comprenne pourquoi je ne suis pas sûr.

Vous pensez que ça peut être la cause du problème ?

Theze, eriiic, merci beaucoup pour votre aide

Je perdais un peu la boule sur ce problème

Bonjour à tous,

Depuis que j'ai fait ma dernière modification (cf message précédent) je n'ai plus jamais eu de problème

L'appel de procédure tarabiscoté que j'avais mis en place était vraisemblablement la cause de mes tracas

Je mets donc le sujet en résolu

Merci infiniment Theze et eriiic pour votre aide préciseuse

Rechercher des sujets similaires à "variables publiques vident etrangement"