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

VBA Access Discussion :

Erreur sur recordset. [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut Erreur sur recordset.
    Bonjour à tous

    Voilà mon soucis est relativement simple : Je veux exporter le contenu d'une requête dans un tableau Excel (qui sera un modèle *.xltm).

    Pour faire cela je pense (peut-être à tord) qu'il faut que je passe par un recordset puis avec l'instruction "DDEPoke" y affecter mes données.

    Donc première étape: créer mon recordset et charger les données dedans. Voici mon code
    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
    Option Compare Database
     
    Sub recup_datas()
        ' Objects ACCESS
        Dim Dbs_RP
        Dim Conn As New adodb.Connection
        Dim Rst_Ecart As New adodb.Recordset
        Dim Fld As adodb.Field
        ' Création du Recordset
        Set Conn = CurrentProject.Connection
        ' Remplissage du Recordset
        Rst_Ecart.Open "Select * From Ts_Ecart", Conn, adOpenKeyset, adLockreadonly
        ' Se positionner sur le premier enreg du recordset
        Rst_Ecart.Move first
        ' lister les champs
        For Each Fld In Rst_Ecart.Fields
            Debug.Print
        Rst_Ecart.Close Fld.Name & " " & Fld.Type
        Cnn.Close
    End Sub
    Bien évidemment ce code a été pris puis adapté sur différentes sources :
    - j'utilise le livre : VBA Access2007 programmer sous Access - edition ENI
    - j'utilise le livre : VBA Access pour les Nuls - edition First (Oui oui il y a plein de chose interessante dedans)
    - j'utilise aussi ce merveilleux site avec ses tutos miracles
    - et aussi F1 de temps à autre

    Or ce code il fonctionne pas et je vois pas pourquoi

    il s'arrete sur l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    Dim Conn As New adodb.Connection
    ...
    et me met le message suivant : Type défini par utilisateur non défini

    Mais c'est un Dim !
    et je voudrais utiliser le modèle d'Acces ADO.

    Merci pour votre aide

    Igloobel

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    Est-ce que tu as bien une référence Visual Basic à la bibliothèque « Microsoft ActiveX Data Objects 2.x Library» ?
    (où x est un chiffre entre 1 et 8)

    A+

  3. #3
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Bonsoir,
    petite solution rapide:
    DoCmd.TransferSpreadsheet

  4. #4
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonsoir

    Merci à LedZeppII et à Simplifi d'avoir repondu si vite

    pour LedZeppII
    Est-ce que tu as bien une référence Visual Basic à la bibliothèque « Microsoft ActiveX Data Objects 2.x Library» ?
    (où x est un chiffre entre 1 et 8)
    j'espère car pour faire modifier c'est quasi impossible (j'ai du attendre 1 mois pour avoir ACCESS 2007) et la hot line ne connait pas ACCESS ni le VBA et j'ai l'impression que je parle japonnais quand je leur pose des questions.

    En tout cas je verifie dès mon retour au boulot

    pour Simplifi
    petite solution rapide:
    Citation:
    DoCmd.TransferSpreadsheet
    ça à l'air bien ton truc, je connais pas. ça marche comment ?

    en tout cas merci pour vos réponses

    à bientôt

  5. #5
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    hello
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.TransferSpreadsheet acExport,acSpreadsheetTypeExcel12,"matable_ou_marequête","nom_du_fichier_sur_le_disque"
    les mots incompréhensibles font l'objet d'aide à la frappe
    on peut exporter ainsi aussi bien une table qu'une requête (sélection bien sûr)
    le nom du fichier doit être complet. genre: "y:\essai\fichier_export_1.xlsx"

    et même que marche pas mal pour cette commande (ce qui n'est pas toujours vrai )

  6. #6
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    salut à tous

    LedZeppII m'a dis
    Est-ce que tu as bien une référence Visual Basic à la bibliothèque « Microsoft ActiveX Data Objects 2.x Library» ?
    (où x est un chiffre entre 1 et 8)
    or j'ai :
    - Microsoft ActiveX Data Objects 2.0
    - Microsoft ActiveX Data Objects 2.1
    - Microsoft ActiveX Data Objects 2.5
    - Microsoft ActiveX Data Objects 2.6
    - Microsoft ActiveX Data Objects 2.7
    - Microsoft ActiveX Data Objects 2.8
    ils sont tous décoché

    Je coche lequel ou lesquels ?

  7. #7
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Pour Simplifi
    tu m'as dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.TransferSpreadsheet acExport,acSpreadsheetTypeExcel12,"matable_ou_marequête","nom_du_fichier_sur_le_disque"
    c'est effectivement très interessant malheureusemnt je ne peux pas l'utiliser car je dois remplir un tableau formaté où les colonnes ne se suivent pas car il y a des formules inséré d'ou l'idée de l'instruction "DDEPoke" cité sur mon premier post.

    Merci tout de même car un jour cela me servira peut-être

    et même que F1 marche pas mal pour cette commande (ce qui n'est pas toujours vrai )
    Ah ça c'est b'en vrai ça

  8. #8
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Citation Envoyé par Igloobel Voir le message
    j'ai :
    - Microsoft ActiveX Data Objects 2.0
    - Microsoft ActiveX Data Objects 2.1
    - Microsoft ActiveX Data Objects 2.5
    - Microsoft ActiveX Data Objects 2.6
    - Microsoft ActiveX Data Objects 2.7
    - Microsoft ActiveX Data Objects 2.8
    ils sont tous décoché

    Je coche lequel ou lesquels ?
    Coche «Microsoft ActiveX Data Objects 2.8»

    Il a quelques erreurs dans le code de ton premier message.
    Voici une version où j'ai corrigé les erreurs que j'ai vues:
    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
    Sub recup_datas()
        ' Objects ACCESS
        Dim Dbs_RP
        Dim Conn As New adodb.Connection
        Dim Rst_Ecart As New adodb.Recordset
        Dim Fld As adodb.Field
        ' Création du Recordset
        Set Conn = CurrentProject.Connection
        ' Remplissage du Recordset
        Rst_Ecart.Open "Select * From Ts_Ecart", Conn, adOpenKeyset, adLockreadonly
        ' Se positionner sur le premier enreg du recordset
        Rst_Ecart.Move first
        ' lister les champs
        For Each Fld In Rst_Ecart.Fields
            Debug.Print Fld.Name & " " & Fld.Type
        Next
        Rst_Ecart.Close 
        Conn.Close
    End Sub
    Par ailleurs, tu n'es pas obligé d'utiliser la bibliothèque ADODB.
    La bibliothèque native est DAO.
    Le nom de cette bibloithèque est ...
    «Microsoft DAO 3.6 Object Library» pour des bases Access au format de fichier 2000 à 2003.
    «Microsoft Office 12.0 Access database engine Object Library» pour des bases Access au format de fichier 2007 ou plus.

    L'équivalent de ton code avec la bilbiothèque DAO serait le suivant :
    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
    Sub recup_datas()
        ' Objects ACCESS
        Dim Dbs_RP As DAO.Database
        Dim Rst_Ecart As DAO.Recordset
        Dim Fld As DAO.Field
        ' Référencer la base de données en cours
        Set Dbs_RP = CurrentDb
        ' Ouvrir le recordset
        Set Rst_Ecart = Dbs_RP.OpenRecordset("Select * From Ts_Ecart", dbOpenDynaset)
        ' Se positionner sur le premier enreg du recordset
        Rst_Ecart.MoveFirst
        ' lister les champs
        For Each Fld In Rst_Ecart.Fields
            Debug.Print Fld.Name & " " & Fld.Type
        Next
        Rst_Ecart.Close
        Set Rst_Ecart = Nothing
        Set Dbs_RP = Nothing
    End Sub
    Beaucoup de développeurs Access préfèrent DAO lorsqu'il s'agit de manipuler des données Access.

    A+

  9. #9
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Regarde dans cette discussion que j'ai retrouvée.
    J'avais posté un exemple complet (ici)
    A+

  10. #10
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    bonjour à tous,
    Coche «Microsoft ActiveX Data Objects 2.8»
    Je l'ai fait et Oh miracle tous mes adodb en minuscule se sont mis en majuscule donc reconnu

    Est-ce qu'il faut toujours mettre le plus fort ici 2.8 sur un autre poste 2.6 ?

    Il a quelques erreurs dans le code de ton premier message.
    Voici une version où j'ai corrigé les erreurs que j'ai vues:
    Un For sans Next ? Je suis Champion du monde de la bevue

    Par ailleurs, tu n'es pas obligé d'utiliser la bibliothèque ADODB.
    La bibliothèque native est DAO.
    Le nom de cette bibloithèque est ...
    «Microsoft DAO 3.6 Object Library» pour des bases Access au format de fichier 2000 à 2003.
    «Microsoft Office 12.0 Access database engine Object Library» pour des bases Access au format de fichier 2007 ou plus.
    tout d'abord «Microsoft Office 12.0 Access database engine Object Library» est bien coché par defaut
    Je suis d'accord que pour manipuler les recordsets il y a deux façons, mais n'étant pas à l'aise avec eux je me suis mis à potasser mes livres en premier
    *VBA Access pour les Nuls - edition First (Chp7 - P130)
    où ils disent que ADO es plus récentque DAO donc mieux puis
    *VBA Access2007 programmer sous Access - edition ENI (Chp4 - P133)
    où je cite :
    ...
    ADO a l'avantage d'être facile d'emploi,performant, et d'utiliser peu de mémoire et d'espace disque.
    alors moi quand on me dis (même écrit) que c'est facile, performant et peu de resource, ben je prend

  11. #11
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Ceci dis je vais potasser ton exemple ainsi que le post popofpopof

    et je revient dessus

    Merci Igloobel

  12. #12
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonsoir

    Suite de mes soucis ...

    L'exemple de LedZeppII est parfait j'ai même imprimer le post et j'ai adapter a mon exemple et voici mon code.
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    Sub ExporteDsExcelAvecModele()
        ' Variables pour manipuler Excel
        Dim xlApp As Excel.Application, xlAppCreated As Boolean
        Dim xlWbk As Excel.Workbook, xlSht As Excel.Worksheet
        Dim lgCntLigne As Long
        Dim i As Byte
        ' Variables données sources
        Dim Db As DAO.Database, Rs As DAO.Recordset
        ' Variable spécifiques à l'appli
        Dim strCodeCli As String, strNumCmde As String
        Dim Tablo(1 To 11) As Variant
     
        On Error GoTo ErrH
        'initialisaton de la ligne du tableau
        lgCntLigne
     
        Set Db = CurrentDb
        ' Ouvre la requête
        '
        Set Rs = Db.OpenRecordset("SELECT * FROM Ts_Ecart WHERE [Ts_Ecart.Lib_Serv]='DIR'")
        ' Si vide sortir
        If Rs.EOF Then GoTo ExitSub
     
        ' Tente de récupérer une instance d'Excel déjà créée
        Set xlApp = GetObject(, "Excel.Application")
        ' Sinon, crée une nouvelle instance d'Excel
        If xlApp Is Nothing Then
           Set xlApp = CreateObject("Excel.Application")
           xlAppCreated = True
        End If
        ' Crée un nouveau Classeur à partir d'un modèle
        Set xlWbk = xlApp.Workbooks.Add(CurrentProject.Path & "\Suivi habilitations mensuels PR.xlt")
        ' Référence la feuille active du classeur
        Set xlSht = xlWbk.ActiveSheet
     
        ' Insertion de la date systeme en B1
        xlSht.Range("B1") = Date
        'Détail (lignes) commence à partir de cellule B8
        Do
        ' chargement du tablo
            Tablo(1) = Rs.Fields(0)
            Tablo(2) = Rs.Fields(1)
            Tablo(3) = Rs.Fields(2)
            Tablo(4) = Rs.Fields(3) 
            Tablo(5) = Rs.Fields(4)
            Tablo(6) = Rs.Fields(5)
            Tablo(7) = Rs.Fields(5) + 1096
            Tablo(8) = Rs.Fields(6)     
            Tablo(9) = Rs.Fields(5) + 1096
            If Tablo(9) > Tablo(8) Then
                Tablo(10) = " BLOQUANT : Fin de d'habilitation < à fin de validité"
            Else
                Tablo(10) = " DANGER : Fin de d'habilitation > à fin de validité"
            End If
            Tablo(11) = Rs.Fields(7)        
            For i = 1 To 11
                xlSht.cells(lgCntLigne, i) = Tablo(i)
            Next i
     
            Rs.MoveNext
            ' Incrémenter n° de ligne (relatif à la ligne 8 (B8))
            lgCntLigne = lgCntLigne + 1
        Loop Until Rs.EOF
     
        ' Pour confirmer l'écrasement du Classeur s'il existe
        xlApp.DisplayAlerts = False
        ' Sauvegarde du Classeur
        xlWbk.SaveAs CurrentProject.Path & "\Resultats\Suivi habilitations mensuels PR_DIR", xlNormal
        ' Fermeture du Classeur
    xlWbk.Close False
     
    ExitSub:
        ' Réactive les messages d'avertissement
        If Not (xlApp Is Nothing) Then xlApp.DisplayAlerts = True
     
        ' Libération des variables objets
        Set Rs = Nothing
        Set Db = Nothing
     
        Set xlSht = Nothing
        Set xlWbk = Nothing
        If xlAppCreated = True And Not (xlApp Is Nothing) Then xlApp.Quit
        Set xlApp = Nothing
        Exit Sub
     
    ErrH:
        ' Gestion d'erreurs
        Select Case Err.Number
            Case 429
                 ' Ignorer Erreur causée par GetObject(, "Excel.Application")
                 Resume Next
     
            Case Else
                 MsgBox "Erreur N. " & Err.Number & " : " & Err.Description
                 Resume ExitSub
        End Select
    End Sub
    Or il me fait un message : Erreur sur compilation Type defini par utilisateur non defini
    et il se positionne sur lligne 3 et selectionne : xlApp As Excel.Application
    et là je vois pas !

    Un petit coup de main serais le bienvenu

  13. #13
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Il faut ajouter une référence Visual Basic à «Microsoft Excel 12.0 Object Library».
    Cela correspond à la bibliothèque Excel, par l'intermédiaire de laquelle on peut faire de l'automation, c'est à dire piloter Excel en dehors d'Excel.

    A+

  14. #14
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Super ça marche

    Bon je continue mes tests

    Ceci dis j'ai une question Est-ce que toutes ces libraries seront cochées si l'application est lancé d'un autre poste soit par ACCESS soit par runtime ?

  15. #15
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,
    Citation Envoyé par Igloobel Voir le message
    Est-ce que toutes ces libraries seront cochées si l'application est lancé d'un autre poste soit par ACCESS soit par runtime ?
    Oui, elles le seront.
    Les informations concernant les références Visual Basic cochées, sont stockées au niveau du projet Visual Basic, lequel est stocké dans la base de données.
    Le seul problème potentiel se situe au niveau des références Office, comme par exemple «Microsoft Excel 12.0 Object Library».
    Le 12.0 correspond à Office 2007.
    Si la base de données est ouverte avec Access 2003, la référence «Microsoft Excel 12.0 Object Library» sera marquée MANQUANTE, car dans Office 2003 sont nom est «Microsoft Excel 11.0 Object Library».
    Dans le sens inverse pas de problème. Si la base est ouverte avec Access 2010, la référence «Microsoft Excel 12.0 Object Library» est convertie en «Microsoft Excel 14.0 Object Library».

    A+

  16. #16
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Oui, elles le seront.
    Les informations concernant les références Visual Basic cochées, sont stockées au niveau du projet Visual Basic, lequel est stocké dans la base de données.
    Merci pour ces informations que je ne connaissaient pas
    Le seul problème potentiel se situe au niveau des références Office, comme par exemple «Microsoft Excel 12.0 Object Library».
    Le 12.0 correspond à Office 2007.
    Si la base de données est ouverte avec Access 2003, la référence «Microsoft Excel 12.0 Object Library» sera marquée MANQUANTE, car dans Office 2003 sont nom est «Microsoft Excel 11.0 Object Library».
    Dans moncas ça ne s'applique pas car tout est en 2007 y compris les runtimes

    Ceci dis j'ai encore un message d'erreur
    j'ai créé une macro qui lance une serie de macro
    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
    Sub creat_Fic()
        Call ExporteDsExcelAvecModele_DIR   '
        Call ExporteDsExcelAvecModele_IPE   '
        Call ExporteDsExcelAvecModele_SAP   '
        Call ExporteDsExcelAvecModele_MTE   '
        Call ExporteDsExcelAvecModele_MSR   '
        Call ExporteDsExcelAvecModele_SPR   '
        Call ExporteDsExcelAvecModele_SLT   '
        Call ExporteDsExcelAvecModele_APS   '
        Call ExporteDsExcelAvecModele_SSI
        Call ExporteDsExcelAvecModele_SQS
        Call ExporteDsExcelAvecModele_SCO
        Call ExporteDsExcelAvecModele_SCE
        Call ExporteDsExcelAvecModele_SAE
        Call ExporteDsExcelAvecModele_SFI
        Call ExporteDsExcelAvecModele_SIR
    End Sub
    J'ai a plusieurs reprises le message suivant
    Erreur N. -2147417848 : Erreur Automation
    L'objet invoqué s'est déconnecté de ses Clients

    Message que j'ai jamais vu

    Es-ce que cela vient du fait que certaines macro ne prevois pas de création de classeur ou bien parce que je crée 15 recordsets ou bien pour une raison que je ne connais pas ?

    Voici le premier les autres sont identique c'est seulement ds la requête et ds le nom du claqsseur crée que cela change (chaque trigramme correspond à un service )
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    Sub ExporteDsExcelAvecModele_DIR()
        ' Variables pour manipuler Excel
        Dim xlApp As Excel.Application, xlAppCreated As Boolean
        Dim xlWbk As Excel.Workbook, xlSht As Excel.Worksheet
        Dim lgCntLigne As Long
        Dim i As Byte
        ' Variables données sources
        Dim Db As DAO.Database, Rs As DAO.Recordset
        ' Variable spécifiques à l'appli
        Dim strCodeCli As String, strNumCmde As String
        Dim Tablo(1 To 11) As Variant
     
        On Error GoTo ErrH
        'initialisaton de la ligne du tableau
        lgCntLigne = 3
     
        Set Db = CurrentDb
        ' Ouvre la requête
        '
        Set Rs = Db.OpenRecordset("SELECT * FROM Ts_Ecart WHERE [Ts_Ecart.Lib_Serv]='DIR'")
     
        ' Si vide sortir
        If Rs.EOF Then GoTo ExitSub
     
        ' Tente de récupérer une instance d'Excel déjà créée
        Set xlApp = GetObject(, "Excel.Application")
        ' Sinon, crée une nouvelle instance d'Excel
        If xlApp Is Nothing Then
           Set xlApp = CreateObject("Excel.Application")
           xlAppCreated = True
        End If
        ' Crée un nouveau Classeur à partir d'un modèle
        Set xlWbk = xlApp.Workbooks.Add(CurrentProject.Path & "\Suivi habilitations mensuels PR.xlt")
        ' Référence la feuille active du classeur
        Set xlSht = xlWbk.ActiveSheet
     
        ' Insertion de la date systeme en B1
        xlSht.Range("B1") = Date
        Do
        ' chargement du tablo
            Tablo(1) = Rs.Fields(0)     'NNI
            Tablo(2) = Rs.Fields(1)     'Nom
            Tablo(3) = Rs.Fields(2)     'Prenom
            Tablo(4) = Rs.Fields(3)     'Lib_Serv
            Tablo(5) = Rs.Fields(4)     'Lib_Equip
            Tablo(6) = Rs.Fields(5)     'Dat_real
            Tablo(7) = Rs.Fields(5) + 1096
            Tablo(8) = Rs.Fields(6)     'dat
            Tablo(9) = Rs.Fields(5) + 1096
            If Tablo(9) > Tablo(8) Then
                Tablo(10) = " BLOQUANT : Fin de d'habilitation < à fin de validité"
            Else
                Tablo(10) = " DANGER : Fin de d'habilitation > à fin de validité"
            End If
            Tablo(11) = Rs.Fields(7)    'ecart
     
            For i = 1 To 11
                xlSht.cells(lgCntLigne, i) = Tablo(i)
     
            Next i
            Rs.MoveNext
            ' Incrémenter n° de ligne
            lgCntLigne = lgCntLigne + 1
        Loop Until Rs.EOF
     
     
        ' Pour confirmer l'écrasement du Classeur s'il existe
        xlApp.DisplayAlerts = False
        ' Sauvegarde du Classeur
        xlWbk.SaveAs CurrentProject.Path & "\Resultats\Suivi habilitations mensuels PR_DIR", xlNormal
        ' Fermeture du Classeur
    xlWbk.Close False
     
    ExitSub:
        ' Réactive les messages d'avertissement
        If Not (xlApp Is Nothing) Then xlApp.DisplayAlerts = True
     
        ' Libération des variables objets
        Set Rs = Nothing
        Set Db = Nothing
     
        Set xlSht = Nothing
        Set xlWbk = Nothing
        If xlAppCreated = True And Not (xlApp Is Nothing) Then xlApp.Quit
        Set xlApp = Nothing
        Exit Sub
     
    ErrH:
        ' Gestion d'erreurs
        Select Case Err.Number
            Case 429
                 ' Ignorer Erreur causée par GetObject(, "Excel.Application")
                 Resume Next
     
            Case Else
                 MsgBox "Erreur N. " & Err.Number & " : " & Err.Description
                 Resume ExitSub
        End Select
    End Sub
    merci de votre indulgence et votre aide

  17. #17
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Après plusieurs essais, j'ai fini par découvrir que ça venait de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        ' Tente de récupérer une instance d'Excel déjà créée
        Set xlApp = GetObject(, "Excel.Application")
    Elle est censée lever l'erreur 429, laquelle est prise en compte dans la gestion d'erreurs.
    J'ai pu constater qu'elle lève aussi l'erreur &H80010108 (-2147417848).
    Cela vient apparemment du fait des Call successifs.
    La première fois l'erreur est 429, puis toutes les fois suivantes c'est l'erreur &H80010108.
    Je pense que c'est parce que Excel est en cours de déchargement (xlApp.Quit) et que cette opération n'est pas complètement terminée.

    La première solution, c'est de gérer cette erreur de la même manière que 429.
    En espérant qu'elle n’apparaisse pas dans un autre cas de figure ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ErrH:
        ' Gestion d'erreurs
        Select Case Err.Number
            Case 429, &H80010108
                 ' Ignorer Erreur causée par GetObject(, "Excel.Application")
                 Resume Next
     
            Case Else
                 MsgBox "Erreur N. " & Err.Number & " : " & Err.Description
                 Resume ExitSub
        End Select
    La deuxième solution, serait de systématiquement faire CreateObjet et de ne pas tenter GetObjet.
    Ça veut dire remplacer ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        ' Tente de récupérer une instance d'Excel déjà créée
        Set xlApp = GetObject(, "Excel.Application")
        ' Sinon, crée une nouvelle instance d'Excel
        If xlApp Is Nothing Then
           Set xlApp = CreateObject("Excel.Application")
           xlAppCreated = True
        End If
    ... par ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        ' Crée une nouvelle instance d'Excel
        Set xlApp = CreateObject("Excel.Application")
        xlAppCreated = True
    Et aussi, remplacer ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ErrH:
        ' Gestion d'erreurs
        Select Case Err.Number
            Case 429, &H80010108
                 ' Ignorer Erreur causée par GetObject(, "Excel.Application")
                 Resume Next
     
            Case Else
                 MsgBox "Erreur N. " & Err.Number & " : " & Err.Description
                 Resume ExitSub
        End Select
    ... par ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ErrH:
        ' Gestion d'erreurs
        Select Case Err.Number
     
            Case Else
                 MsgBox "Erreur N. " & Err.Number & " : " & Err.Description
                 Resume ExitSub
        End Select
    La deuxième solution est sûrement plus pro.
    La première solution est uniquement avantageuse dans le cas où Excel est déjà ouvert, car elle évite de multiples ouverture/fermeture d'Excel.

    A+

  18. #18
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    merci à LedZeppII pour toute cette aide sur mes requête
    j'ai utiliser la première méthodee qui était la plus simple pour moi et j'ai testé et super j'ai mes 15 classeurs

    Il me reste un petit détail si je peux me permettre

    Je voudrais lancer cette macro depuis un bouton qui se trouve sur un formulaire Menu

    Depuis le bouton je peux appeler une macro événement (parchemin jaune) qui peut appeler une fonction qui peut appeler ma macro ... mais je trouve cela lourd

    Je suis sur qu'il y un moyen de faire plus simple mais je maitrise pas bien les boutons
    Une dernière petite aide Siouplais

  19. #19
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    C'est en fait tellement simple que je devient impardonable

    voilà comment j'ai fait :

    1°) création du bouton avec appel d'une macro (parchemin jaune)
    2°) suppression de la macro
    3°) création nouvelle macro (je prends l'option code)
    4°) je fais un call de la macro principal ... et c'est tout

    Et ça marche

    je cloture

    encore merci à LedZeppII


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

Discussions similaires

  1. Erreur sur Recordset
    Par nenette69 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/02/2013, 13h55
  2. [XL-2007] Erreur sur RECORDSET
    Par Duddy dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 14/02/2011, 17h58
  3. erreur d'execution 3061 sur recordset
    Par moicats dans le forum VBA Access
    Réponses: 6
    Dernier message: 16/09/2008, 16h38
  4. Erreur ADODB.Recordset error '800a0cc1' sur une condition
    Par jeandormesson dans le forum ASP
    Réponses: 1
    Dernier message: 02/04/2008, 11h05
  5. Réponses: 13
    Dernier message: 27/02/2007, 10h09

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