IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

Problème d'enregistrement de variable globale


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Homme Profil pro
    je code mais on peut faire mieux...
    Inscrit en
    Avril 2024
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : je code mais on peut faire mieux...

    Informations forums :
    Inscription : Avril 2024
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Problème d'enregistrement de variable globale
    Bonjour à vous,

    avec un formulaire développé sous VBA, je souhaite que l'utilisateur puisse enregistrer la valeur de la zone de saisie "Num" dans une variable globale du document appelée "Mesures_enregistrees". Si une valeur est déjà enregistrée dans cette variable, je souhaite que la valeur saisie soit concaténée, séparée par une virgule.
    Le formulaire me sert ensuite à récupérer les données d'une base Access liée.

    Malgré tout j'ai des soucis car, parfois, la variable globale n'existe plus et j'ai une erreur 5825. J'ai du mal à vérifier si elle existe ou non, du coup je suis passé par une macro de réinitialisation qui recréé la variable et lui donne la valeur "Aucune". je ne suis pas très fier de ça, mais étant un peu novice, c'est une solution d'évitement qui me convenait. Malgré tout, j'ai l'impression que mon code ne fonctionne pas non plus actuellement car je n'arrive pas à concaténer de valeurs.

    Voici le code lié au formulaire de saisie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    Dim Num_mesure As String ' Variable globale
    Dim Nom_Mesure As String ' Variable globale
    Dim Code_CEREMA As String ' Variable globale
    Dim Titre_CEREMA As String ' Variable globale
    Dim Objectif As String ' Variable globale
    Dim Commu_bio As String ' Variable globale
    Dim Localisation As String ' Variable globale
    Dim Acteurs As String ' Variable globale
    Dim Description As String ' Variable globale
    Dim Illustration As String ' Variable globale
    Dim Calendrier As String ' Variable globale
    Dim Specificite As String ' Variable globale
    Dim Cout As String ' Variable globale
    Dim Demarches As String ' Variable globale
    Dim Phase As String ' Variable globale
    Dim Suivis As String ' Variable globale
    Dim Indicateurs_oeuvre As String ' Variable globale
    Dim Indicateurs_reussite As String ' Variable globale
    Dim Mesures_associees As String ' Variable globale
    Dim Numero As String ' Variable globale
     
    Private Sub Ref_Change()
     
    Dim cheminBd As String: Dim requete As String
    Dim enr As Recordset: Dim base As Database
     
     
    cheminBd = ".\Fiches_mesures.accdb"
    Set base = DBEngine.OpenDatabase(cheminBd)
    Set enr = base.OpenRecordset("SELECT * FROM Mesures WHERE Nom_Mesure='" & Ref.Value & "'", dbOpenDynaset)
     
    enr.MoveFirst
    'On récupère les données de la BDD Access et on les bascule en variables globales
     
    Nom_Mesure = Ref.Value
    Code_CEREMA = enr.Fields("Code_CEREMA").Value
    Titre_CEREMA = enr.Fields("Titre_CEREMA").Value
    Objectif = enr.Fields("Objectif").Value
    Commu_bio = enr.Fields("Commu_bio").Value
    Localisation = enr.Fields("Localisation").Value
    Acteurs = enr.Fields("Acteurs").Value
    Description = enr.Fields("Description").Value
    Illustration = enr.Fields("Illustration").Value
    Calendrier = enr.Fields("Calendrier").Value
    Specificite = enr.Fields("Specificite").Value
    Cout = enr.Fields("Cout").Value
    Demarches = enr.Fields("Demarches").Value
    Phase = enr.Fields("Phase").Value
    Suivis = enr.Fields("Suivis").Value
    Indicateurs_oeuvre = enr.Fields("Indicateurs_oeuvre").Value
    Indicateurs_reussite = enr.Fields("Indicateurs_reussite").Value
    Mesures_associees = enr.Fields("Mesures_associees").Value
    Obj.Value = enr.Fields("Objectif").Value
    Numero = Num.Value
     
     
    'Enregitrer la valeur en variable globale du document
    If ThisDocument.Variables("Mesures_enregistrees").Value = "" Then
    ActiveDocument.Variables.Add Name:="Mesures_enregistrees", Value:="Aucune"
    End If
     
     
    Dim valeursStockees As String
     
        ' Vérifier si la variable existe dans le document
        If ThisDocument.Variables("Mesures_enregistrees").Value = "Aucune" Then
        ' Si aucune donnée n'est stockée, initialiser la variable à une chaîne vide
            valeursStockees = ""
     
        Else
            ' Si des données sont déjà stockées, récupérer les valeurs existantes
            valeursStockees = ThisDocument.Variables("Mesures_enregistrees").Value
     
        End If
     
        ' Concaténer la nouvelle valeur avec les valeurs déjà stockées
        valeursStockees = valeursStockees & IIf(valeursStockees <> "", ",", "") & Numero
     
     
        ' Stocker la nouvelle valeur concaténée dans le document
        ThisDocument.Variables("Mesures_enregistrees").Value = valeursStockees
     
     
     
    enr.Close
    base.Close
    Set enr = Nothing
    Set base = Nothing
     
     
    End Sub
     
    Private Sub UserForm_Activate()
    Dim cheminBd As String: Dim requete As String
    Dim enr As Recordset: Dim base As Database
     
     
    cheminBd = ".\Fiches_mesures.accdb"
    Set base = DBEngine.OpenDatabase(cheminBd)
    Set enr = base.OpenRecordset("SELECT * FROM Mesures ORDER BY Num_mesure", dbOpenDynaset)
     
    enr.MoveFirst
    Do
       Ref.AddItem enr.Fields("Nom_Mesure").Value
       enr.MoveNext
    Loop Until enr.EOF
     
    enr.Close
    base.Close
    Set enr = Nothing
    Set base = Nothing
    End Sub
     
    Private Sub Ajouter_Click()
     
      ' Vérifier si la zone de texte est vide
        If Trim(Me.Num.Value) = "" Then
            ' Afficher un message d'erreur
            MsgBox "Veuillez saisir un numéro pour cette mesure.", vbExclamation, "Erreur de saisie"
            ' Annuler la sortie de la zone de texte
            Cancel = True
       Exit Sub ' Quitter la procédure pour éviter l'exécution du reste du code
    Else
        Numero = Me.Num.Value ' Attribuer la valeur de la zone de texte à la variable Numero
     
        Dim tbl As Table
        Dim cell As cell
     
     
        ' Créer le tableau à partir de la sélection actuelle
        Set tbl = ActiveDocument.Tables.Add(Selection.Range, NumRows:=17, NumColumns:=2)
     
        ' Définir le titre du tableau
        tbl.Title = Numero
     
        ' Définir des bordures simples pour tout le tableau
        With tbl.Borders
            .InsideLineStyle = wdLineStyleSingle
            .OutsideLineStyle = wdLineStyleSingle
        End With
     
        ' Définir les largeurs de colonnes
        tbl.Columns(1).PreferredWidth = CentimetersToPoints(2.48)
        tbl.Columns(2).PreferredWidth = CentimetersToPoints(13.51)
     
        ' Insérer les données du tableau
        tbl.cell(1, 1).Range.Text = Numero
        tbl.cell(1, 2).Range.Text = Nom_Mesure
        tbl.cell(2, 1).Range.Text = Code_CEREMA
        tbl.cell(2, 2).Range.Text = Titre_CEREMA
        tbl.cell(3, 1).Range.Text = "Objectif(s)"
        tbl.cell(3, 2).Range.Text = Objectif
        tbl.cell(4, 1).Range.Text = "Communautés biologiques visées"
        tbl.cell(4, 2).Range.Text = Commu_bio
        tbl.cell(5, 1).Range.Text = "Localisation"
        tbl.cell(5, 2).Range.Text = Localisation
        tbl.cell(6, 1).Range.Text = "Acteurs"
        tbl.cell(6, 2).Range.Text = Acteurs
        tbl.cell(7, 1).Range.Text = "Description opérationnelle / Modalités de mise en oeuvre"
        tbl.cell(7, 2).Range.Text = Description
        tbl.cell(8, 1).Range.Text = "Exemples d'illustration"
        tbl.cell(8, 2).Range.Text = Illustration
        tbl.cell(9, 1).Range.Text = "Calendrier de mise en oeuvre"
        tbl.cell(9, 2).Range.Text = Calendrier
        tbl.cell(10, 1).Range.Text = "Spécificités sur le projet"
        tbl.cell(10, 2).Range.Text = Specifite
        tbl.cell(11, 1).Range.Text = "Coût indicatif"
        tbl.cell(11, 2).Range.Text = Cout
        tbl.cell(12, 1).Range.Text = "Démarches administratives éventuelles"
        tbl.cell(12, 2).Range.Text = Demarches
        tbl.cell(13, 1).Range.Text = "Phase du projet"
        tbl.cell(13, 2).Range.Text = Phase
        tbl.cell(14, 1).Range.Text = "Suivis de la mesure"
        tbl.cell(14, 2).Range.Text = Suivis
        tbl.cell(15, 1).Range.Text = "Indicateurs de mise en oeuvre"
        tbl.cell(15, 2).Range.Text = Indicateurs_oeuvre
        tbl.cell(16, 1).Range.Text = "Indicateurs de réussite"
        tbl.cell(16, 2).Range.Text = Indicateurs_reussite
        tbl.cell(17, 1).Range.Text = "Mesures associées"
        tbl.cell(17, 2).Range.Text = Mesures_associees
     
          ' Appliquer le style de paragraphe centré pour la première ligne de la colonne de droite
        tbl.cell(1, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
     
        ' Appliquer le style de paragraphe justifié pour les lignes suivantes de la colonne de droite
        For i = 2 To tbl.Rows.Count
            tbl.cell(i, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphJustify
        Next i
     
      ' Rechercher et mettre en gras le texte entre les balises <b> et <\b> dans toutes les cellules
        Dim rng As Range
        Dim startPos As Long
        Dim endPos As Long
     
        ' Rechercher et mettre en gras le texte entre les balises <b> et <\b> dans toutes les cellules
        For Each cell In tbl.Range.Cells
            For Each para In cell.Range.Paragraphs
                Set rng = para.Range
                Do While rng.Find.Execute(FindText:="<b>", Forward:=True)
                    startPos = rng.End
                    rng.Collapse wdCollapseEnd
                    If rng.Find.Execute(FindText:="<\b>", Forward:=True) Then
                        endPos = rng.Start
                        rng.SetRange Start:=startPos, End:=endPos
                        rng.Bold = True
                    End If
                Loop
            Next para
        Next cell
     
        ' Rechercher et supprimer les balises <b> et <\b> dans le tableau
        tbl.Range.Find.Execute FindText:="<b>", ReplaceWith:="", Replace:=wdReplaceAll
        tbl.Range.Find.Execute FindText:="<\b>", ReplaceWith:="", Replace:=wdReplaceAll
     
     
     
        ' Fermer le formulaire
        Unload Inser_mesure
        End If
     
     
    End Sub
    Est-ce que quelqu'un comprend mon souci et pourrait m'aider ?

    Merci beaucoup d'avance

  2. #2
    Membre à l'essai
    Homme Profil pro
    je code mais on peut faire mieux...
    Inscrit en
    Avril 2024
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : je code mais on peut faire mieux...

    Informations forums :
    Inscription : Avril 2024
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    pour info, j'ai aussi un souci car je ne peux pas désélectionner dans la listBox

  3. #3
    Membre éprouvé Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 646
    Points : 1 021
    Points
    1 021
    Par défaut
    Hello,

    1ère chose, je pense que vous confondez variable globale et variable de document, l'une est volatile dans le VBA l'autre est fixe dans le document
    2ème : dans le code vous faite référence une fois à thisdocument et une autre à activedocument, ça n'est pas forcément la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If ThisDocument.Variables("Mesures_enregistrees").Value = "" Then
    ActiveDocument.Variables.Add Name:="Mesures_enregistrees", Value:="Aucune"
    Si une variable document n'existe pas vous aurez effectivement une erreur et si vous essayez de l'ajouter alors qu'elle existe vous aurez aussi une erreur
    Pour vérifier si une variable document existe inspirez vous de ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each aVar In ActiveDocument.Variables 
     If aVar.Name = "Blue" Then num = aVar.Index 
    Next aVar 
    If num = 0 Then 
     ActiveDocument.Variables.Add Name:="Blue", Value:=6 
    Else 
     ActiveDocument.Variables(num).Value = 6 
    End If
    issu de https://learn.microsoft.com/fr-fr/of.../word.variable

  4. #4
    Membre à l'essai
    Homme Profil pro
    je code mais on peut faire mieux...
    Inscrit en
    Avril 2024
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : je code mais on peut faire mieux...

    Informations forums :
    Inscription : Avril 2024
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup pour cette réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD14] TRANSFORMER DES ENREGISTREMENTS EN VARIABLES GLOBALES
    Par NCGUI dans le forum WinDev
    Réponses: 2
    Dernier message: 04/07/2015, 13h04
  2. mysqli_connect() ne peut s'enregistrer dans une variable globale
    Par xounet dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 14/04/2014, 19h09
  3. [VB6] [Fichier] Enregistrer des variables de structure
    Par de.bo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/10/2002, 12h09
  4. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo