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 :

Programmer en VBA pour groupements


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 58
    Points : 9
    Points
    9
    Par défaut Programmer en VBA pour groupements
    Bonjour
    Sur un Formulaire access, j'ai un bouton qui me permet d'exporter des données excel sous forme de tableau. J'aimerais ajouter ds ce bouton, des lignes de programme qui me permettent de grouper directement des champs ensemble lors de l'export sur excel, afin d'éviter de ne le faire à chaque fois sur la feuille Excel.
    Quelqu'un a voulu m'aider en me disant de "piloter excel" pour utiliser le VBA excel... mais je ne sais pas ce qu'il a voulu dire. On m'a parlé aussi de DAO, mais je ne sais pas non ce que c'est.
    Quelqun pourrait il me donner les bonnes fonctions, les lignes de VBA à ajouter, ou m'aider un peu plus.
    Je vous remercie.
    Si je n'ai pas été clair, n'hésitez pas à me demander plus de précisions.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 154
    Points : 148
    Points
    148
    Par défaut
    Bonsoir...

    Je ne comprend pas tres bien ce que tu veux faire, mais pour ma part,
    j'ai reussi a exporter des données d'une table, dans un fichier excel, voire plusieurs fichiers excel, et dans des onglets différents selons certains critère, en mettant en forme, des couleurs, etc..
    Effectivement, c'est piloter Excel depuis Access, en utilisant les fonctions VBA de Excel...
    Si c'est ça que tu veux faire, je peux t'aider, mais ce n'est pas tres simple à expliquer comme ça...
    Il faut que tu donnes plus de précisions, est ce une table ? une requete que tu exportes ?

    Cordialement
    Didier

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 58
    Points : 9
    Points
    9
    Par défaut
    Oui ce sont les données d'une requete que j'exporte.
    Les champs de la requete sont ainsi exportées sous forme de tableau dans Excel.
    Beaucoups de mise en forme (couleurs, formats, etc...) ont déja été défini dans mes lignes de code liées au bouton d'export du formulaire.
    Veux tu d'autres précisions?
    Cordialement
    Mickael

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 154
    Points : 148
    Points
    148
    Par défaut
    Bonsoir
    La fonction ci-dessous devrait faire ce que tu veux.....
    A toi de l'adapter, il y a pas mal de commentaire, pour t'aider..
    Si tu as des soucis, fais moi signe, je pourrais l'adapter pour toi...
    En fait, c'est ca "piloter Excel".. Tu déclares une instance d'Excel, et tu fais comme si tu étais dans VBA Excel..
    La feuille Excel s'appelle, dans cette fonction XlSheet, logique non ?
    (voir la déclaration des variables..)

    Bon courage.

    Didier71

    PS:
    - la sub affiche() est de mon crue...
    Tu peux remplacer par un msgbox()
    - la fonction Lec_param() aussi : c'est pour lire un nom de répertoire dans une table de paramètres..
    - la numérotation des champs d'une table commence à 0..
    - En gros, cette fonction fait autant de fichiers EXCEL qu'il y a de
    données différentes dans le champ rst.field(0) : le premier
    - Ensuite, dans chaque fichier un onglet qui s'appelle du nom du field(1)+field(2) (tronqué à 31 caractères : le maxi pour un nom d'onglet)
    - Ensuite, on met en première ligne du fichier Excel le Nom du field(1), pas son contenu (field(1).name)
    - Ensuite, on parcour le recordset (ta requete), tant que les conditions sont remplies, sinon on change d'onglet, et de fichier éventuellement
    pour remplir les données....

    - Attention à bien trier les données, sur les champs que tu utilises pour créer le fichier, les onglets...
    - En fait, si tu n'as qu'un seul fichier, et un seul onglet, la fonction est encore plus simple.....
    - Enfin, cette fonction va vite pour peu d'enregistrement, s'il y en a beaucoup, c'est mieux d'utiliser "copyfromrecordset".

    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
     
    Function ExportExcel(MyReq As String, MyFile As String)
     
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim xlApp As Excel.Application
    Dim xlSheet As Excel.Worksheet
    Dim xlBook As Excel.Workbook
    Dim LeLibelle As String
     
    Dim PrefixeGroupe As String
     
    Set db = CurrentDb
    Set rst = db.OpenRecordset(MyReq, dbOpenSnapshot)
     
    If rst.RecordCount < 1 Then 'test si requete vide sinon plantage au rst.movefirst
        Call Affiche("Pas d'enregistrement répondant aux critères", 1)
        Set rst = Nothing
        Set db = Nothing
        Exit Function
     
    End If
     
     
    rst.MoveFirst    'on se place au premier enregistrement
     
    Do
        PrefixeGroupe = rst.Fields(0) 'on affecte le nom du champ O a la variable (soit le nom du groupe)
        Set xlApp = CreateObject("Excel.Application")    ' on ouvre l'application Excel en invisible
        'xlApp.Visible = True     'Pour test : rendre Excel visible
     
        Set xlBook = xlApp.Workbooks.Add     ' on crée un nouveau fichier
     
        Do
            Set xlSheet = xlBook.Worksheets.Add    'on ajoute un onglet dans excel
     
            xlSheet.Name = Left(rst.Fields(1) & " " & rst.Fields(2), 31) ' l'onglet s'appelle du nom du premier champ et du 2d : ent + libelle
                                                                         ' Onglet Excel pas plus de 31 caractères
            For j = 1 To rst.Fields.Count - 1 ' on parcourt tous les champs sauf le (0) et on met le nom en première ligne
                xlSheet.Cells(1, j) = rst.Fields(j).Name
     
                    With xlSheet.Cells(1, j)  'quelques mises en forme
                    .Interior.ColorIndex = 15    'couleur à gris
                    .Interior.Pattern = xlSolid   'fond de cellule à gris
                    .HorizontalAlignment = xlCenter 'centrage du titre
                    End With
            Next j
     
            i = 2  'on place l'index sur la 2d ligne pour remplir les données
     
            Do  'on fait ce qui suit tant que le champ1+2  est égal à l'onglet
     
                For z = 1 To rst.Fields.Count - 1   'on parcourt à nouveau chaque champ sauf le premier 0
                    xlSheet.Cells(i, z) = rst.Fields(z)  ' on remplit les cellules avec les données
                Next z
     
                i = i + 1    'index sur ligne suivant
                rst.MoveNext   'on passe à l'enregistrement suivant dans la requete
     
                If rst.EOF Then Exit Do   ' si jamais c'est la fin du fichier, on sort de la boucle
     
                LeLibelle = Left(rst.Fields(1) & " " & rst.Fields(2), 31) ' après le movenext : on reaffecte champ1+champ2 a la variable Libelle
     
            Loop While LeLibelle = xlSheet.Name     'on fait ça tant que le premier champ = onglet, sinon on change d'onglet
     
            xlSheet.Columns.AutoFit  'on adapte la largeur des colonnes au contenu
     
            If rst.EOF Then Exit Do 'si jamais c'est fin de fichier : on sort de la boucle pour pas planter
     
        Loop While rst.Fields(0) = PrefixeGroupe 'tant que c'est le même groupe d'entreprises
     
        xlBook.SaveAs Lec_Param("Chemin") & " " & MyFile   'enregistrement du fichier chemin contenu dans le paramètre +nom ds la variable
     
        xlApp.Quit  'on quitte excel
     
       ' MsgBox "Le fichier " & " " & MyFile & Chr(13) & "a été crée dans le répertoire : " & Chr(13) & Lec_Param("CHEMIN"), vbInformation, "Création réussie"
        Call Affiche("Le fichier " & MyFile & " a été crée dans le répertoire : " & Lec_Param("CHEMIN"), 1)
     
    Loop Until rst.EOF
       'on libère les instances
        Set rst = Nothing
        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
     
    End Function

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 58
    Points : 9
    Points
    9
    Par défaut
    Bonjour!
    J'ai étudié longuement votre code et je pense qu'on s'est mal compris.
    Quand je parle de "grouper", c'est grouper des lignes à l'aide de la fonction grouper. Par exemple, "dissocier" sert à faire l'inverse. Par exempke, en groupant la ligne 1 avec la ligne 2, je peux après cliquer sur un logo "+" ou "-" afin de masquer ces deux lignes. Ce que je cherche donc, c'est à grouper certaines lignes de mon tableau entre elles dès l'export vers excel.
    Pouvez vous donc m'aider?
    Je vous remercie d'avance

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 154
    Points : 148
    Points
    148
    Par défaut
    Bonjour

    Oui, en effet, j'ai pas bien compris...
    Je peux te donner un début de solution, du moins comment moi je fait...
    Déjà j'ouvre un fichier Excel, contenant des données, je passe en enregistrement macro et j'exécute les actions que je veux..
    Ensuite, il suffit de recupérer le code Visual Basic de la macro,
    et le copier dans ton module VBA access, et d'adapter bien sûr.

    Pour grouper il semble que ce soit du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Range("A2:F22").Select
        Selection.Rows.Group
    Mais à appliquer à ton objet Excel défini avant.....
    dans mon exemple : XlSheet

    J'espère t'avoir aiguillé..
    Bon courage

    Didier71

Discussions similaires

  1. [XL-2007] problème pour coder un programme en VBA
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/12/2010, 10h00
  2. Meilleur livre de programmation VBA pour la finance
    Par Eric06 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/10/2008, 14h35
  3. probleme pour programmer en vba excel
    Par stef15 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/09/2008, 20h52
  4. [VBA-E] Help création d'un programme vba pour excel
    Par yampi dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/01/2007, 11h46

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