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 :

Lancer une macro excel à partir d'access


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut Lancer une macro excel à partir d'access
    Bonjour,

    Voilà mon petit soucis:

    A partir d'Access, je crée un fichier Excel

    avec ce 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
    Private Sub Commande2_Click()
     
    Dim xlApp As New Excel.Application
    Dim xlBook As Workbook
    Dim NomFichier As String
     
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set xlBook = xlApp.Workbooks.Add
     
    NomFichier = "c:\QUERYu.xls"
    xlBook.SaveAs NomFichier 
    xlBook.Close
    xlApp.Quit
     
    Set xlBook = Nothing 
    Set xlApp = Nothing
     
    End Sub
    J'aimerai bien lorsque ce fichier Excel se crée, exécuter une macro Excel qui ressemble à: (je l'ai faite avec l'enregistreur de macro pour avoir 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
    Sub Macro1()
    '
    ' Macro1 Macro
    ' Macro enregistrée le 02/08/2011 par Air France
    '
     
    '
        With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
            "ODBC;DSN=MS Access Database;DBQ=D:\Documents and Settings\2594215\Bureau\William AF\test william\TESTen coursMennecyAmeliore 02_08.m" _
            ), Array( _
            "db;DefaultDir=D:\Documents and Settings\2594215\Bureau\William AF\test william;DriverId=25;FIL=MS Access;MaxBufferSize=2048;Pag" _
            ), Array("eTimeout=5;")), Destination:=Range("B6"))
            .CommandText = Array( _
            "SELECT `R_Tableau 1S`.Expr1, `R_Tableau 1S`.Horaire1, `R_Tableau 1S`.`02/01/2012`, `R_Tableau 1S`.`03/01/2012`, `R_Tableau 1S`.`04/01/2012`, `R_Tableau 1S`.`05/01/2012`, `R_Tableau 1S`.`06/01/2012`, `" _
            , _
            "R_Tableau 1S`.`07/01/2012`, `R_Tableau 1S`.`08/01/2012`, `R_Tableau 1S`.`09/01/2012`, `R_Tableau 1S`.`10/01/2012`, `R_Tableau 1S`.`11/01/2012`, `R_Tableau 1S`.`12/01/2012`, `R_Tableau 1S`.`13/01/2012`" _
            , _
            ", `R_Tableau 1S`.`14/01/2012`, `R_Tableau 1S`.`15/01/2012`, `R_Tableau 1S`.`16/01/2012`, `R_Tableau 1S`.`17/01/2012`, `R_Tableau 1S`.`18/01/2012`, `R_Tableau 1S`.`19/01/2012`, `R_Tableau 1S`.`20/01/20" _
            , _
            "12`, `R_Tableau 1S`.`21/01/2012`, `R_Tableau 1S`.`22/01/2012`, `R_Tableau 1S`.`23/01/2012`, `R_Tableau 1S`.`24/01/2012`, `R_Tableau 1S`.`25/01/2012`, `R_Tableau 1S`.`26/01/2012`, `R_Tableau 1S`.`27/01" _
            ,,,,,,,,,,,,,,,,,,,,,,,)
            .Name = "Lancer la requête à partir de MS Access Database"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = True
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .Refresh BackgroundQuery:=False
        End With
    End Sub
    ESt possible de gerer tout ça grace au VBA Access et comment ?

  2. #2
    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 768
    Points
    7 768
    Par défaut
    Bonjour,

    Voici un exemple
    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
    Dim xlApp As New Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlQryTbl As Excel.QueryTable
    Dim NomFichier As String
    Dim sODBCconn As String, sSQL As String
     
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set xlBook = xlApp.Workbooks.Add
     
    ' Chaîne de connexion ODBC
    sODBCconn = "ODBC;DSN=MS Access Database;" & _
                "DBQ=E:\Mes Documents\Access\Comptoir.mdb"
    ' Code SQL de la requête
    sSQL = "SELECT DISTINCTROW Commandes.Destinataire, Commandes.[Adresse livraison], " & _
                "Commandes.[Ville livraison], Commandes.[Région livraison], Commandes.[Code postal livraison], " & _
                "Commandes.[Pays livraison], Commandes.[Code client], Clients.Société, Clients.Adresse, " & _
                "Clients.Ville, Clients.Région, Clients.[Code postal], Clients.Pays, " & _
                "[Prénom] & ' ' & [Nom] AS Vendeur, Commandes.[N° commande], Commandes.[Date commande], " & _
                "Commandes.[À livrer avant], Commandes.[Date envoi], Messagers.[Nom du messager], " & _
                "[Détails commandes].[Réf produit], Produits.[Nom du produit], " & _
                "[Détails commandes].[Prix unitaire], [Détails commandes].Quantité, " & _
                "[Détails commandes].[Remise (%)], " & _
                "CCur([Détails commandes].[Prix unitaire]*[Quantité]*(1-[Remise (%)])/100)*100 AS PrixTotal, " & _
                "Commandes.Port" & vbCrLf & _
           "FROM Produits INNER JOIN (Messagers INNER JOIN " & _
                "(Employés INNER JOIN ((Clients INNER JOIN Commandes ON " & _
                "Clients.[Code client] = Commandes.[Code client]) INNER JOIN " & _
                "[Détails commandes] ON Commandes.[N° commande] = [Détails commandes].[N° commande]) " & _
                "ON Employés.[N° employé] = Commandes.[N° employé]) " & _
                "ON Messagers.[N° messager] = Commandes.[N° messager]) " & _
                "ON Produits.[Réf produit] = [Détails commandes].[Réf produit];"
    ' Création requête Excel
    Set xlQryTbl = xlBook.ActiveSheet.QueryTables.Add(sODBCconn, xlBook.ActiveSheet.Range("B6"))
    ' Paramétrage requête Excel
    With xlQryTbl
        .CommandText = sSQL
        .Name = "Requête Comptoir.mdb"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = True
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
    End With
    ' Exécute requête
    xlQryTbl.Refresh False
     
     
    NomFichier = "C:\QUERYu.xls"
    xlBook.SaveAs NomFichier
     
    Set xlQryTbl = Nothing
    xlBook.Close
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing
    Ligne 13 : il te faut mettre le chemin complet vers ta base de données
    Ligne 15 : il te faut mettre le code SQL de ta requête
    Ligne 38 : change le nom de la requête Excel

    A+

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Je te propose une solution alternative.

    1 - Tout d'abord tu crées un fichier "Modèle.xls" qui contient ta macro nommée "Public Sub DO_IT" dans un module.

    2 - Dans mon exemple, le modèle est placé dans le répertoire "P:\", le fichier nouveau fichier est également créé dans le répertoire "P:\".

    Dans Access le code devient donc :

    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
     
    Private Sub Commande2_Click()
    Dim xlApp As New Excel.Application
    Dim xlBook As Workbook
    Dim NomFichier As String
     
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    xlApp.Workbooks.Open ("P:\Modele.xls")
    Set xlBook = xlApp.ActiveWorkbook
    NomFichier = "P:\QUERYu.xls"
    xlBook.SaveAs NomFichier
    xlApp.Run "QUERYu.xlsm!Do_It"
    xlBook.Close SaveChanges:=True
    xlApp.Quit
     
    Set xlBook = Nothing
    Set xlApp = Nothing
     
    End Sub
    Pour info, j'ai fiat un test concluant avec Access & Excel 2007, mais il n'y a pas de raison pour que cela ne fonctionne pas en Office 2002.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    Merci pour vos réponses,

    LedzeppII, voilà comment j'ai adapté ton 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
    Dim xlApp As New Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlQryTbl As Excel.QueryTable
    Dim NomFichier As String
    Dim sODBCconn As String, sSQL As String
     
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set xlBook = xlApp.Workbooks.Add
     
    ' Chaîne de connexion ODBC
    sODBCconn = "ODBC;DSN=MS Access Database;" & _
                "DBQ=d:\Documents and Settings\2594215\Bureau\William AF\test william\TESTen coursMennecyAmeliore 02_08.mdb"
    ' Code SQL de la requête
    sSQL = "SELECT * FROM [R_QueryTableaupresent 1S] ORDER BY IIf([R_QueryTableaupresent 1S].[Expr1]=""MAN"",1,IIf([R_QueryTableaupresent 1S].[Expr1]=""TECH"",2,3)), IIf([R_QueryTableaupresent 1S].[Horaire1]=""M"",1,IIf([R_QueryTableaupresent 1S].[Horaire1]=""S"",2,3));"
     
     
     
     
    ' Création requête Excel
    Set xlQryTbl = xlBook.ActiveSheet.QueryTables.Add(sODBCconn, xlBook.ActiveSheet.Range("B6"))
    ' Paramétrage requête Excel
    With xlQryTbl
        .CommandText = sSQL
        .Name = "R_Tableau 1S.mdb"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = True
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
    End With
    ' Exécute requête
    xlQryTbl.Refresh False
     
     
    NomFichier = "C:\QUERYuu.xls"
    xlBook.SaveAs NomFichier
     
    Set xlQryTbl = Nothing
    xlBook.Close
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing
    Le Excel se crée mais ne se rempli pas. Le problème est qu'il m'affiche une erreur sur la ligne:
    Dans Access ça m'affiche: Erreur execution 1004, erreur général ODBC
    Tu sais pourquoi ?

    Dave92, ton code marcehe bien puisqu'il me crée un fichier excel avec ma requete. Par contre dans Access il m'affiche en erreur sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlApp.Run "QUERYu.xlsm!Do_It"
    Peut être l'extension .xlsm ne marche pas avec excel 2003?


    Je pense que vous pouvez p-t aussi m'aider sur une chose (je profite de votre compétence, je vous remercie d'ailleurs)
    Dans l'idéal (je ne sais pas si c'est possible) j'ai crée un formulaire avec un champ "Num Année". Une fois que l'utilisateur rentre le numero de l'année avec le format 00, j'aimerai en cliquant sur le bouton, creer le fichier excel avec comme nom: Query + le numéro de l'année que l'utilisateur a entré dans le formulaire. Tout ça en conservant ensuite la procédure de la macro que vous m'avez expliqué plus haut. Est possible en VBA?


    Merci pour votre aide

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 40
    Points
    40
    Par défaut
    J'ai effectivement fait mon test avec office 2007. l'extenstion xlsm n'est pas compatible avec office 2003.

    Dans mon code remplace les extentions xlsm par xls et ca devrait passer.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    Ca marche mais ça génère toujours des erreurs sur la même ligne :/

    LedzeppII si jamais tu as la solution au message d'erreur qui s'affiche lorsque j'exécute ton code ça me sauverai je pense. (je suis en Access 2003)

    Merci

  7. #7
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 40
    Points
    40
    Par défaut
    tu as bien remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlApp.Run "QUERYu.xlsm!Do_It"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlApp.Run "QUERYu.xls!Do_It"
    ?

    le nom de la macro dans le fichier modèle est bien "DO_IT" ?

  8. #8
    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 768
    Points
    7 768
    Par défaut
    Bonjour,

    Apparemment ça vient de la requête, à cause des " dans les IIF.
    Essaie en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSQL = "SELECT * FROM [R_QueryTableaupresent 1S] ORDER BY IIf([R_QueryTableaupresent 1S].[Expr1]=""MAN"",1,IIf([R_QueryTableaupresent 1S].[Expr1]=""TECH"",2,3)), IIf([R_QueryTableaupresent 1S].[Horaire1]=""M"",1,IIf([R_QueryTableaupresent 1S].[Horaire1]=""S"",2,3));"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSQL = "SELECT * FROM [R_QueryTableaupresent 1S] ORDER BY IIf([R_QueryTableaupresent 1S].[Expr1]='MAN',1,IIf([R_QueryTableaupresent 1S].[Expr1]='TECH',2,3)), IIf([R_QueryTableaupresent 1S].[Horaire1]='M',1,IIf([R_QueryTableaupresent 1S].[Horaire1]='S',2,3));"
    Chez moi ça solutionne l'erreur ODBC.

    A+

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    Merci c'est parfait
    J'ai même réussi à intégré mon problème de variable dans le titre de mon fichier excel

    Merci
    Will

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    Petite question:

    Est il possible de créer le Excel non pas avec une exportation de requête mais avec deux?

    La première se trouvant à la cellule B6 et l'autre à la cellule B24 par exemple?
    Comment dois je m'y prendre?

    Dans mon cas je voudrai donc rajouter la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM [R_QueryTableaupresent 2S]
    ORDER BY IIf([R_QueryTableaupresent 2S].[Expr1]="MAN",1,IIf([R_QueryTableaupresent 2S].[Expr1]="TECH",2,3)), IIf([R_QueryTableaupresent 2S].[Horaire1]="M",1,IIf([R_QueryTableaupresent 2S].[Horaire1]="S",2,3));
    et quelle se trouve à la cellule B24

  11. #11
    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 768
    Points
    7 768
    Par défaut
    Citation Envoyé par Williamm Voir le message
    Petite question:
    Est il possible de créer le Excel non pas avec une exportation de requête mais avec deux?
    Oui, c'est possible.
    Il suffit de répéter la séquence
    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
    ' Code SQL de la requête
    sSQL = "SELECT * FROM ... ;"
     
    ' Création requête Excel
    Set xlQryTbl = xlBook.ActiveSheet.QueryTables.Add(sODBCconn, xlBook.ActiveSheet.Range("B6"))
    ' Paramétrage requête Excel
    With xlQryTbl
        .CommandText = sSQL
        .Name = "R_Tableau 1S.mdb"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = True
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
    End With
    ' Exécute requête
    xlQryTbl.Refresh False
    en changeant ....
    • xlBook.ActiveSheet.Range("B6") par xlBook.ActiveSheet.Range("B24") dans la ligne où on crée la requête (ici 5)
    • le nom de la requête excel (ligne 9)

    Par contre je ne sais pas ce qui se passe si la première requête atteint ou dépasse la ligne 24.

    A+

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    Je te remercie c'est parfait,

    J'ai une autre petite question:

    J'ai un fichier Excel existant qui contient 2 feuilles.
    La première feuille contient une requête Access importée nommé "Tableau1" qui représente un tableau de valeur d'un semestre et la deuxième feuille contient une requête Access importée nommé "Tableau2" qui représente un tableau de valeur du semestre suivant..

    J'aimerai en fait que lorsqu'on passe d'un semestre S(i-1) à un semestre S(i)
    on puisse figer les valeur du tableau S(i-1) et créer ensuite une 3eme feuille contenant le semestre S(i+1)

    La requête "Tableau1" contiendra tjrs les valeurs du 1er semestre de l'année et la requête "Tableau2" les valeurs du 2eme semestre de l'année.

    Exemple:
    Mon fichier contient à la base un onglet "S1 2012" et un onglet "S2 2012"
    Quand on passe de "S1 2012" au "S2 2012" (dans la réalité) j'aimerai figer les valeurs "S1 2012" et créer un 3ème onglet nommé "S1 2013" contenant la requête qui servait au préalable à l'onglet "S1 2012"

    Pour cela j'ai crée un formulaire avec un champ "Année" qui devra rentrer dans une variable pour pouvoir donner le nom de la feuille créée en fonction de l'année saisie. Je pense aussi qu'il faudra deux boutons: un qui permettra de créer l'onglet 1er Semestre avec la requete "Tableau1" et l'autre l'onglet 2eme semestre avec la requête "Tableau2".

    Par contre, ej ne m'y connais pas assez en VBA pour programmer la fixation des valeurs de S(i-1) et la création d'onglet à chaque clique de bouton contenant la requête appropriée et le nom de la feuille en fonction de l'année saisie dans le formulaire.

    J'espere avoir été assez clair. Si c'est pas le cas n'hésitez pas à me le dire.
    Merci de votre aide,
    Will

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    J'ai essayé de cette manière mais j'ai un problème.
    Quand je veux ajouter une feuille dont je sais qu'elle n'existe pas, il me dit qu'elle existe quand même alors qu'il devrait sortir de la boucle pour me la créer :s

    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
    Private Sub Commande5_Click()
     
        Dim xlQryTbl As Excel.QueryTable
        Dim sODBCconn As String, sSQL As String
        Dim xl As Excel.Application
        Dim wbk As Excel.Workbook
        Dim Annee As Variant
        Dim NomFichier As Variant
        Annee = Me![Num Année]
        NomFichier = "2onglets.xls"
     
        ' Démarrer Excel et le rendre visible
     
        Set xl = CreateObject("Excel.Application")
        xl.Workbooks.Open ("C:\" & NomFichier)
        xl.Visible = True
        On Error Resume Next
        xl.UserControl = True
        xl.Close
     
        ' Créer un classeur pour le test
        Set wbk = xl.Worksheet.Add()
     
        ' Test de l'existence d'une feuille
        If FeuilleExiste(wbk, "S1 " & Annee & " ") Then
           MsgBox "La feuille S1 " & Annee & "   existe deja.", vbInformation
     
        'Fermer le classeur sans l'enregistrer
        wbk.Close False
        Set wbk = Nothing
     
        ' Quitter Excel
        xl.Quit
        Set xl = Nothing
     
        Else
           ActiveSheet.Name = "S1 " & Annee & " "
     
     
    ' Chaîne de connexion ODBC
    sODBCconn = "ODBC;DSN=MS Access Database;" & _
                "DBQ=d:\Documents and Settings\2594215\Bureau\William AF\test william\TESTen coursMennecyAmeliore 03_08.mdb"
    ' Code SQL de la requête
    sSQL = "SELECT * FROM [R_QueryTableaupresent 1S] ORDER BY IIf([R_QueryTableaupresent 1S].[Expr1]='MAN',1,IIf([R_QueryTableaupresent 1S].[Expr1]='TECH',2,3)), IIf([R_QueryTableaupresent 1S].[Horaire1]='M',1,IIf([R_QueryTableaupresent 1S].[Horaire1]='S',2,3));"
     
     
     
     
    ' Création requête Excel
    Set xlQryTbl = wbk.ActiveSheet.QueryTables.Add(sODBCconn, wbk.ActiveSheet.Range("B6"))
     'Paramétrage requête Excel
    With xlQryTbl
        .CommandText = sSQL
        .Name = "R_Tableau 1S.mdb"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = True
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
    End With
    ' Exécute requête
    xlQryTbl.Refresh False
     
    NomFichier = "C:\" & NomFichier
    wbk.SaveAs NomFichier
     
    Set xlQryTbl = Nothing
    wbk.Close
    Set wbk = Nothing
    xl.Quit
    Set xl = Nothing
     
        End If
     
    End Sub
    Vous savez pourquoi ?

  14. #14
    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 768
    Points
    7 768
    Par défaut
    Bonjour,

    J'ai fait quelques modifications dans ton 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
        Dim xlQryTbl As Excel.QueryTable
        Dim sODBCconn As String, sSQL As String
        Dim xl As Excel.Application
        Dim wbk As Excel.Workbook
        Dim xlSheet as Excel.WorkSheet
        Dim Annee As Variant
        Dim NomFichier As Variant
        Annee = Me![Num Année]
        NomFichier = "2onglets.xls"
     
        ' Démarrer Excel et le rendre visible
     
        Set xl = CreateObject("Excel.Application")
        Set wbk = xl.Workbooks.Open("C:\" & NomFichier)
        xl.Visible = True
        'On Error Resume Next
        xl.UserControl = True
     
        ' Test de l'existence d'une feuille
        If FeuilleExiste(wbk, "S1 " & Annee & " ") Then
           MsgBox "La feuille S1 " & Annee & "   existe deja.", vbInformation
     
           'Fermer le classeur sans l'enregistrer
           wbk.Close False
           Set wbk = Nothing
     
           ' Quitter Excel
           xl.Quit
           Set xl = Nothing
     
        Else
           ' Créer une nouvelle feuille après la dernière feuille
           Set xlSheet = wbk.Worksheets.Add(After:=wbk.Worksheets(wbk.Worksheets.Count))
           xlSheet.Name = "S1 " & Annee & " "
           xlSheet.Activate
     
           ' Chaîne de connexion ODBC
           sODBCconn = "ODBC;DSN=MS Access Database;" & _
                       "DBQ=d:\Documents and Settings\2594215\Bureau\William AF\test william\TESTen coursMennecyAmeliore 03_08.mdb"
           ' Code SQL de la requête
           sSQL = "SELECT * FROM [R_QueryTableaupresent 1S] ORDER BY IIf([R_QueryTableaupresent 1S].[Expr1]='MAN',1,IIf([R_QueryTableaupresent 1S].[Expr1]='TECH',2,3)), IIf([R_QueryTableaupresent 1S].[Horaire1]='M',1,IIf([R_QueryTableaupresent 1S].[Horaire1]='S',2,3));"
     
           ' Création requête Excel
           Set xlQryTbl = wbk.ActiveSheet.QueryTables.Add(sODBCconn, wbk.ActiveSheet.Range("B6"))
           'Paramétrage requête Excel
           With xlQryTbl
               .CommandText = sSQL
               .Name = "R_Tableau 1S.mdb"
               .FieldNames = True
               .RowNumbers = False
               .FillAdjacentFormulas = False
               .PreserveFormatting = True
               .RefreshOnFileOpen = False
               .BackgroundQuery = True
               .RefreshStyle = xlInsertDeleteCells
               .SavePassword = True
               .SaveData = True
               .AdjustColumnWidth = True
               .RefreshPeriod = 0
               .PreserveColumnInfo = True
           End With
           ' Exécute requête
           xlQryTbl.Refresh False
     
           wbk.Save
     
           Set xlQryTbl = Nothing
           Set xlSheet = Nothing
           wbk.Close
           Set wbk = Nothing
           xl.Quit
           Set xl = Nothing
     
        End If
    J'ai ajouté une variable objet xlSheet de type Excel.WorkSheet, et déplacé la partie création d'une nouvelle feuille après le Else.

    A+

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    Merci ça marche niquel, tu me permets d'avancer dans mon projet c'est super.

    Il y a une chose délicate a laquelle je n'ai pas pensé.

    Ma requête que j'exécute (celle qui apparaît dans le Word) doit également changer en fonction de l'année que l'utilisateur saisie.
    Pour cela je dois au préalable exécuter 7 requêtes ajout pour mettre à jour ma requête que je veux obtenir sur le excel.

    J'ai pour cela enregistrer une macro sur Access. Comment dois je l'incorporer dans le VBA de mon bouton click ?

    Ou alors, faut t-il exécuter mes requêtes Ajout en les écrivants directement ds le VBA?

  16. #16
    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 768
    Points
    7 768
    Par défaut
    Citation Envoyé par Williamm Voir le message
    Ma requête que j'exécute (celle qui apparaît dans le Word) doit également changer en fonction de l'année que l'utilisateur saisie.
    Pour cela je dois au préalable exécuter 7 requêtes ajout pour mettre à jour ma requête que je veux obtenir sur le excel.

    J'ai pour cela enregistré une macro sur Access. Comment dois je l'incorporer dans le VBA de mon bouton click ?
    Tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunMacro "Nom de la macro"
    pour une macro Access (par opposition à macro VBA).

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    Merci !

    Un petit bug intervient une fois que la feuille excel se crée avec le tableau de ma requete: tout marche bien sur le excel mais le Access plante :s

    Je pense que c'est un problème dû a la sauvegarde du Excel avec la nouvelle feuille. car parfois il me demande si je veux sauvegarder le excel et apres ça plante.

    Il y a un moyen de régler la sauvegarde pour ne pas avoir de bug une fois que la feuille est crée?

    Je te montre le code pour que tu vois ou j'en suis:

    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
    Private Sub Commande5_Click()
     
        Dim xlQryTbl As Excel.QueryTable
        Dim sODBCconn As String, sSQL As String
        Dim xl As Excel.Application
        Dim wbk As Excel.Workbook
        Dim xlSheet As Excel.Worksheet
        Dim Annee As Variant
        Dim NomFichier As Variant
        Annee = Me![Num Année]
        NomFichier = "2onglets.xls"
     
        ' Demarre la requete ajout
     
        DoCmd.RunMacro "M3 Horrairemystere.Rempliossage horraire disvié"
     
     
        ' Démarrer Excel et le rendre visible
     
        Set xl = CreateObject("Excel.Application")
        Set wbk = xl.Workbooks.Open("C:\" & NomFichier)
        xl.Visible = True
        On Error Resume Next
        xl.UserControl = True
     
        ' Test de l'existence d'une feuille
        If FeuilleExiste(wbk, "S1 " & "." & Annee & " ") Then
           MsgBox "La feuille S1 " & "." & Annee & "    existe deja.", vbInformation
     
           'Fermer le classeur sans l'enregistrer
           wbk.Close False
           Set wbk = Nothing
     
           ' Quitter Excel
           xl.Quit
           Set xl = Nothing
     
        Else
           ' Créer une nouvelle feuille après la dernière feuille
           Set xlSheet = wbk.Worksheets.Add(After:=wbk.Worksheets(wbk.Worksheets.Count))
           xlSheet.Name = "S1 " & "." & Annee & " "
           xlSheet.Activate
     
           ' Chaîne de connexion ODBC
           sODBCconn = "ODBC;DSN=MS Access Database;" & _
                       "DBQ=d:\Documents and Settings\2594215\Bureau\William AF\test william\TESTen coursMennecyAmeliore 04_08.mdb"
           ' Code SQL de la requête
           sSQL = "SELECT * FROM [R_QueryTableaupresent 1S] ORDER BY IIf([R_QueryTableaupresent 1S].[Expr1]='MAN',1,IIf([R_QueryTableaupresent 1S].[Expr1]='TECH',2,3)), IIf([R_QueryTableaupresent 1S].[Horaire1]='M',1,IIf([R_QueryTableaupresent 1S].[Horaire1]='S',2,3));"
     
           ' Création requête Excel
           Set xlQryTbl = wbk.ActiveSheet.QueryTables.Add(sODBCconn, wbk.ActiveSheet.Range("B6"))
           'Paramétrage requête Excel
           With xlQryTbl
               .CommandText = sSQL
               .Name = "R_Tableau 1S.mdb"
               .FieldNames = True
               .RowNumbers = False
               .FillAdjacentFormulas = False
               .PreserveFormatting = True
               .RefreshOnFileOpen = False
               .BackgroundQuery = True
               .RefreshStyle = xlInsertDeleteCells
               .SavePassword = True
               .SaveData = True
               .AdjustColumnWidth = True
               .RefreshPeriod = 0
               .PreserveColumnInfo = True
           End With
           ' Exécute requête
           xlQryTbl.Refresh False
     
           wbk.Save
     
           Set xlQryTbl = Nothing
           Set xlSheet = Nothing
           wbk.Close
           Set wbk = Nothing
           xl.Quit
           Set xl = Nothing
     
        End If
     
    End Sub
    Tu vois ou se situe le problème?

  18. #18
    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 768
    Points
    7 768
    Par défaut
    Il faudrait mettre en commentaire la ligne
    pour savoir sur quelle ligne ça plante.

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    Alors meme si je le met en commentaire ca ne m'affiche pas d'erreur.
    Access plante sans laisser de message :s

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 99
    Points : 42
    Points
    42
    Par défaut
    En faisant une croix au moment d'enregistrer il ma mis une erreur sur:


Discussions similaires

  1. [AC-2007] Lancer une macro Excel TCD depuis Access
    Par Benoit973 dans le forum Access
    Réponses: 1
    Dernier message: 07/08/2013, 23h05
  2. [Toutes versions] Comment lancer une macro Excel/Access à partir d'un .exe?
    Par victorzecat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/07/2010, 21h35
  3. Lancer une Macro Excel à partir d'access
    Par ThieBEN dans le forum VBA Access
    Réponses: 8
    Dernier message: 12/12/2007, 14h21
  4. Lancer une macro Excel depuis Access
    Par marcobosio dans le forum Access
    Réponses: 6
    Dernier message: 05/06/2006, 20h51
  5. Lancer une macro PPT à partir d'Excel
    Par Rabah dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/10/2005, 17h23

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