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 de Compilation : type defini par l'utilisateur non defini


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut Erreur de Compilation : type defini par l'utilisateur non defini
    Bonjour a tous

    Voila je suis confronter à fusionner plus de 100 classeurs de une feuille en un classeur de une feuille.
    j'ai fouiller sur le forum et je suis tomber sur la faq :
    http://excel.developpez.com/faq/?pag...onClasseursADO

    Étant novice dans le vba de excel j'ai copier le code comme suis voir capture mais il me donne une erreur a l’exécution

    Nom : Capture.PNG
Affichages : 22811
Taille : 41,8 Ko


    Code vba : 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
     
    Sub Test()
    'Test Macro
    'Nécessite d'activer la référence
        'Microsoft ActiveX Data Objects x.x Library
    Dim Cn As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim xConnect As String, Cible As String
    Dim Fichier As String, Dossier As String, Feuille As String
    Dim i As Long
     
    'nom du répertoire contenant les classeurs à regrouper
    Dossier = "D:\Users\Devalender\Desktop\favidetci\liste"
    'Nom de la feuille dans les classeurs fermés
    'Ne pas oublier le symbole $ après le nom de la feuille
    Feuille = "A"
    i = 2
     
    Fichier = Dir(Dossier & "\*.xls")
    'boucle sur les fichiers du repertoire
    Do While Len(Fichier) > 0
        xConnect = "DRIVER={Microsoft Excel Driver (*.xls)};" & _
        "ReadOnly=1;DBQ=" & Dossier & "\" & Fichier
        'connection classeur
        Set Cn = New ADODB.Connection
        Cn.Open xConnect
     
        'Requete
        Cible = "SELECT * FROM [" & Feuille & "];"
     
        Set Rs = New ADODB.Recordset
        Rs.Open Cible, xConnect, adOpenStatic, adLockOptimistic, adCmdText
     
        'Ecriture dans la feuille de calcul
        If Not Rs.EOF Then Cells(i, 1).CopyFromRecordset Rs
        i = Cells(i, 1).End(xlDown).Row + 1
     
        Rs.Close
        Cn.Close
        Set Cn = Nothing
        Set Rs = Nothing
        Fichier = Dir()
    Loop
     
    MsgBox "Terminé"
     
     
    End Sub
    pouvez vous m'aider !

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Peux tu nous a quelle ligne tu obtient ce problème? on ne le voit pas sur ta capture

    As tu lu les commentaire du code que tu as copié?
    celui là par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Nécessite d'activer la référence
        'Microsoft ActiveX Data Objects x.x Library
    Si la réponse est non alors ton problème viens surement de là.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ce n'est pas une possibilité, c'est une certitude

    tu travailles en liaison précoce (déclaration de la variable directement avec son type) mais tu n'as pas activé les librairies (références) contenant ce type de variable

    il est préférable de travailler (ou de finaliser) ton projet en liaison tardive :

    - déclarer tous les types "externes" en Object (plutôt que ADODB.Connection par exemple)

    - instancier ces variable via un "CreateObject", par exemple (non testé, mais je crois que l'objet s'appelle pareil en mode Create) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Cn As Object
    Set Cn = CreateObject("ADODB.Connection")

  4. #4
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    en cliquant sur le bouton exécuter voila ce que j'ai !
    Nom : Capture.PNG
Affichages : 21430
Taille : 25,2 Ko

  5. #5
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    As-tu fais ceci dans l'éditeur VBA ?

    Menu - Outils
    Cliquer Références
    Cocher Microsoft ActiveX Data Objects 2.8 Library
    Si 2.8 n'y est pas prends la plus récente. Oublie 6.1. C'est celle qui est prévue pour VB6.

    Nom : AD0.jpg
