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 :

portée de la classe vba [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Novembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2021
    Messages : 9
    Par défaut portée de la classe vba
    Bonjour, de nouveau.
    j'avance bien sur la collection qui répondait à ma demande précédente.
    Pour valider le scénario de mon projet, j'ai fait un petit bout de code (je ne vise pas l'académie des sciences avec ça) avec un classe qui comprend juste 2 méthodes et une userform avec 2 boutons censés utiliser chacun une seules des deux méthodes.
    le bouton lire fonctionne (normal, j'instancie dedans)
    Pb le deuxième bouton ne fonctionne pas, ce que je vois bien dans les fenêtres execution et variables locales.
    d'où ma question comment conserver et utiliser les variables d'une classe. autrement dit quel moyen pour que la portée des variables d'une classe soit au delà de la procédure qui la crée.
    Il y a plein d'exemples très jolis mais avec une seule procédure qui travaille avec la classe.
    petit détail : nomComplet c'est juste nom & prenom pour vérifier que j'ai bien compris property
    dans la userform :
    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
    Public Sub BtnLire_Click()
    'creation d'un classe nom
    Dim NouvNom As cNom
    Set NouvNom = New cNom
    NouvNom.Nom = Usfcli.TxtNom
    NouvNom.prenom = Usfcli.TxtPrenom
    NouvNom.lire
    End Sub
     
    Public Sub BtnEcrire_Click()
     
    ' ça marche mais c'est une nouvelle instance
    'Set NouvNom = New cNom
    'If NouvNom Is Nothing Then
    '   MsgBox "Variable non initialisée."
    'Else
    '   MsgBox "Variable initialisée."
    'End If
    'NouvNom.ecrire
     
    NouvNom.ecrire 'ça marche pas:
    'il ne retourve pas la classe : message "objet requis"
    End Sub
    et dans la usform :
    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
    Property Get Nomcomplet() As String
    Nomcomplet = mPrenom & " " & mNom
    End Property
     
    '### méthodes ###
    Public Sub lire()
    Sheets(1).Range("A1").Value = Nomcomplet
    MsgBox "ça marche"
    End Sub
     
    Public Sub ecrire()
    Sheets(1).Range("A2").Value = Nomcomplet
    End Sub
     
    Private Sub Class_Initialize()
    MsgBox "classe initialisée"
    End Sub
    la usform elle meme :
    Nom : usform.png
Affichages : 150
Taille : 6,4 Ko

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Bonjour,

    ton erreur n'est pas spécifique ici au module de classe.

    Tu peux retrouver un chapitre dédié à ce sujet dans ce tuto
    https://silkyroad.developpez.com/VBA/LesVariables/#LV

    Ton découpage déclaration/affectation devrait plutôt être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'creation d'un classe nom
    Dim NouvNom As cNom
    Public Sub BtnLire_Click()
    Set NouvNom = New cNom
    NouvNom.Nom = Usfcli.TxtNom
    NouvNom.prenom = Usfcli.TxtPrenom
    NouvNom.lire
    End Sub
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Novembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2021
    Messages : 9
    Par défaut
    merci de cette réponse super rapide.
    tu me réponds sur le bouton "lire" de la userform qui déclenche la méthode "lire".
    mais cela fonctionne, même si je vais tenir compte de ton découpage; je viens de le découper en ce sens sans amélioration
    Mon problème est sur le bouton "écrire" qui déclenche la méthode "ecrire". celle-ci est censée reprendre la classe "NouvNom" et utiliser ses variables créées dans la procédure lire.
    j'ai un message erreur 424 objet requis et je vois bien qu'il ne trouve pas cette classe.
    Ma question est donc est il possible d'utiliser une classe dans plusieurs procédures?
    je remets mon code avec les méthodes et les procédure appelantes

    Le code dans la userForm
    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
     
    Public Sub BtnLire_Click()
    Set NouvNom = New cNom
    NouvNom.Nom = Usfcli.TxtNom
    NouvNom.prenom = Usfcli.TxtPrenom
    NouvNom.lire
    End Sub
     
    Public Sub BtnEcrire_Click()
    NouvNom.ecrire 'ça ne marche pas:
    'il ne retrouve pas la classe NouvNom et envoie message "objet requis"
    End Sub
    Private Sub UserForm_Initialize()
    'creation d'un classe cNom
    Dim NouvNom As cNom
    End Sub

    et celui dans la classe (je vous épargne les properties)

    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
     
    Property Get Nomcomplet() As String
    Nomcomplet = mPrenom & " " & mNom
    End Property
     
    '### méthodes ###
    Public Sub lire()
    Sheets(1).Range("A1").Value = Nomcomplet
    MsgBox "ça marche"
    End Sub
     
     
    extrait de la classe cNom que j'instancie dans la procédure en "NouvNom"
    Public Sub ecrire()
    Sheets(1).Range("A2").Value = Nomcomplet
    End Sub

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,
    Tu n'as pas fait ce que je t'ai indiqué,
    le
    ne doit pas se situer dans une fonction ou procédure mais directement dans le module de ton userform...
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Novembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2021
    Messages : 9
    Par défaut
    désolé, je pensais l'avoir fait : j'avais déplacé le " dim" dans la partir usf_initialize.
    OK, je corrige.
    P... ça marche
    Suis-je bête.
    Merci beaucoup.
    Je peux partir sur mon projet complet avec les collections, le stock, les commandes etc...
    des difficultés en vue mais challenge..

  6. #6
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Novembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2021
    Messages : 9
    Par défaut fin de réponse
    je vais déclarer la discussion terminée mais je voulais conclure sur les variables :

    J'avais bien lu le tuto "utiliser les variables en vba excel" avant de poser la question sur le forum mais je n'avais absolument pas percuté sur :
    "Pour que la variable soit utilisable dans toutes macros du module, celle-ci doit être déclarée en tête du module, avant le premier Sub."

    pourtant, après coup cette phrase est très claire et répondait parfaitement à la question que je posais....
    Comme quoi, quand on débute l'esprit n'est pas en éveil.

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

Discussions similaires

  1. [PHP 5.3] Portée variable de classe
    Par ETVigan dans le forum Langage
    Réponses: 6
    Dernier message: 16/05/2010, 10h21
  2. Problème de portée entre deux classes
    Par Shikette dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 13/11/2009, 22h32
  3. piloter port parallele avec excel vba
    Par elephanto dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/03/2009, 15h46
  4. [PHP 5.3] Portée de variable: class > include > fonction
    Par Yanonix dans le forum Langage
    Réponses: 8
    Dernier message: 06/02/2009, 23h43
  5. [DEV] RealBasic : (Débutant) portée d'une classe
    Par Cazaux-Moutou-Philippe dans le forum Développement OS X
    Réponses: 0
    Dernier message: 25/11/2007, 12h08

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