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

Macros et VBA Excel Discussion :

VBA - Compilation impossible - Variable non définie [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2020
    Messages : 2
    Par défaut VBA - Compilation impossible - Variable non définie
    Bonjour à tous,

    J'ai créé plusieurs formulaires sous Excel grâce à Visual Basic.
    Jusque là, je n'ai jamais rencontré de problème dans la mesure où je reprenais mon template initiale dont je suis sûre du bon fonctionnement.

    Cependant, aujourd'hui cela ne fonctionne pas. Mes projets précédent fonctionnent toujours correctement mais impossible de faire obéir celui-ci

    Le code refuse de compiler car il m'indique une "erreur de compilation : variable non définie".
    Ce que je ne comprends pas c'est que c'est la ligne "Private Sub CommandButton1_Click()" qui est surlignée en jaune par le débogage alors que je l'ai utilisé à l'identique sur mes autres projets.

    Merci de noter que je suis débutante en VBA, je ne m'en sers que depuis 10 jours. Il n'est pas impossible que mes autres projets aient fonctionné par magie !

    Si l'un d'entre vous peut éclairer ma lanterne, ça serait super.
    Je vous mets le code entier plus bas.

    Merci d'avance et bonne soirée !
    Waldy


    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
    Option Explicit
     
    Dim Ws As Worksheet
     
    'Pour le formulaire
     
    Private Sub UserForm_Initialize()
     
    'Pour la liste déroulante prénom
     
    ComboBox1.List() = Array("Alexandre", "Sophie", "Yves")
    End Sub
     
    'Pour le bouton Valider
     
    Private Sub CommandButton1_Click()
    Dim L As Integer
     
     If MsgBox("Confirmez-vous l'insertion de cette nouvelle entrée ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
         L = Sheets("Saisie").Range("a65536").End(xlUp).Row + 1  'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
     
     
        Range("A" & L).Value = ComboBox1
     
        If OptionButton1.Value = True Then
        Range("B" & L).Value = Fixe
        End If
        If OptionButton2.Value = True Then
        Range("B" & L).Value = Portable
        End If
        If OptionButton3.Value = True Then
        Range("B" & L).Value = Tablette
        End If
     
        If OptionButton4.Value = True Then
        Range("C" & L).Value = Windows_7
        End If
        If OptionButton5.Value = True Then
        Range("C" & L).Value = Windows_10
        End If
        If OptionButton6.Value = True Then
        Range("C" & L).Value = Je_ne_sais_pas
        End If
     
        If OptionButton6.Value = True Then
        Range("D" & L).Value = Oui
        End If
        If OptionButton7.Value = True Then
        Range("D" & L).Value = Non
        End If
     
         Range("E" & L).Value = TextBox1
         Range("F" & L).Value = TextBox2
         Range("G" & L).Value = Now
     
     End If
     
         ComboBox1 = ""
         TextBox1 = ""
         TextBox2 = ""
         OptionButton1 = ""
         OptionButton2 = ""
         OptionButton3 = ""
         OptionButton4 = ""
         OptionButton5 = ""
         OptionButton6 = ""
         OptionButton7 = ""
         OptionButton8 = ""
     
    End Sub
     
    'Pour le bouton Quitter
     
    Private Sub CommandButton2_Click()
     
       Unload Me
     
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par waldsteinia Voir le message

    Bonjour,

    Il faut mettre vos valeurs Fixe, etc,... entre "", sinon elles sont considérées comme des variables.

    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
     
    If OptionButton1.Value = True Then
        Range("B" & L).Value = "Fixe"
        End If
        If OptionButton2.Value = True Then
        Range("B" & L).Value = "Portable"
        End If
        If OptionButton3.Value = True Then
        Range("B" & L).Value = "Tablette"
        End If
     
        If OptionButton4.Value = True Then
        Range("C" & L).Value = "Windows_7"
        End If
        If OptionButton5.Value = True Then
        Range("C" & L).Value = "Windows_10"
        End If
        If OptionButton6.Value = True Then
        Range("C" & L).Value = "Je_ne_sais_pas"
        End If
     
        If OptionButton6.Value = True Then
        Range("D" & L).Value = "Oui"
        End If
        If OptionButton7.Value = True Then
        Range("D" & L).Value = "Non"
        End If

  3. #3
    Candidat au Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2020
    Messages : 2
    Par défaut
    Merci mille fois Eric !

    J'ignorer que les "" étaient nécessaires dans ce cas !!
    Merci beaucoup, pour votre réponse et la vitesse de réaction !
    Bonne soirée

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Petite rectification du code, simplement parce que ça me pique un peu les yeux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        If OptionButton1.Value Then Range("B" & L).Value = "Fixe"
        If OptionButton2.Value Then Range("B" & L).Value = "Portable"
        If OptionButton3.Value Then Range("B" & L).Value = "Tablette"
     
        If OptionButton4.Value Then Range("C" & L).Value = "Windows_7"
        If OptionButton5.Value Then Range("C" & L).Value = "Windows_10"
        If OptionButton6.Value Then Range("C" & L).Value = "Je_ne_sais_pas"
     
        If OptionButton6.Value Then Range("D" & L).Value = "Oui"
        If OptionButton7.Value Then Range("D" & L).Value = "Non"
    N'est-ce pas plus clair ainsi ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Puisque tu dis toi-même que tu débutes en VBA, je suppose que tu accepteras mes conseils...
    1. Ne jamais mettre de données métier dans ton code. Le jour ou les prénoms ou les choix changent, c'est la galère car tu vas devoir aller dans ton code pour modifier les données. Si tu les mets dans une feuille de données et que tu les appelles par code, tu pourras les modifier, en ajouter ou en retirer sans devoir modifier une seule ligne de code;
    2. Tu tagues XL365, donc tu n'es plus en XL2003 => le code range("a65536").End(xlUp).row+1, c'est clairement obsolète. On ne programme plus comme cela aujourd'hui, car les tableaux structurés (voir mon tuto) simplifient grandement la conception et les manipulations côté Excel, mais également côté VBA, grâce aux objets ListObject qui sont le pendant VBA des tableaux structurés, mais aussi grâce aux références structurées dont je parle dans mon tuto;
    3. En utilisant des OptionButtons, tu places du métier dans ton code. Si tu ajoutes un choix de matériel ou d'OS, tu vas devoir ajouter un optionbutton. C'est à mon avis un mauvais choix ergonomique.



    Perso, je créerais 4 tables de données:
    1. t_Personnes pour les prénoms;
    2. t_Matériel pour le matériel;
    3. t_Os pour les OS;
    4. t_Résultats pour enregistrer la saisie.



    Nom : 2020-02-05_212116.png
Affichages : 257
Taille : 30,1 Ko

    Ici, pour l'exemple, j'ai placé les tableaux sur la même feuille, mais idéalement, il faudrait les isoler chacun sur une feuille. Le truc chouette, c'est que tu peux les déplacer sans devoir modifier une seule ligne de code!

    Pour initialiser les combobox, tu utilises les références structurées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Initialize()
      cboPerson.List = Range("t_Personnes[Prénom]").Value
      cboMaterial.List = Range("t_Matériel[Matériel]").Value
      cboOs.List = Range("t_Os[Os]").Value
    End Sub
    Pour transférer la saisie sur une nouvelle ligne du tableau de résultat, tu utilises le listobject associé qui te permet d'ajouter une ligne (même si tu as une ligne de total dans la table de données!), puis tu joues avec les noms de colonnes de la table pour transférer tes données. De la sorte, si tu réorganises tes colonnes dans la table, tu ne dois rien modifier dans le code, là non plus. Et si tu ajoutes des colonnes, tu devras bien sûr modifier ton code pour ajouter les contrôles et les lignes de code qui transfèrent ces nouvelles données, mais le code existant restera fonctionnel. Voici la procédure qui réalise cela. Tu remarque qu'on ne parle nulle part de feuille, de colonne a, de ligne 65536 etc, on fait juste référence à la structure que l'on a conçue dans le classeur côté Excel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub addresults()
      Dim ResultRange As Range
      Dim Table As ListObject
     
      Set Table = Range("t_Résultats").ListObject
      Set ResultRange = Range("t_Résultats").ListObject.ListRows.Add().Range
      ResultRange(Table.ListColumns("Prénom").Index) = cboPerson.Value
      ResultRange(Table.ListColumns("Matériel").Index) = cboMaterial.Value
      ResultRange(Table.ListColumns("Os").Index).Value = cboOs.Value
      ResultRange(Table.ListColumns("Oui / Non").Index).Value = IIf(optYes, "Oui", "Non")
      ResultRange(Table.ListColumns("TextBox1").Index).Value = TextBox1.Value
      ResultRange(Table.ListColumns("TextBox2").Index).Value = TextBox2.Value
      ResultRange(Table.ListColumns("Date").Index).Value = Now
    End Sub
    Deux trois explications sur ce code:
    • Set Table = Range("t_Résultats").ListObject: initialise une variable pointant vers la table de données;
    • Set ResultRange = Range("t_Résultats").ListObject.ListRows.Add().Range: ajoute une ligne au tableau et affecte la plage de cette nouvelle ligne à la variable;
    • ResultRange(Table.ListColumns("Prénom").Index) = cboPerson.Value: retrouve la position de la colonne nommée prénom pour opérer le décalage de cellules voulu sur la plage de la nouvelle ligne. C'est ici que l'on remarque que si l'on permute les colonnes, le code n'est pas affecté car l'index de la colonne (sa position) est calculé au moment du transfert et n'est pas inscrit dans le code.



    Cette procédure d'ajout sera appelée par le clic sur le bouton (jamais d'actions dans les événements de contrôles)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub btnValidate_Click()
      addresults
      Unload Me
    End Sub
    Dans cette contribution, je donne une solution plus construite qui généralise l'approche et réduit encore les interventions sur le code.
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. [XL-2007] VBA concatener, erreurs variable non définie ou qualificateur incorrect
    Par pétrin dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/07/2015, 17h50
  2. [AC-2007] Erreur de compilation: Variable non définie
    Par m1koo dans le forum VBA Access
    Réponses: 7
    Dernier message: 11/01/2014, 18h21
  3. Excel VBA PB de variable non définie (=vide)
    Par elhelios dans le forum Excel
    Réponses: 1
    Dernier message: 27/02/2012, 10h48
  4. Erreur de compilation : Variable non définie
    Par Smallstone dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 12/07/2011, 08h32
  5. erreur compilation: variable non défini
    Par ngouagme dans le forum Langage
    Réponses: 8
    Dernier message: 07/07/2010, 15h38

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