Affichages : 17600
Taille : 151,6 Ko

    Tant que tu ne feras pas cela, ce sera pantoute.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  6. #6
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    Il est préférable de travailler (ou de finaliser) ton projet en liaison tardive :
    Dans ce cas cela n'a pas d'importance.

    Cette bibliothèque est incluse et installée dans Windows depuis, je pense Windows 95 ou Windows 98.

    Peu importe le numéro de version coché, 2.x, c'est le même GUID et VBA s'y retrouve quand même.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    @clementmarcotte

    Tu es sur? Il a pourtant enlevé le commentaire qui disait de l'activer donc normalement ça devrait marcher ...
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  8. #8
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Si il a enlevé le commentaire et qu'il a vraiment coché la référence, faudrait que je teste pour voir.

    Ceci dit, mon Excel 2010 est du genre capricieux, parce que, avec ou sans CreateObject, je suis obligé d'ajouter quand même la référence.

    Ceci dit, s'il a coché la version 6.1 au lieu de 2.8, c'est sûr que cela ne marchera pas. Si il a son message d'erreur et qu'il est vraiment incapable de dépasser la première ligne, c'est souvent un problème de référence. Ce que jo.levrai préconise permet premièrement d'éviter de planter une macro, qui serait développée avec disons la version 2.5 d'une bibliothèque et qui tournerait sur une machine avec la version 2.

    C'est également très vrai dans le cas d'une entreprise qui utiliserait des versions différentes d'Office. Par exemple, le Service de Dictature informatique qui connaît très bien la maxime (ou peut-être le proverbe) "Charité bien ordonnée commence par soi-même" peut développer une application Excel 2016 qui a une référence à Word 2016, (sans CreateObject) (Liaison précoce ou early bindig). Sans modifier les liaisons à la mitaine, cette application ne fonctionnera pas sur Office 2010, parce que les applications Office 2010 et Office 2016, n'ont pas la même identification unique (GUID)

    Par contre, avec CreateObject (liaison tardive ou late binding), VBA et Windows sont capables d'établir la bonne liaison, sans planter la macro.

    Mais, dans le cas des bibliothèques ADO, Microsoft a conservé le même GUID à chaque mise-à-jour, si bien que la liaison s'établit avec la dll existante parce que l'identification ne change et que ni VBA, ni Windows, ne se posent de question.

    Ceci dit, à regarder son code, il devrait aussi regarder cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     xConnect = "DRIVER={Microsoft Excel Driver (*.xls)};" & _
        "ReadOnly=1;DBQ=" & Dossier & "\" & Fichier
    Parce que, avec son Excel 2007 sont venus deux changements qui pourraient l'affecter:

    1) Le format binaire xls a été remplacé par le format OpenXML xlsx
    2) Le moteur Jet a été remplacé par le moteur ACE

    Et, heureusement pour lui, il est quand même assuré d'avoir un Office à 32 bits. (Depuis Office 2010, On peut avoir Office en versions 32 et 64 bits.)

    Pour les (nouvelles) chaînes de connexion, une bonne place à connaître:

    https://www.connectionstrings.com/excel/
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  9. #9
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    J'ai repris cette macro qui fonctionne très bien mais eulement avec les fichier XLS, or moi j'ai des fichier XLSX (Excel 2016)
    Biensur j'ai adapté le code et remplacé tous les xls par xlsx.

    Quelqu'un a une idée de ce qui bloque la macro à ce niveau : Cn.Open xConnect?

Discussions similaires

  1. [XL-2003] Erreur de compilation " type defini par l'utilisateur non defini"
    Par JEXCELPAS dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/01/2015, 15h40
  2. Réponses: 1
    Dernier message: 01/11/2014, 09h44
  3. [XL-2010] erreur de compilation / Type défini par l'utilisateur non défini
    Par GADENSEB dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/08/2014, 15h31
  4. [AC-2003] Erreur en VBA Type défini par l'utilisateur non défini
    Par stefchar dans le forum VBA Access
    Réponses: 12
    Dernier message: 26/01/2011, 09h42
  5. Réponses: 2
    Dernier message: 11/01/2009, 15h58

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