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 :

[VBA]Changer automatiquement la version d'une référence


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut [VBA]Changer automatiquement la version d'une référence
    Bonjour à tous !!

    Je pense aborder un problème que beaucoup de developpeur on surement du déjà rencontrer.
    La gestion des Versions Access : 97 / 2000 / 2002 / 2003.

    Je mets en place en ce moment une base de données. Je travaille sur mon poste avec Access 2003 possédant alors la référence Excel 11.
    Les postes sur lesquels j'installe ma base de données possèdent soit la version référence : Excel 10 voir même la version Excel 9.

    Est il possible de faire en sorte que la référence Excel 11 se cale automatiquent sur la version Excel la plus récente installée sur les différents postes (exemple : la référence Excel 11 deviendrait automatiquement la référence Excel 9)?

    Cordialement,

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Quand tu souahites distribuer une application, il faut embarquer les composants qu'elle exploite avec, d'où l'usage d'un SETUP.
    Une bibliothèque possède un ID unique nommé CLSID quelle que soit sa version.
    Pour Excel il s'agit de {00024500-0000-0000-C000-000000000046}

    Si tu ne veux pas être ennuyé avec ce genre de chose, deux solutions:
    1/ Coder et déclarer tes objets en Early-Binding
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim oXLApp as Object
        Set oXLApp =CreateObject("Excel.Application")
        ''' *** Ton code avec tes routines Exceliennes
        Set oXLApp =Nothing
    2/ Utiliser l'outil d'empaquetage et déploiement

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Merci de ta réponse Argy,

    Pour la solution n°1 je l'ai déjà en place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Dim xlApp As Excel.Application
        Dim xlSheet As Excel.Worksheet
        Dim xlBook As Excel.Workbook
    D'ailleurs pour que cette solution marche je suis obligé de cocher la référence Microsoft Excel 11...
    Je pense que ce code là est équivalent au tiens ? Me trompes je ?

    Pour la solution n°2 je pense que sa fait trop usine à gaz pour obtenir le résultat.

    Merci d'avance pour ton aide !!

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Absolument pas...
    Ce que tu me montres, c'est du Late Binding

    Citation Envoyé par mooh91
    Me trompes je ?
    Oui, tu te trompes...

    En réalité, pour coder tu écris ainsi pour bénéficier de l'IntelliSence mais une fois terminé et testé, tu vires la référence et tu passes tes variables As Object.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim xlApp As Object '*** Excel.Application
    Dim xlSheet As Object '*** Excel.Worksheet
    Dim xlBook As Object '*** Excel.Workbook
    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  5. #5
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Citation Envoyé par argyronet
    Une bibliothèque possède un ID unique nommé CLSID quelle que soit sa version.
    Argy
    C'est vrai si une seule version d'Excel est installé sur le poste.
    [Access] Les bases du débogage => ici

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Merci de ta réponse Argy,

    Pour la solution n°1 je l'ai déjà en place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Dim xlApp As Excel.Application
        Dim xlSheet As Excel.Worksheet
        Dim xlBook As Excel.Workbook
    D'ailleurs pour que cette solution marche je suis obligé de cocher la référence Microsoft Excel 11...
    Je pense que ce code là est équivalent au tiens ? Me trompes je ?

    Pour la solution n°2 je pense que sa fait trop usine à gaz pour obtenir le résultat.

    Merci d'avance pour ton aide !!

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Désolé pour le message précédent je l'ai envoyé deux fois par mégarde. Si un modo peut le supprimer ? Merci d'avance.

    Argy merci beaucoup. Sa à l'aire de marcher car la compilation fonctionne. Cependant la méthode que tu m'as donné me fait changer mon code par la suite. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ' les entetes
        '  .Fields(Index).Name renvoie le nom du champ
        For J = 0 To rec.Fields.Count - 1
            xlSheet.Cells(5, J + 1) = rec.Fields(J).Name
            ' Nous appliquons des enrichissements de format aux cellules
             With xlSheet.Cells(2, J + 1)
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlLeft
                .Font.Bold = True
            End With
    ( Code partiel me permettant de réaliser une exportation vers excel.)

    Lorsque je clique sur le bouton contenant ce code, le code s'arrête sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
    Le message d'erreur est le suivant :
    ------------------------------------------
    erreur d'execution n°1004
    erreur défini par l'application ou l'objet
    ------------------------------------------

    Ma question est la suivante : dois je changer mon code pour pouvoir prendre en compte les modif As Object ?

    Merci Kloun pour cette précision !

    Cordialement,

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Je ne suis pas sûr mais je pense que ce sont les constantes qui ne sont plus définies puisque tu as supprimé les références.
    A vérifier.
    [Access] Les bases du débogage => ici

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    D'ailleur si je remet la référence Excel, celà fonctionne.

    Voici le code complet :

    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    If IsNull(Me.cheminaccessexporttransfertpoly) Then
    MsgBox "Veuillez indiquer un chemin pour l'exportation", vbExclamation, "ORAGE"
    DoCmd.CancelEvent
    Else
    If IsNull(Me.nomexporttransfertpoly) Or Me.nomexporttransfertpoly = "" Then
    MsgBox "Veuillez indiquer un nom de fichier", vbExclamation, "ORAGE"
    DoCmd.CancelEvent
    Else
    If IsNull(Me.debutperiode) Or IsNull(Me.finperiode) Then
    MsgBox "Veuillez indiquer une date de début et une date de fin", vbInformation, "ORAGE"
    Else
    DoCmd.RunMacro "M transfertpoly"
    If DCount("*", "T transfertpoly3_Analyse croisée") > 0 Then
     
        Dim xlApp As Object
        Dim xlSheet As Object
        Dim xlBook As Object
     
        Dim I As Long, J As Long
        Dim t0 As Long, t1 As Long
     
        t0 = Timer
        Dim rec As Recordset
        Dim nbrtot As String
        'Compte le nombre d'enregistrement
        nbrtot = DCount("*", "T transfertpoly3_Analyse croisée")
     
        Set rec = CurrentDb.OpenRecordset("T transfertpoly3_Analyse croisée", dbOpenSnapshot)
     
        'Initialisations
        Set xlApp = CreateObject("Excel.Application")
        Set xlBook = xlApp.Workbooks.Add
     
        'Ajouter une feuille de calcul
        Set xlSheet = xlBook.Worksheets.Add
        xlSheet.Name = "Transfert polyvalence"
     
        ' le titre
        '  écriture dans la cellule de ligne 1 et de colonne 1
        xlSheet.Cells(2, 1) = "Métier " & Forms![F menu].Form![metieractif]
        xlSheet.Cells(3, 1) = "TRANSFERT POLYVALENCE DU " & Forms![F MENUTRANSFERT].Form![debutperiode] & " au " & Forms![F MENUTRANSFERT].Form![finperiode]
     
        ' les entetes
        '  .Fields(Index).Name renvoie le nom du champ
        For J = 0 To rec.Fields.Count - 1
            xlSheet.Cells(5, J + 1) = rec.Fields(J).Name
            ' Nous appliquons des enrichissements de format aux cellules
             With xlSheet.Cells(2, J + 1)
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlLeft
                .Font.Bold = True
            End With
     
            With xlSheet.Cells(5, J + 1)
                .Interior.ColorIndex = 15
                .Interior.Pattern = xlSolid
                .Borders(xlEdgeBottom).LineStyle = xlContinuous
                .Borders(xlEdgeBottom).Weight = xlThin
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlCenter
                .Font.Bold = True
            End With
     
            With xlSheet.Cells(5 + nbrtot, J + 1)
                .Interior.ColorIndex = 3
                .Interior.Pattern = xlSolid
                .Borders(xlEdgeBottom).LineStyle = xlContinuous
                .Borders(xlEdgeBottom).Weight = xlThin
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlCenter
                .Font.Bold = True
            End With
     
        Next J
     
        ' recopie des données à partir de la ligne 3
        I = 6
        Do While Not rec.EOF
            For J = 0 To rec.Fields.Count - 1
                ' .Fields(Index).Type renvoie le type du champ
                '   si c'est un Texte (dbText) nous insérons "'" pour
                '   qu'il soit reconnu par Excel comme du Texte
                If rec.Fields(J).Type = dbText Then
                    xlSheet.Cells(I, J + 1) = "'" & rec.Fields(J)
                Else
                    xlSheet.Cells(I, J + 1) = rec.Fields(J)
                End If
            Next J
            I = I + 1
            rec.MoveNext
        Loop
     
        xlSheet.Columns.AutoFit
     
        'définition du chemin d'exportation
        Dim Chemin As String
        If Right(Me.cheminaccessexporttransfertpoly, 1) = "\" Then
        Chemin = Me.cheminaccessexporttransfertpoly & Me.nomexporttransfertpoly
        Else
        If Right(Me.cheminaccessexporttransfertpoly, 1) <> "\" Then
        Chemin = Me.cheminaccessexporttransfertpoly & "\" & Me.nomexporttransfertpoly
        End If
        End If
        ' code de fermeture et libération des objets
        xlBook.SaveAs Chemin
        xlApp.Quit
        rec.Close
        Set rec = Nothing
        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
     
        t1 = Timer
        Debug.Print I & " enregistrements", Format(t1 - t0, "0") & " secondes"
     
        MsgBox "Exportation réalisée sur " & Chemin, vbInformation, "Exportation"
        Else
        If DCount("*", "T transfertpoly3_Analyse croisée") = 0 Then
        MsgBox "Il n'y a pas d'enregistrements pour la période choisie", vbExclamation, "Attention"
        End If
        End If
        End If
        End If
        End If
        End Sub
    Cordialement,

  10. #10
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Normal, il faut que tu reprennes l'objet à chaque fois...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorkBooks().WorkSheets().Range()
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlSheet.Name = "Transfert polyvalence"
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlBook.Worksheets(index).Name = "Transfert polyvalence"
    ou alors + simplement, redéfini tes Set varObj en conséquence.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  11. #11
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Normal, il faut que tu reprennes l'objet à chaque fois...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorkBooks().WorkSheets().Range()
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlSheet.Name = "Transfert polyvalence"
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlBook.Worksheets(index).Name = "Transfert polyvalence"
    ou alors + simplement, redéfini tes Set varObj en conséquence.

    Et comme le dit Kloun, tu dois redéclarer les constantes localement...
    F2 dans Excel VBE pour les obtenir.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Merci Argy !

    Peux tu m'apporter plus d'informations concernant Set varObj ?

    Pour ta première astuce, j'essaye de modifier un à un toute les lignes contenant xlsheet et je te dis si celà fonctionne.

    Merci d'avance,

    Cordialement,

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Voilà le résultat.

    J'ai modifier tous les :

    xlsheet en xlbook.worksheets(Index) et j'ai ce message d'erreur:

    --------------------------------------
    Erreur d'execution'9':
    L'indice n'appartient pas à la selection
    --------------------------------------

    Le code s'arrête à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlBook.Worksheets(Index).Name = "Transfert polyvalence"

    Voici le 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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    Private Sub Commande63_Click()
    If IsNull(Me.cheminaccessexporttransfertpoly) Then
    MsgBox "Veuillez indiquer un chemin pour l'exportation", vbExclamation, "ORAGE"
    DoCmd.CancelEvent
    Else
    If IsNull(Me.nomexporttransfertpoly) Or Me.nomexporttransfertpoly = "" Then
    MsgBox "Veuillez indiquer un nom de fichier", vbExclamation, "ORAGE"
    DoCmd.CancelEvent
    Else
    If IsNull(Me.debutperiode) Or IsNull(Me.finperiode) Then
    MsgBox "Veuillez indiquer une date de début et une date de fin", vbInformation, "ORAGE"
    Else
    DoCmd.RunMacro "M transfertpoly"
    If DCount("*", "T transfertpoly3_Analyse croisée") > 0 Then
     
        Dim xlApp As Object
        Dim xlSheet As Object
        Dim xlBook As Object
     
        Dim I As Long, J As Long
        Dim t0 As Long, t1 As Long
     
        t0 = Timer
        Dim rec As Recordset
        Dim nbrtot As String
        'Compte le nombre d'enregistrement
        nbrtot = DCount("*", "T transfertpoly3_Analyse croisée")
     
        Set rec = CurrentDb.OpenRecordset("T transfertpoly3_Analyse croisée", dbOpenSnapshot)
     
        'Initialisations
        Set xlApp = CreateObject("Excel.Application")
        Set xlBook = xlApp.Workbooks.Add
     
        'Ajouter une feuille de calcul
        Set xlSheet = xlBook.Worksheets.Add
        xlBook.Worksheets(Index).Name = "Transfert polyvalence"
     
        ' le titre
        '  écriture dans la cellule de ligne 1 et de colonne 1
        xlBook.Worksheets(Index).Cells(2, 1) = "Métier " & Forms![F menu].Form![metieractif]
        xlBook.Worksheets(Index).Cells(3, 1) = "TRANSFERT POLYVALENCE DU " & Forms![F MENUTRANSFERT].Form![debutperiode] & " au " & Forms![F MENUTRANSFERT].Form![finperiode]
     
        ' les entetes
        '  .Fields(Index).Name renvoie le nom du champ
        For J = 0 To rec.Fields.Count - 1
            xlBook.Worksheets(Index).Cells(5, J + 1) = rec.Fields(J).Name
            ' Nous appliquons des enrichissements de format aux cellules
             With xlBook.Worksheets(Index).Cells(2, J + 1)
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlLeft
                .Font.Bold = True
            End With
     
            With xlBook.Worksheets(Index).Cells(5, J + 1)
                .Interior.ColorIndex = 15
                .Interior.Pattern = xlSolid
                .Borders(xlEdgeBottom).LineStyle = xlContinuous
                .Borders(xlEdgeBottom).Weight = xlThin
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlCenter
                .Font.Bold = True
            End With
     
            With xlBook.Worksheets(Index).Cells(5 + nbrtot, J + 1)
                .Interior.ColorIndex = 3
                .Interior.Pattern = xlSolid
                .Borders(xlEdgeBottom).LineStyle = xlContinuous
                .Borders(xlEdgeBottom).Weight = xlThin
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlCenter
                .Font.Bold = True
            End With
     
        Next J
     
        ' recopie des données à partir de la ligne 3
        I = 6
        Do While Not rec.EOF
            For J = 0 To rec.Fields.Count - 1
                ' .Fields(Index).Type renvoie le type du champ
                '   si c'est un Texte (dbText) nous insérons "'" pour
                '   qu'il soit reconnu par Excel comme du Texte
                If rec.Fields(J).Type = dbText Then
                    xlBook.Worksheets(Index).Cells(I, J + 1) = "'" & rec.Fields(J)
                Else
                    xlBook.Worksheets(Index).Cells(I, J + 1) = rec.Fields(J)
                End If
            Next J
            I = I + 1
            rec.MoveNext
        Loop
     
        xlBook.Worksheets(Index).Columns.AutoFit
     
        'définition du chemin d'exportation
        Dim Chemin As String
        If Right(Me.cheminaccessexporttransfertpoly, 1) = "\" Then
        Chemin = Me.cheminaccessexporttransfertpoly & Me.nomexporttransfertpoly
        Else
        If Right(Me.cheminaccessexporttransfertpoly, 1) <> "\" Then
        Chemin = Me.cheminaccessexporttransfertpoly & "\" & Me.nomexporttransfertpoly
        End If
        End If
        ' code de fermeture et libération des objets
        xlBook.SaveAs Chemin
        xlApp.Quit
        rec.Close
        Set rec = Nothing
        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
     
        t1 = Timer
        Debug.Print I & " enregistrements", Format(t1 - t0, "0") & " secondes"
     
        MsgBox "Exportation réalisée sur " & Chemin, vbInformation, "Exportation"
        Else
        If DCount("*", "T transfertpoly3_Analyse croisée") = 0 Then
        MsgBox "Il n'y a pas d'enregistrements pour la période choisie", vbExclamation, "Attention"
        End If
        End If
        End If
        End If
        End If
        End Sub
    En espérant trouver le problème.

    Cordialement,

  14. #14
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut Exporter vers Excel sans référence Excel
    Bonjour,

    J'ai déjà abordé ce problème dans un topic mais craignant qu'il soit écrasé par d'autre topic je préfère en reparler. J'aimerais exporter vers excel sans utiliser de référence Excel car le problème avec cette dernière est que le n° de version change selon la version d'access.

    voici le code que j'utilise:

    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    Private Sub Commande73_Click()
    If IsNull(Me.cheminaccessexporttransfertpoly) Then
    MsgBox "Veuillez indiquer un chemin pour l'exportation", vbExclamation, "Attention"
    DoCmd.CancelEvent
    Else
    If IsNull(Me.nomexporttransfertmetier) Or Me.nomexporttransfertmetier = "" Then
    MsgBox "Veuillez indiquer un nom de fichier", vbExclamation, "Attention"
    DoCmd.CancelEvent
    Else
    If IsNull(Me.debutperiode) Or IsNull(Me.finperiode) Then
    MsgBox "Veuillez indiquer une date de début et une date de fin", vbInformation, "Attention"
    Else
    DoCmd.RunMacro "M transfertmetier"
    If DCount("*", "T_transfertmetier_Analyse croisée") > 0 Then
     
        Dim xlApp As Object
        Dim xlSheet As Object
        Dim xlBook As Object
        Dim I As Long, J As Long
        Dim t0 As Long, t1 As Long
     
        t0 = Timer
        Dim rec As Recordset
        Dim nbrtot As String
        'Compte le nombre d'enregistrement
        nbrtot = DCount("*", "T_transfertmetier_Analyse croisée")
     
        Set rec = CurrentDb.OpenRecordset("T_transfertmetier_Analyse croisée", dbOpenSnapshot)
     
        'Initialisations
        Set xlApp = CreateObject("Excel.Application")
        Set xlBook = xlApp.Workbooks.Add
     
        'Ajouter une feuille de calcul
        Set xlSheet = xlBook.Worksheets.Add
        xlBook.Worksheets(Index).Name = "Transfert polyvalence"
     
        ' le titre
        '  écriture dans la cellule de ligne 1 et de colonne 1
        xlSheet.Cells(2, 1) = "Métier " & Forms![F menu].Form![metieractif]
        xlSheet.Cells(3, 1) = "TRANSFERT METIERS DU " & Forms![F MENUTRANSFERT].Form![debutperiode] & " au " & Forms![F MENUTRANSFERT].Form![finperiode]
     
        ' les entetes
        '  .Fields(Index).Name renvoie le nom du champ
        For J = 0 To rec.Fields.Count - 1
            xlSheet.Cells(5, J + 1) = rec.Fields(J).Name
            ' Nous appliquons des enrichissements de format aux cellules
             With xlSheet.Cells(2, J + 1)
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlLeft
                .Font.Bold = True
            End With
     
            With xlSheet.Cells(5, J + 1)
                .Interior.ColorIndex = 15
                .Interior.Pattern = xlSolid
                .Borders(xlEdgeBottom).LineStyle = xlContinuous
                .Borders(xlEdgeBottom).Weight = xlThin
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlCenter
                .Font.Bold = True
            End With
     
            With xlSheet.Cells(5 + nbrtot, J + 1)
                .Interior.ColorIndex = 3
                .Interior.Pattern = xlSolid
                .Borders(xlEdgeBottom).LineStyle = xlContinuous
                .Borders(xlEdgeBottom).Weight = xlThin
                .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
                .HorizontalAlignment = xlCenter
                .Font.Bold = True
            End With
     
        Next J
     
        ' recopie des données à partir de la ligne 3
        I = 6
        Do While Not rec.EOF
            For J = 0 To rec.Fields.Count - 1
                ' .Fields(Index).Type renvoie le type du champ
                '   si c'est un Texte (dbText) nous insérons "'" pour
                '   qu'il soit reconnu par Excel comme du Texte
                If rec.Fields(J).Type = dbText Then
                    xlSheet.Cells(I, J + 1) = "'" & rec.Fields(J)
                Else
                    xlSheet.Cells(I, J + 1) = rec.Fields(J)
                End If
            Next J
            I = I + 1
            rec.MoveNext
        Loop
     
        xlSheet.Columns.AutoFit
     
        'définition du chemin d'exportation
        Dim Chemin As String
        If Right(Me.cheminaccessexporttransfertpoly, 1) = "\" Then
        Chemin = Me.cheminaccessexporttransfertpoly & Me.nomexporttransfertmetier
        Else
        If Right(Me.cheminaccessexporttransfertpoly, 1) <> "\" Then
        Chemin = Me.cheminaccessexporttransfertpoly & "\" & Me.nomexporttransfertmetier
        End If
        End If
        ' code de fermeture et libération des objets
        xlBook.SaveAs Chemin
        xlApp.Quit
        rec.Close
        Set rec = Nothing
        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
     
        t1 = Timer
        Debug.Print I & " enregistrements", Format(t1 - t0, "0") & " secondes"
     
        MsgBox "Exportation réalisée sur " & Chemin, vbInformation, "Exportation"
        Else
        If DCount("*", "T_transfertmetier_Analyse croisée") = 0 Then
        MsgBox "Il n'y a pas d'enregistrements pour la période choisie", vbExclamation, "Attention"
        End If
        End If
        End If
        End If
        End If
        End Sub
    Si on travaille avec un .mde qui provient d'un Access 2003 (version de la référence Excel --> Excel 11 Object Library) et que l'on veut l'utiliser sur un poste ayant Access 2002, une erreur se produit car la référence est considérée comme manquante (alors qu'elle est tout simplement inférieure à la référence présente dans la .mde).

    Ma question est la suivant, quelles modifications dois je mettre en place pour me passer des références Excel ?

    Cordialement,

  15. #15
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    je pense que comme l'ont dit Koun et Argyronet il faut redéclarer les constantes Excel (xlAutomatic, xlLeft, xlContinuous, ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Const xlAutomatic As Long = -4105
        Const xlLeft As Long = -4131
        Const xlSolid = 1
        Const xlContinuous = 1
        Const xlThin = 2
        Const xlCenter As Long = -4108
        Const xlEdgeBottom = 9
    Sinon lorsque tu enlèves la référence à Excel vba les interprète comme des variables (type Variant à priori)

    D'ailleurs je te conseille de mettre l'option Explicit en début de module de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Compare Database
    Option Explicit
    Le compilateur pointera les variables non déclarées.

    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlBook.Worksheets(Index).Name = "Transfert polyvalence"
    ne peut pas fonctionner puisque Index n'est déclaré nulle part et qu'aucune valeur ne lui est affectée.

    Remets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlSheet.Name = "Transfert polyvalence"
    Bon courage

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    LedZeppII !! Super mes exports fonctionnent sur Access 2003 sans avoir coché la référence Excel.

    Je dois désormais testé sur Access 2000 et 2002.

    Il suffisait uniquement d'ajouter les constantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Const xlAutomatic As Long = -4105
        Const xlLeft As Long = -4131
        Const xlSolid = 1
        Const xlContinuous = 1
        Const xlThin = 2
        Const xlCenter As Long = -4108
        Const xlEdgeBottom = 9
    J'ai conservé mon code d'origine en modifiant uniquement ces lignes (sur les conseils de Argy):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Dim xlApp As Excel.Application
        Dim xlSheet As Excel.Worksheet
        Dim xlBook As Excel.Workbook
    Merci à Argy,Kloun et LedzeppII pour votre aide.

    Cordialement,

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

Discussions similaires

  1. [VBA] Ajouter dynamiquement une référence
    Par jpharand dans le forum VBA Access
    Réponses: 23
    Dernier message: 16/04/2010, 23h28
  2. changer automatiquement les parametres d'une méthode
    Par wariom dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/05/2009, 09h45
  3. Incrémenter automatiquement une référence
    Par gbrion dans le forum WinDev
    Réponses: 19
    Dernier message: 04/06/2007, 18h30
  4. Réponses: 3
    Dernier message: 04/05/2007, 14h11
  5. [VBA-Version]Probleme avec références VB
    Par macgiver dans le forum VBA Access
    Réponses: 3
    Dernier message: 31/03/2007, 00h19

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