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 :

Déclaration Variable dans Userform et ThisWorkbook


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Par défaut Déclaration Variable dans Userform et ThisWorkbook
    Bonjour,

    Dans l'application que je réalise actuellement, je lance le fichier

    J'utilise ThisWorkBook pour tester la présence de mes fichiers et ensuite il lance un userform

    A quel niveau dois je mettre mes variables pour quelles soient utilisées dans le projet ?

    Merci pour votre retour

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Il faut déclarer les variables en Public, puis les appeler ensuite par:
    ThisWorkbook.MaVariable (ou VBAProject.ThisWorkbook.MaVariable), à travers tout le projet.

    Ici, ThisWorkbook est un CodeName (modifiable). Ce n'est pas le nom de la variable public ThisWorkbook qui elle est fixe et défini en tant que Excel.ThisWorkbook ou Excel.Global.ThisWorkbook ou Excel.Application.ThisWorkbook.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Par défaut
    Ok,
    J'ai déplacé mes variable dans ThisWorkbook
    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
    Public NomClasseurApplication As String
    Public ArtExiste As Integer
    Public I As Single
    Public MyArray(30, 5)
    Public MyArrayEquiv(20, 7)
    Public MyArrayRefFab(30, 5)
    Public MyArrayRCS(100, 6)
    Public MyArrayParam(70, 5)
    Public MyArrayDAsansCde(10, 6)
    Public MyArrayCdeNonLivree(10, 6)
    Public MyArrayStockD(1000, 4)
    Public MyArrayStockM(1000, 4)
    Public StockMGlobal As Integer
    Public StockDGlobal As Integer
    Public MyArrayRecherche()
    Public ControlRech As Integer
     
    Private Sub Workbook_Open()
    '
    '
    NomClasseurApplication = ActiveWorkbook.Name
    '
    Call TestExistenceRepertoire
     
    Call OuvrirFichier
    '
    Principal.Show False
    '
    End Sub
    dans un bouton dans userform, j'utilise une de ces variables comme tu as indiqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Windows("Revue Referentiel.xls").Activate
    Sheets("Nomenclature Equipement").Select
    Nligne = Cells(1, 1).CurrentRegion.Rows.Count
    Z = 0
    Erase ThisWorkbook.MyArray
    j'obtiens une erreur
    "Erreur de compilation : des constantes, chaines de longueur fixe, tableaux, types définis par l'utilisateur et instructions Declare ne sont pas autorisé&s comme menbres public de modules d'objet"

    une idée ?

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 158
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu as déjà posé une question similaire concernant la portabilité des variables et je t'ai conseillé dans cette réponse la lecture d'un tuto ce que manifestement tu n'as pas fait.

    @Nouveau2
    Il faut déclarer les variables en Public, puis les appeler ensuite par:
    ThisWorkbook.MaVariable (ou VBAProject.ThisWorkbook.MaVariable), à travers tout le projet.
    Où as-tu lu cela.
    Cela fonctionne effectivement et bizarrement avec cette syntaxe ThisWorkBook.Variable mais ce n'est pas très rationnel

    Une variable publique doit être impérativement déclarée dans un module standard.

    Tu t'imagines
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub UserForm_Initialize()
     ThisWorkbook.maVariable = "monTest"
     Me.TextBox1 = ThisWorkbook.maVariable
    End Sub
    Alors que déclarée publique dans un module standard, on utilise la variable directement par son nom.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 166
    Par défaut
    c'est évident que j'ai suivi ton conseil

    Mais je n'ai pas compris comment je pouvais le traduire dans mon programme

    De même, je n'ai pas compris ce que tu viens de me dire

    Peux tu expliciter ?

    ce qui me perturbe c'est userform qui n'utilise pas les module

    Donc en lançant un thisworkbook, qui lance un userform et à l'interieur de cet userform je clique sur un bouton commandebutton qui appelle un programme dans des modules

    je n'ai ou les variables visibles de l'ensemble, même des private sub

    merci d'avance

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ah, je n'avais pas suivi la discussion. Je croyais qu'il été question du ThisWorkbook comme étant un choix déjà fait.

    Il vaut mieux continuer la discussion sur l'autre discussion dans ce cas, c'est mieux, le contexte étant déjà posé.

  7. #7
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Cela fonctionne effectivement et bizarrement avec cette syntaxe ThisWorkBook.Variable mais ce n'est pas très rationnel
    J'ai comme l'impression que c'est une sorte de "propriété cachée" de VBA; comme si cela avait été mis là (comme, disons, DateDiFF(), pour Lotus) pour des fins de compatibilité avec VB.net, ou comme si c'était un code adapté d'une base commune VB chez Microsoft.

    Parce que c'est très similaire à la syntaxe VB.net pour récupérer une valeur d'une variable publique (ou invoquer une méthode publique) d'une classe à partir d'une autre classe.

    Mais, tu as amplement raison de te questionner sur cette utilisation en VBA. À ce que je sache, ce n'est pas documenté.

  8. #8
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Il est dit partout qu’en VBA , une variable publique doit être déclarée dans un module standard, non sans raison.

    Les modules de feuille et de classeur sont déclarés dans le dossier « Micosoft Excel Objets » qui est différent du dossier Modules et sont générés automatiquement par Excel en sous-jacent.

    Il y a une raison à ça ; ce sont des pseudos modules de classe et à ce titre ils se comportent comme des modules de classe pour le code que l’on y insère. Une variable « publique » dans un module de classe n’a rien à voir avec une variable publique au sens de celles déclarées dans un module standard et, en fait, reviens à déclarer une propriété pour l’objet du module objet en question… d’où le fait de pouvoir employer « la chose » sous la forme « ThisWorkBook.Variable », la notation VBA étant une notation par point, vous utilisez une propriété du dit objet comme vous le faites couramment avec les objets standards du modèle objet d’Excel.

    Donc rien de bizarre, mais du code borderline et dangereux si non maîtrisé

    cordialement,

    Didier

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Par défaut Comportement variable Global
    Bonjour,

    J'ai un souci qui se rapproche du thème de cette dicsussion,mais avec une variable Global (de plus assez peu documentée sur Internet...):

    J'ai une variable de type Global déclarée dans un module standard, avant le début des procédures Sub: donc normalement utilisable par tous les modules et USF.
    3 procédures similaires affectent une valeur différente à cette variable,en tout début d'execution, qui doit être récupérée par un USF unique, qui est appelé après que l'affectation de ma variable Global ait été modifiée.

    Dans l'USF l'appel à la variable Global se fait par une procédure Private_Sub initialize qui est lancée par l'instruction .show de ma procédure. Le but étant que mon USF affiche dans un champ le texte de la variable Global, dont ma procédure vient de modifier la valeur.

    Or le comportement constaté n'est pas celui attendu, et plûtot curieux, car il se rapproche d'un variable Static:
    -l'usf prend comme valeur de ma variable Global celle qui a été donné par la dernière procédure exécutée, mais pas celle qui est en cours (il ne met pas à jour la valeur de la variable).
    -quand j'execute ma procédure à 2 reprises, ma var. Global prend la valeur attendue dans l'USF, correctement, mais à cette deuxième exécution seulement
    -encore plus curieux : quand je lance ma procédure en mode Pas à Pas: ma variable globlale est correctement affectée, et ensuite correctement reconnue par l'USF, et cette fois-ci dés la première execution de la procédure!

    Pour précision après l'affichage de l'USF, il y a dans ma procédure une instruction d'attente "Do Events" (mais après l'affichage de l'USF, donc à priori sans rapport de causalité).


    Par ailleurs j'utilise une variable Global mais dans l'autre sens : affectée par un USF pour être reconnu par une procédure Sub : là aucun soucis...

    Qu'en pensez vous?

    Benoit

  10. #10

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

Discussions similaires

  1. déclaration de variable dans userform!
    Par lizzie59 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/04/2013, 16h49
  2. Recuperé une variable dans userform
    Par backdraf dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/11/2009, 11h08
  3. déclaration variable dans un module
    Par jemigo dans le forum Langage
    Réponses: 5
    Dernier message: 09/10/2008, 10h16
  4. Déclaration variable dans un intervalle
    Par abdelilah dans le forum C
    Réponses: 13
    Dernier message: 24/11/2007, 11h46
  5. Problème déclaration variable dans "if"
    Par doremib dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 17/07/2007, 12h42

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