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 :

Executer une requête en boucle en fonction d'un paramètre stocké dans une table


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Executer une requête en boucle en fonction d'un paramètre stocké dans une table
    Bonjour,


    Je dispose d'une base très simple contenant une table (T0) avec des zones et 2 tables liées à ces zones (T1 et T2) .
    Comment faire pour exporter un fichier Excel contenant les infos de T1 et T2 pour chacune des zones?

    J'avais pensé faire une boucle sur les zones:
    -exécutant une requête paramétrée en fonction du code de la zone de T0 sur T1
    -exportant le résultat vers Excel

    Mais je n'ai aucune notion de vb et je ne sais pas du tout comment m'y prendre.
    Si quelqu'un pouvait m'aider ou m'indiquer des documents susceptibles de m'éclairer sur la manipulation (création à partir du code sql, exécution) de requêtes et l'export de données vers Excel en vba

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    à priori, d'après ce que tu souhaites faire, tu n'as pas besoin de VBA pour exporter des données vers Excel.
    Il te suffit de créer une requète avec les champs dont tu as besoin, ensuite avec bouton de droite sur la requète, tu sélectionnes "Exporter", puis dans la fenêtre denregistrement, "Type de fichier". Tu peux ensuite créer une macro pour automatiser la manipulation (Action "TransférerFeuilleCalcul").
    Et si vraiment tu as besoin de VBA (pour automatiser une exportation plus complexe) tu peux rechercher dans le forum avec le mot clé "TransferSpreadsheet".
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour cette réponse concernant l'export mais comment faire une requête paramétrée avec pour paramètre un champ d'une autre table et ainsi faire un fichier par requête

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    peux-tu poster un exemple de tes données ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    En pièce jointe une version light de la base.
    Il s'agit de créer un fichier Excel par surface(SER) contenant les infos sur la surface par essence et le volume de bois
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    j'ai enlevé le paramètre dans la requête Req_Essence principale, j'ai créé un module qui contient un sub qui exporte tes données comme tu le souhaitais et un formulaire pour lancer le traitement.
    Je te reposte ta base modifiée.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour ton aide, le module que tu as écrit crée bien un export par SER.
    Par contre (mais je n'avais pas été clair dans mon explication), je souhaiterais avoir au final un fichier Excel par SER contenant les informations sur la SER (nom et code) puis les informations de surface par essence(résultant d'une 1ère requete), puis les informations de volume (résultant d'une seconde requête).

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Citation Envoyé par kugfounk Voir le message
    Merci beaucoup pour ton aide, le module que tu as écrit crée bien un export par SER.
    Par contre (mais je n'avais pas été clair dans mon explication), je souhaiterais avoir au final un fichier Excel par SER contenant les informations sur la SER (nom et code) puis les informations de surface par essence(résultant d'une 1ère requete), puis les informations de volume (résultant d'une seconde requête).
    Bonjour,
    tu souhaites donc la restitution des informations dans un même classeur et dans des feuilles séparées.
    Dans ce cas, c'est plus compliqué car l'exportation n'est pas multi-feuilles et oblige à ouvrir le classeur pour insérer les données complémentaires.
    Voici une proposition de nouveau code et avec les pré-requis suivants:
    ajouter la référence Microsoft Excel xx.0 Object Library (xx = version Excel utilisée) dans la base de données (Menu : Outils/ Références, cocher la référence citée)
    requête Req_Volume_Bois à créer (avec les informations dont tu as besoin)
    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
    Sub sExportExcel()
    Dim oRst As Recordset               ' Recordset principal
    Dim oRst2 As Recordset              ' Recordset secondaire
    Dim oQdftmp As QueryDef             ' Définition requête temporaire à exporter
    Dim stSql As String                 ' Texte Sql requète à exporter
    '
    Dim itCols As Integer               ' Compteur des colonnes
    Dim stPath As String                ' Emplacement des classeurs
    Dim stWkbkName As String            ' Nom du document à créer
    Dim oAppl As Excel.Application      ' Application Excel
    Dim oWkbk As Excel.Workbook         ' L'objet classeur à créer
    Dim oWSht As Excel.Worksheet        ' L'objet feuille à créer
     
        stPath = "D:\"
        Set oAppl = CreateObject("excel.application")
        Set oRst = CurrentDb.OpenRecordset("select * from Liste_SER order by code")
        oAppl.DisplayAlerts = False     ' désactivation des alertes
     
        While Not oRst.EOF
    'Exportation des information sur la SER
            ' nom du classeur à exporter
            stWkbkName = "Export_" & oRst.Fields(0) & ".xls"
            ' Constitution de la requète
            stSql = "select * from Liste_SER where code='" & oRst.Fields(0) & "';"
            ' Création de la requête
             Set oQdftmp = CurrentDb.CreateQueryDef("Export_" & oRst.Fields(0), stSql)
            ' Transfert vers Excel
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, oQdftmp.Name, stPath & stWkbkName, True
            ' suppression requête temporaire
            CurrentDb.QueryDefs.Delete "Export_" & oRst.Fields(0)
    ' -------------------------------------------------------------------------------------------------------
     
    ' Ajout des informations surface par essence
            ' ouverture du classeur en cours et création d'une nouvelle feuille
            Set oWkbk = oAppl.Workbooks.Open(stPath & stWkbkName)
            Set oWSht = oWkbk.Worksheets.Add
            oWSht.Name = "Surface par essence"      ' nom de la 1ère feuille à créer
     
            ' constitution de la source de données
            Set oRst2 = CurrentDb.OpenRecordset("select * from [Req_Essence principale]" & " where [Code SER]='" & oRst.Fields(0) & "' order by [ST (ha)];")
            ' ajout des noms de colonnes ligne 1
            If Not oRst2.EOF Then
                With oRst2
                    For itCols = 0 To .Fields.Count - 1
                        oWSht.Cells(1, itCols + 1).Value = .Fields(itCols).Name
                    Next
                'ajout des données
                    oWSht.Range("A2").CopyFromRecordset oRst2
     
                End With
            End If
     
            ' fermeture du recordset
            oRst2.Close
    ' -------------------------------------------------------------------------------------------------------
     
    ' Ajout des informations Volume bois
            ' création d'une nouvelle feuille
            Set oWSht = oWkbk.Worksheets.Add
            oWSht.Name = "Volume Bois"                  ' nom de la 2ème feuille à créer
     
            ' constitution de la source de données
            Set oRst2 = CurrentDb.OpenRecordset("select * from Req_Volume_Bois" & " where [Code SER]='" & oRst.Fields(0) & "';")
            ' ajout des noms de colonnes ligne 1
            If Not oRst2.EOF Then
                With oRst2
                    For itCols = 0 To .Fields.Count - 1
                        oWSht.Cells(1, itCols + 1).Value = .Fields(itCols).Name
                    Next
            ' ajout des données
                    oWSht.Range("A2").CopyFromRecordset oRst2
                End With
            End If
            ' réordonnancement des feuilles
            For itCols = 1 To 2
                oWkbk.Sheets(3).Select
                oWkbk.ActiveSheet.Move Before:=oWkbk.Sheets(itCols)
            Next itCols
            oWkbk.Sheets(1).Select
     
            ' fermeture du recordset
            oRst2.Close
            ' sauvegarde et fermeture du classeur
            oWkbk.Save
            oWkbk.Close
            oRst.MoveNext
     
        Wend
     
    ' Fermeture des objets
        oAppl.Quit
        oRst.Close
        Set oRst = Nothing
        Set oRst2 = Nothing
     
    End Sub
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour ces réponses et ces explications très claires.
    La génération des fichiers se fait sans soucis.

    J'abuse mais il y aurait 2 améliorations à apporter à mon projet:
    -Ajouter du texte à certains endroits des fichiers Excel afin de commenter les résultats des requetes
    -Utiliser un classeur Excel (avec mise en forme et commentaires) comme modèle pour les exports

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    Pour l'utilisation d'un classeur modèle, voici le code modifié qui utilise un classeur Export_Mod.xls avec les 3 onglets créés:
    - SER
    - Surface par essence
    - Volume Bois
    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
    Sub sExportExcel()
    Dim oRst As Recordset               ' Recordset principal
    Dim oRst2 As Recordset              ' Recordset secondaire
    '
    Dim itCols As Integer               ' Compteur des colonnes
    Dim stPath As String                ' Emplacement des classeurs
    Dim stWkbk_Mod As String            ' Nom du document modèle
    Dim stWkbkName As String            ' Nom du document à créer
    Dim oAppl As Excel.Application      ' Application Excel
    Dim oWkbk As Excel.Workbook         ' L'objet classeur à créer
    Dim oWSht As Excel.Worksheet        ' L'objet feuille
     
        Set oRst = CurrentDb.OpenRecordset("select * from Liste_SER order by code")
        Set oAppl = CreateObject("excel.application")
        oAppl.DisplayAlerts = False     ' désactivation des alertes Excel
        stPath = "D:\"
        stWkbk_Mod = "Export_Mod.xls"
     
        While Not oRst.EOF
    ' Ouverture du classeur modèle
            Set oWkbk = oAppl.Workbooks.Open(stPath & stWkbk_Mod)
    ' Exportation des information sur la SER
            Set oWSht = oWkbk.Sheets("SER")
            ' constitution de la source de données
            Set oRst2 = CurrentDb.OpenRecordset("select * from Liste_SER where code='" & oRst.Fields(0) & "';")
     
            ' ajout des noms de colonnes ligne 1
            If Not oRst2.EOF Then
                With oRst2
                    For itCols = 0 To .Fields.Count - 1
                        oWSht.Cells(1, itCols + 1).Value = .Fields(itCols).Name
                    Next
            ' ajout des données
                    oWSht.Range("A2").CopyFromRecordset oRst2
                End With
            End If
     
            ' fermeture du recordset
            oRst2.Close
    ' -------------------------------------------------------------------------------------------------------
     
    ' Ajout des informations surface par essence
            Set oWSht = oWkbk.Sheets("Surface par essence")
            ' constitution de la source de données
            Set oRst2 = CurrentDb.OpenRecordset("select * from [Req_Essence principale]" & " where [Code SER]='" & oRst.Fields(0) & "' order by [ST (ha)];")
     
            ' ajout des noms de colonnes ligne 1
            If Not oRst2.EOF Then
                With oRst2
                    For itCols = 0 To .Fields.Count - 1
                        oWSht.Cells(1, itCols + 1).Value = .Fields(itCols).Name
                    Next
             ' ajout des données
                    oWSht.Range("A2").CopyFromRecordset oRst2
                End With
            End If
     
            ' fermeture du recordset
            oRst2.Close
    ' -------------------------------------------------------------------------------------------------------
     
    ' Ajout des informations Volume bois
            Set oWSht = oWkbk.Sheets("Volume Bois")
            ' constitution de la source de données
            Set oRst2 = CurrentDb.OpenRecordset("select * from Req_Volume_Bois" & " where [Code SER]='" & oRst.Fields(0) & "';")
     
            ' ajout des noms de colonnes ligne 1
            If Not oRst2.EOF Then
                With oRst2
                    For itCols = 0 To .Fields.Count - 1
                        oWSht.Cells(1, itCols + 1).Value = .Fields(itCols).Name
                    Next
            ' ajout des données
                    oWSht.Range("A2").CopyFromRecordset oRst2
                End With
            End If
     
            ' fermeture du recordset
            oRst2.Close
            ' nom du classeur à exporter
            stWkbkName = stPath & "Export_" & oRst.Fields(0) & ".xls"
     
            ' sauvegarde et fermeture du classeur
            oWkbk.SaveAs stWkbkName
            oWkbk.Close
            oRst.MoveNext
     
        Wend
     
    ' Fermeture des objets
        oAppl.Quit
        oRst.Close
        Set oRst = Nothing
        Set oRst2 = Nothing
     
    End Sub
    je te laisse réfléchir au problème du texte à ajouter à certains endroits ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/04/2013, 19h28
  2. Paramètre calculé dans une requête
    Par defluc dans le forum SQL
    Réponses: 8
    Dernier message: 08/05/2010, 10h32
  3. Réponses: 1
    Dernier message: 02/02/2009, 17h12
  4. [Requête_VBA_Access] Paramètre ignoré dans une requête
    Par Tari_calaelen dans le forum VBA Access
    Réponses: 6
    Dernier message: 03/07/2007, 16h06
  5. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46

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