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-E]Création de contrôle dynamique, propriété illisible


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut [VBA-E]Création de contrôle dynamique, propriété illisible
    Bonsoir,

    à partir d'une macro située dans un classeur, je crée une UserForm dans le projet VBA d'un autre classeur. J'écris aussi dans le module de code de cette UserForm la procédure Initialize qui crée dynamiquement des contrôles sur cette UserForm.

    Quand la procédure Initialize de la Userform s'exécute, les contrôles sont créés. A un moment donné, il sont au nombre de 6 exactement.

    A ce moment, i vaut 6 et j'essaie de récupérer la hauteur du contrôle numéro 6 comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h = Accueil.Controls.Item(i).Height   'h est un Single déclaré explicitement plus haut
    Le code plante à ce moment là avec l'erreur "Argument non valide".

    Quand j'ajoute un espion sur Accueil.Controls.Item(i).Height, le compilateur retourne le même message.

    Quand j'ajoute l'espion Accueil.Controls.Item(i) et que je vais voir la valeur de .Height manuellement, là elle s'affiche.

    Je ne comprends pas pourquoi. Quelqu'un aurait-il une idée?
    Merci.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Par défaut
    Et avec ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h = Accueil.Controls.Item(i-1).Height
    J'ai essaye avec 1 seul control et il plante comme chez toi, mais Item(0) existe bien...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut
    Ah oui là ça marche mais je fais le difficile et ce n'est pas item(i-1).height qui m'intéresse mais bien item(i). Ce qui me rassure c'est que ça plante aussi chez qu'elqu'un d'autre. Merci quand même.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Par défaut
    Oui mais item(5) correspond bien a ton 6e objet...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut
    Non je ne crois pas: la méthode item démarre bien à 1 et pas à 0 donc si tu as 3 contrôle dans Me.Controls tu as item 1, item 2 et item 3.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Par défaut
    C'est facile a verifier fait une boucle de 0 à 6 et vois quand ca plante...
    Quel type de control est-ce? Si ce sont des boutons, affiche le caption.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Accueil.Controls.Item(i).Caption
    ou le nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Accueil.Controls.Item(i).Name
    Chez moi ca va bien de 0 à i-1...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut
    J'ai bien vérifié mon code ainsi que la nature des contrôles. Ca plante bien au moment de lire la propriété height du dernier contrôle créé. Alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Accueil.Controls.Item(i).Caption
    fonctionne en revanche très bien, y compris pour le dernier contrôle créé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i = 1 To 6
            MsgBox Accueil.Controls.Item(i).Caption
            h = Accueil.Controls.Item(i).Height
    Next
    plante au h = ... mais pas au MsgBox lorsque i vaut 6 et qu'il y a 6 contrôles dans la UserForm "Accueil".
    Merci.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Par défaut
    Alors la je ne vois pas, chez moi (XL2000), ca va bien de 0 à 5...
    je ne vois vraiment pas... Chez toi l'Item(0) n'existe pas?
    Ensuite je ne vois aucun autre probleme. Sinon ne declare pas ton h en Single mais juste J'ai regarde dans l'aide VBA :
    Set Object = object.Item( collectionindex)

    La syntaxe de la méthode Item comprend les éléments suivants :

    Élément Description
    object Objet valide.
    collectionindex Position d'un membre ou index dans une collection.

    Valeurs

    L'argument collectionindex peut être une chaîne ou un nombre entier. S'il s'agit d'une chaîne, elle doit correspondre à un nom de membre valide. S'il s'agit d'un nombre entier, sa valeur minimale est 0 et sa valeur maximale est le nombre d'éléments de la collection moins un.

    Remarques

    Si un index ou un nom invalide est spécifié, une erreur se produit.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut
    Bon en fait je pense avoir trouvé: si tu regardes dans la fenêtre des variables locales item commence bien à 1 pour se terminer à 6: jusque là ok.
    Maintenant tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Accueil.Controls.Item(i).Caption & Format(i)
    et miracle tu t'aperçois que le contrôle item(1) qui s'affiche dans la fenêtre des variables locales est en fait le contrôle d'indice i=0. Du coup moi j'ai mis mon compteur jusqu'à 6 car lorsque j'ai écrit mon programme, je l'ai fait en regardant la fenêtre des variables locales... alors qu'en fait ça s'arrête à 5. Donc évidemment quand le compilateur arrive à 6 il plante, que ce soit sur h =... ou sur le MsgBox contrairement à ce que j'ai dit avant.
    Il n'en reste pas moins vrai que la fenêtre des variables locales semble afficher un peu n'importe quoi sur ce coup-là.
    En tout cas merci. Bonne soirée.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut
    Et pour finir de répondre l'item 0 n'existe pas. Je suis sous Excel 2003.
    A+.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/03/2016, 21h28
  2. Création de contrôles dynamiques dans une frame
    Par Cidou dans le forum VBA Project
    Réponses: 0
    Dernier message: 14/05/2008, 10h14
  3. [Excel] création de contrôles dynamique
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/03/2007, 22h26
  4. [VB.NET] - Création de contrôle dynamique
    Par DeFCrew dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/09/2006, 16h18
  5. [VBA Excel] Créer plusieurs contrôles dynamiquement
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/12/2005, 17h27

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