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 :

Erreur inexplicable !


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut Erreur inexplicable !
    Quelqu'un peut-il m'expliquer pourquoi un code aussi simple ne passe pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Sub insererImage()
     
    Dim CMD As CommonDialog
     
    CMD.DialogTitle = "Choisissez une image"
    End Sub
    A l'exécution, ça me donne le message d'erreur suivant :

    Erreur d'exécution 91.
    Variable objet ou variable de bloc With non définie

    A noter que cette erreur disparaît dès que je mets en commentaire la ligne

    CMD.DialogTitle = "Choisissez une image"

  2. #2
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Je ne travaille jamais avec des CommonDialogs aussi je ne suis pas sûr mais ne dois-tu pas déclarer ta variable avec le mot New

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim CMD As New CommonDialog
    Ceci afin que l'objet soit directement créé...

    Just an idea.

    Christophe

  3. #3
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 916
    Par défaut
    Ton erreur n'a rien d'inexplicable !!!!

    Tu essayes de préciser le titre d'un dialogue que tu n'as pas définis !
    Soit tu fais comme cavo789 le suggère et tu fais un New, soit tu fait un Set:

    Sinon, plus simple, soit tu utilises des dialogues tout fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim mydialog as Dialog
    Set mydialog = Application.Dialogs(xlDialogOpen)
    ou tu travailles avec des UserForm !

    Laurent

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    Lorsque j'essaye avec un new , j'obtiens une autre erreur :

    l'erreur 429 :
    Un composant ActiveX ne peut pas créer d'objet

    avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub insererImage()
    Dim mydialog As New CommonDialog
    mydialog.DialogTitle = False
    End Sub
    lorsque je fais un set j'obtiens exactement la même erreur qu'avec le new

    Par contre pour ce qui est du type Dialog , si j'ai bien compris, la différence entre Dialog et CommonDialog tient au fait qu'on ne peut pas personnaliser les boites de dialogue de type Dialog (Dites moi si je me trompe).
    Or j'ai besoin de personnaliser ma boîte de dialogue (pas au point de faire un UserForm en partant de 0) ; en gros j'aimerais changer juste quelques détails à la boite de dialogue classique "Ouvrir"

  5. #5
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 916
    Par défaut
    Je suis curieux de voir comment tu as écris ton Set !

    Le code que tu écris ne pourras jamais fonctionner !

    Si on ne peut pas créer de nouveaux objets CommonDialog mais uniquement se référer à des objets qui existent, tu dois d'abord retrouver le CommonDialog que tu veux customiser et t'y réferer avant toute chose.

    Le connaîs-tu ? C'est lequel ?

    Si oui, alors un Set bien écrit fonctionnera.
    Sinon, la 1ère chose est de l'identifier.

    Un exemple très simple:
    Tu souhaites une voiture que tu veux peindre en rouge. Tu ne peux pas peindre dans le vide.

    Donc soit tu construis de nouvelle voiture (Set MaVoiture= New Voiture).

    Soit tu trouves une voiture qui existe, par exemple le Hummer du voisin et tu dis que c'est cette voiture-là bien précise que tu veux peindre (Set MaVoiture = La_Voiture_Du_Voisin)


    Ensuite, maintenant et seulement maintenant que tu as identifié la voiture à peindre, seulement, tu pourras la peindre (MaVoiture.peindre(rouge) )


    J'espère ne pas avoir offenser ton intelligence avec mon exemple très simpliste , mais j'espère qu'il t'éclairera sur ce mécanisme des New/Set.

    Laurent

  6. #6
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    Déjà tu ne m'offenses pas du tout, au contraire je pense que si tout le monde prenait des exemples simples pour expliquer les choses, et bien les gens se comprendraient bien mieux

    Bon, donc j'ai bien compris l'histoire du Set et du New.
    Je comprends aussi ce que tu dis, sur le fait qu'il faut déjà avoir construit la voiture pour pouvoir la peindre.

    Mais lorsque je regarde des exemples d'utilisation du CommonDialog (notamment sur un livre), j'ai vraiment l'impression qu'ils définissent d'abord les propriétés du CommonDialog, puis qu'ensuite ils font un

    mydialog.ShowOpen
    ou myDialog.ShowSave
    ou autres , en fonction de s'ils veulent faire un "Ouvrir", un "Enregistrer Sous", etc ...

    en gros j'ai l'impression que c le ShowOpen qui dit "ça sera une boite de dialogue de type 'Ouvrir' "

    Cela dit j'ai peut être mal compris.

    Qu'à cela ne tienne, pour récapituler :

    - quand j'essaye avec un new, c'est à dire avec le code suivant, j'obtiens l'erreur "Un composant ActiveX ne peut pas créer d'objets" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub insererImage()
    Dim mydialog As New CommonDialog   'Cette ligne marche
    mydialog.DialogTitle = "Inserer une image"  'Ligne qui provoque l'erreur
    End Sub

    - sinon je veux bien essayer avec un set, mais en effet je ne sais pas quoi affecter à my dialog...
    en gros faut que je fasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim mydialog as CommonDialog
    Set mydialog = "qqchose"
    mais ce "qqchose" , j'ai pas la moindre idée de ce qu'il faut mettre, sachant que j'ai essayé avec plein d choses en faisant un ctrl+espace pr voir ce qu'il mpropose, et en effet il m propose un tas d choses, mais les quelques essais que j'ai fait son restés infructueux, puisque j'ai obtenu a chaque fois des erreurs d'incompatibilité de type

  7. #7
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    Je désespère.

    J'ai trouvé un semblant de réponse ici :

    http://support.microsoft.com/kb/281848/fr

    Mais je n'arrive même pas à essayer cette solution, vu que j'arrive pas à placer un CommonDialog dans un UserForm comme ils le proposent, ni même ailleurs d'ailleurs.

    Je commence à désespérer ...

  8. #8
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    T'as essayé d'enregistrer une macro pour ouvrir la boîte de dialogue d'insertion d'image d'Excel et de la modifier par la suite ?

  9. #9
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    ben en fait ça me génère ça, comme code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        ActiveSheet.Pictures.Insert( _
            "C:\Documents and Settings\lyon\Mes documents\Mes images\feuille_vigne.jpg"). _
            Select
    ce qui est pas mal du tout, vu que je vais m'en servir, donc bonne idée!
    par contre ça ne me dit pas par quel code est ce qu'on peut personnaliser la boite de dialogue en question...
    disons que ce que je veux personnaliser c'est pas juste pour faire joli, c'est que j'ai même besoin de modifier un peu l'action effectuée par la boite de dialogue quand on clique sur Ok

  10. #10
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Bon OK, j'aurais du tester avant de poster.

    Voici:

    Après avoir ajouté une référence au commonDialog dans ton projet VBA, tu fais ceci:
    Sub InsertionImage()

    Dim cdlg As New MSComDlg.CommonDialog

    With cdlg
    .DialogTitle = "Choisissez une image"
    .Filter = "Bitmap (.bmp, .dib)|*.bmp;*.dib"
    .ShowOpen
    ActiveSheet.Pictures.Insert (.Filename)
    End With

    End Sub
    En espérant que ça répond à ta question.

  11. #11
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    ben en fait c'est exactement ce code que j'aimerais pouvoir faire marcher

    le new passe parfaitement, et ça cloche au niveau du

    With cdlg

    l'erreur est toujours la même

    Erreur d'exécution 429
    Un composant ActiveX ne peut pas créer d'objet

  12. #12
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Citation Envoyé par zazaraignée
    Après avoir ajouté une référence au commonDialog dans ton projet VBA

  13. #13
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    6 références suivantes sont cochées pour l'instant , parmi lesquelles

    Microsoft Common Dialog Control 6.0 (SP3)


    Cela dit, peut-être ai-je besoin d'autres références encore ?
    T'aurais une idée de laquelle ?

    Sinon, le 'SP3' qu'y a entre parenthèses, c le SP3 de Windows XP ? Parce que moi je suis sous Windows 2000

  14. #14
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Ton common dialog est-il appelé depuis une UserForm ou une macro ?

  15. #15
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 916
    Par défaut
    Dans VBA, tu vas dans "Tools" + "Additional Controls", là tu t'assures que "Microsoft CommonDialog..." est coché.

    Dans ta forme, tu ouvres la palette des outils ("Toolbox" en anglais): là où tu as les radio boutons, checkox, combobox, ... à déposer sur ta forme.

    Y apparaît maintenant une nouvelle icône qui te permet d'ajouter un CommonDialog sur ta forme. Moi je n'y arrive pas car j'ai un problème de license ( ), mais bon en principe ça marche.

    Remarque, cela ne transformera pas ta forme en CommonDialog, mais cela créera un CommonDialog connu dans le seul contexte de ta forme.

    Comme tout autre objet déposé sur la forme, tu lui donnes un nom. Son nom par défaut devrait être CommonDialog1.

    Maintenant dans ton code, tu as accès à ce CommonDialog.

    Tu peux donc écrire maintenant tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le_Nom_De_Ma_Forme.CommonDialog1.DialogTitle="Choisissez une image"
    Où utiliser le Set et le New ? Le New: nulle part. Le Set n'est plus requis. Il ne le sera que si tu veux utiliser une variable référant ce CommonDialog. PAr exemple, si tu veux utiliser "cmd" plutôt que "Le_Nom_De_Ma_Forme.CommonDialog1", tu écriras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim cmd as CommonDialog
    Set cmd=Le_Nom_De_Ma_Forme.CommonDialog1
    cmd.DialogTitle="..."
    Je pense que tu devrais pouvoir continuer.

    Laurent

  16. #16
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    En fait je viens d'essayer.
    J'ai crée la UserForm, la case en question était bien cochée, j'ai trouvé le contrôle CommonDialog.
    J'ai cliqué dessus, et essayé de le déposer dans le UserForm, et là, malheur, j'obtiens le message suivant :

    "Le contrôle n'a pas été créee parce qu'il n'est pas correctement licencié"

    En gros j'ai apparemment le même problème que toi, Laurent.
    As-tu trouvé une solution à ce problème par hasard ?

    Sinon je crois que je vais laisser tomber et essayer de faire autrement.

  17. #17
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 916
    Par défaut
    J'ai pas investigué ce problème de license. C'est la 1ère fois que je le vois.
    Quand je me suis servis du CommonDialog dans le passé (avec Excel2000 et 2003), j'ai jamais eu de problème. Là j'ai vite réessayé avec Excel2002.

    A la limite, pour moi, c'est autre problème, qui mérite un autre thread dans le forums si tu ne trouves pas d'info sur le web.

  18. #18
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    En fait j'ai trouvé une solution en cherchant sur le Web, mais que je ne peux mettre en pratique seul.
    Je l'ai trouvé sur cette discussion
    http://www.developpez.net/forums/arc...p/t-45202.html

    En fait il faudrait que quelqu'un chez qui ça marche, crée sur sa machine un UserForm, qu'il mette sur ce UserForm un CommonDialog, et qu'il m'envoie le tout par mail.

    Ce serait suuuper sympa.

  19. #19
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    En fait apparemment le problème est un problème courant.
    C'est un problème de licences.

    Pour le résoudre, il faut utiliser un fichier VBCTRLS.REG

    Mon problème est enfin résolu.

    Merci à tous

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

Discussions similaires

  1. Erreur inexplicable "an expection occured"
    Par nirvanaghost7 dans le forum Services Web
    Réponses: 1
    Dernier message: 17/05/2010, 10h07
  2. Envoi de mail : Erreur inexplicable
    Par kmaniche dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/11/2009, 14h48
  3. Réponses: 3
    Dernier message: 11/10/2007, 22h42
  4. Erreur ORA-01002 inexplicable ?
    Par Loyd1974 dans le forum SQL
    Réponses: 2
    Dernier message: 14/09/2007, 11h48
  5. Erreur LNK2001 inexplicable
    Par magicpm7 dans le forum Visual C++
    Réponses: 6
    Dernier message: 04/05/2007, 09h27

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