Générer tableau excel a partir donées access

Fermé
jack - 9 août 2005 à 14:48
 nours - 5 mai 2014 à 11:08
Bonjour à tous !
J’ai un tableau sous excel que j’ai inséré dans access grace a plusieur tables .
Mon probleme est que je n’arrive pas a récuper toutes les données de mes tables et les retransférer sous excel et donc reformer mon tableau initial…(sachant que j’ai certains champs vides). Il faudrait que je mette un champs d’une table en colonne ; un champ comme 1ere ligne ; et le reste dans mon tableau !
Quelqu’un pourrait-il m’aider ?
Merci d’avance de me repondre… !
A voir également:

22 réponses

Utilisateur anonyme
17 août 2005 à 18:00
re:

voici un exemple :

Sub InitialiseExcel()

    Dim xlApp, xlBook, xlRange As Variant             'Objets classeur
    Dim xlWks, iRows, iCols, iRotate As Variant       'Objets feuille
    Dim FichierXL As String
    Dim Boucle, Cmpt As Integer
    '
    FichierXL = "C:\MonFichier.xls"
    'Création de l'objet Excel (main mise sur !)
    Set xlApp = CreateObject("Excel.Application")
    'Création de l'objet [Fichier Excel]
    Set xlBook = xlApp.Workbooks.Open(FichierXL)
    'Création de l'objet [Feuille] du classeur Excel.
    xlApp.ActiveWorkbook.Worksheets.Add
    Set xlWks = xlBook.ActiveSheet
    'Création de la plage permise dans la feuille Excel.
    Set xlRange = xlWks.Range("A1:A65535")

    DoCmd.GoToRecord , , acLast
    Cmpt = Forms![MonFormulaire].Recordset.RecordCount
    DoCmd.GoToRecord , , acFirst
    
    For Boucle = 1 To Cmpt
        xlRange.Cells((Boucle + 1), 1).Value = Forms![MonFormulaire].[Champs1]
        DoCmd.GoToRecord , , acNext
    Next Boucle
    
    DoCmd.GoToRecord , , acFirst
    For Boucle = 1 To Cmpt
        xlRange.Cells(1, (Boucle + 1)).Value = Forms![MonFormulaire].[Champs2]
        DoCmd.GoToRecord , , acNext
    Next Boucle
    
    DoCmd.GoToRecord , , acFirst
    For Boucle = 1 To Cmpt
        xlRange.Cells((Boucle + 1), (Boucle + 1)).Value = Forms![MonFormulaire].[Champs3]
        DoCmd.GoToRecord , , acNext
    Next Boucle
    
    DoCmd.GoToRecord , , acFirst

    xlApp.Visible = True
    xlWks.Activate
    xlRange.Cells(1, 1).Select
    xlApp.DisplayAlerts = False
    xlBook.SaveAs FichierXL
    'xlApp.Quit
    xlApp.DisplayAlerts = True

    Set xlRange = Nothing
    Set xlWks = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
   
    MsgBox "Fin du travail"

End Sub


Lupin
1
Utilisateur anonyme
9 août 2005 à 16:29
Bonjour,

Voilà, j'ai lu ton précédent message et a ce que je peux voir,
tu n'as pas trouver pointure a ton pied !!!

Donc tu as des tables sous Access que tu veux exporter sous
Excel. Alors première étape, créer une requête qui te fournira
les éléments voulu.

Sous ACCESS :

//Créer une nouvelle requête à l'aide de l'assistant
//Sélectionner la(es) table(s) nécessaire(s)
//Sélectionner le(s) champs à faire afficher

N.B. Même une fois créé, tu pourra rajouter des tables/champs
dans la requête. De plus il est aussi possible de modifier
la requête par programmation sur des actions de l'utilisateur.

// Menu Fichier / Exporter / Format XLS

Il est fort probable qu'une mise en page soit nécessaire sous
Excel, mais allons y un pas à la fois.

N.B. Il est aussi fort possible qu'un formulaire accroché sur la
requête fasse aussi l'affaire.

Pour l'instant, il te faut créer une requête.

Lupin

0
Je vais essayer mais le prob c que je veu les enregistremen d'un champ précis d'une de mes tables ds ma 1ere ligne de mon tableau ; et mm choz je veu ossi les enregistremen d'un champ précis d'une autre table ds la 1ere colone et le reste des données ds les différentes cases de ce tableau...
Je c pa si tu c faire sa keske ten pense c faisable?
mici de ton aide
0
random Messages postés 1612 Date d'inscription vendredi 26 novembre 2004 Statut Membre Dernière intervention 30 mars 2006 155
9 août 2005 à 17:32
c'est faisable utiliser null et not null
0
je v essayer merci bcq!
0
Utilisateur anonyme
9 août 2005 à 17:54
re:

en effet, c'est possible. En fait peu importe la structure que
tu veux, si tu as les données, le reste n'est qu'une mise en
page.

Une requête peut pointer dans plusieurs table et sur plusieurs
champs, a toi de choisir les données recherchées.

Tu pourrais aussi construire ton tableau Excel avec plus d'une requête, en exportant plus d'une fois et en fusionnant les
fichiers Excel généré.

Il y a toute une panoplie de possibilitées.


Lupin
0
Ok merci j'ai bien compris!
néanmoins, apres avoir créer les requetes, je les exporte sous excel mais cela me crée un tableau identique a la requete. Je c que c un probleme de mise en page ; mais en fait ce que je voudrais c générer mon tableau excel directement com je le veux (sans avoir besoin de faire de mise en page sous excel).
Grace a un bouton, envoyer directement sous excel un champ d'une table comme 1ere ligne, un autre comme 1ere colone ; et toutes les données d'une autre table dans ce tableau (les champs que je veux mettre en 1ere Ligne et 1ere Colonne figure dans cette table ce qui me garanti la cohérence des informations)

tu penses que c faisable ce que je veux? ("automatiser" la création du tableau excel) Il faut surement créer un code en vba non?

Merci de ton aide...a+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
11 août 2005 à 01:15
re:

oui c'est possible en VBA, on peut faire ce que l'on veut !
il y a plein d'exemples pour piloter Excel depuis VB/VBA/VBS sur le net !

en voici un :
http://www.oricom.ca/lupin/document/excelvbs.txt

Lupin
0
Slt! j'ai un peu regarder le code que tu m'a donné mais je n'ai pas tout compris...(jsui novice en vba!)
Pourrais tu m'expliquer plus clairement coment je pourrais programmer un bouton en vba qui me construit un tableau sous excel en fonction de différents champs de plusieurs tables?
(Dire par code qu'un champ sera la 1ere colonne, un autre la 1ere ligne, ...)
et comme j'ai deja un tableau du mm type que je veux sous excel, c'est possible d'inserer dans le meme fichier (sur une autre feuille excel) les données que j'ai sous access? (de facon a pouvoir comparer le tableau initial au tableau final directement)

Mici d'avance de ton aide a+
0
Utilisateur anonyme
15 août 2005 à 16:09
Salut,

Voici donc un exemple de code a accrocher sur un bouton
d'un formulaire.

Tu créé une routine dans la section [Module], sur un formulaire
tu place un bouton qui est accroché sur une procédure événementiel,
et dans cette procédure, tu appelle la routine créé.

Sub InitialiseExcel()

    Dim xlApp, xlBook, xlRange As Variant             'Objets classeur
    Dim xlWks, iRows, iCols, iRotate As Variant       'Objets feuille
    Dim FichierXL As String
    Dim Boucle, Cmpt As Integer
    '
    FichierXL = "C:\MonFichier.xls"
    'Création de l'objet Excel (main mise sur !)
    Set xlApp = CreateObject("Excel.Application")
    'Création de l'objet [Fichier Excel]
    Set xlBook = xlApp.Workbooks.Open(FichierXL)
    'Création de l'objet [Feuille] du classeur Excel.
    Set xlWks = xlBook.Worksheets(1)
    'Création de la plage permise dans la feuille Excel.
    Set xlRange = xlWks.Range("A1:A65535")

    DoCmd.GoToRecord , , acLast
    Cmpt = Forms![MonFormulaire].Recordset.RecordCount
    DoCmd.GoToRecord , , acFirst
    
    For Boucle = 1 To Cmpt
        xlRange.Cells(Boucle, 1).Value = Forms![MonFormulaire].[Champs1]
        xlRange.Cells(Boucle, 2).Value = Forms![MonFormulaire].[Champs2]
        xlRange.Cells(Boucle, 3).Value = Forms![MonFormulaire].[Champs3]
        DoCmd.GoToRecord , , acNext
    Next Boucle
    DoCmd.GoToRecord , , acFirst

    xlApp.Visible = True
    xlWks.Activate
    xlRange.Cells(1, 1).Select
    xlApp.DisplayAlerts = False
    xlBook.SaveAs FichierXL
    xlApp.Quit
    xlApp.DisplayAlerts = True

    Set xlRange = Nothing
    Set xlWks = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
   
    MsgBox "Fin du travail"

End Sub



Voilà, ceci devrait te fournir un bon point de départ !

Lupin
0
Slt! J'ai bien regarder le code que tu m'as envoyé et il y a une partie que je n'ai pas bien comprise :

DoCmd.GoToRecord , , acLast
Cmpt = Forms![MonFormulaire].Recordset.RecordCount
DoCmd.GoToRecord , , acFirst
For Boucle = 1 To Cmpt
xlRange.Cells(Boucle, 1).Value = Forms![MonFormulaire].[Champs1]
xlRange.Cells(Boucle, 2).Value = Forms![MonFormulaire].[Champs2]
xlRange.Cells(Boucle, 3).Value = Forms![MonFormulaire].[Champs3]
DoCmd.GoToRecord , , acNext
Next Boucle
DoCmd.GoToRecord , , acFirst

xlApp.Visible = True
xlWks.Activate
xlRange.Cells(1, 1).Select
xlApp.DisplayAlerts = False
xlBook.SaveAs FichierXL
xlApp.Quit
xlApp.DisplayAlerts = True

Set xlRange = Nothing
Set xlWks = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
MsgBox "Fin du travail"

J'ai pas bien compris ce que cela fait...Le "forms" c le nom de la table? le "[MonFormulaire]" c le formulaire ou on entre les données dans la table?et les champs st les champs que l'on va utiliser pour former le tableau sous excel?

Tu pourrais m'expliquer tout ceci stp?

Mici d'avance a+
0
Utilisateur anonyme
16 août 2005 à 14:09
Salut,

J'ai créé une table access que j'ai nommé [ MaTable ], ayant
pour champs [ Champs1 - Champs2 - Champs3 ].
J'ai créé une requête que j'ai nommé [ MaRequete ], celle-ci
récupère tous les enregistrements de ma table.
J'ai créé un formulaire que j'ai nommé [ MonFormulaire ].

Donc, le formulaire pointe sur la requête et la requête pointe
sur la table.

J'ai placé un bouton sur mon formulaire que j'ai accroché
a une procédure événementiel.
Private Sub cmd_Execute_Click()
    Call Fonctions.InitialiseExcel
End Sub

'Afin de renseigner la propriété [RecordCount]
DoCmd.GoToRecord , , acLast 
'Capture le nombre d'enregistrement
Cmpt = Forms![MonFormulaire].Recordset.RecordCount 
'Retourne au premier enregistrement
DoCmd.GoToRecord , , acFirst 

' Boucle sur tous les enregistrements
For Boucle = 1 To Cmpt 
  'Place en position [Boucle,1] la valeur du premier champs
  xlRange.Cells(Boucle, 1).Value = Forms![MonFormulaire].[Champs1] 
  'Place en position [Boucle,1] la valeur du second champs
  xlRange.Cells(Boucle, 2).Value = Forms![MonFormulaire].[Champs2] 
  'Place en position [Boucle,1] la valeur du troisième champs
  xlRange.Cells(Boucle, 3).Value = Forms![MonFormulaire].[Champs3] 
  'Enregistrement suivant
  DoCmd.GoToRecord , , acNext 
Next Boucle 
'Retourne au premier enregistrement
DoCmd.GoToRecord , , acFirst 

'Fermeture de Excel
'Rend Excel visible
xlApp.Visible = True
'Active le classeur 
xlWks.Activate 
'Positionnement en [ A1 ]
xlRange.Cells(1, 1).Select
'Message d'erreur en arrêt 
xlApp.DisplayAlerts = False
'Sauvegarde du fichier Excel créé. 
xlBook.SaveAs FichierXL 
'Ferme l'application Excel
xlApp.Quit
'Message d'erreur actif
xlApp.DisplayAlerts = True 

'Libération des variables
Set xlRange = Nothing 
Set xlWks = Nothing 
Set xlBook = Nothing 
Set xlApp = Nothing 

MsgBox "Fin du travail" 



Lupin
0
J'ai fait exactement come toi avec les mm nom pr tester et sa ne marche pas...Il ne me reconait pas le "Call Fonctions.InitialiseExcel" et je c pa trop ce que cela signifie daileur!

Dans le bouton, j'ai entrer le code la :

Private Sub cmd_Execute_Click()
Call Fonctions.InitialiseExcel

End Sub

Sub InitialiseExcel()

Dim xlApp, xlBook, xlRange As Variant 'Objets classeur
Dim xlWks, iRows, iCols, iRotate As Variant 'Objets feuille
Dim FichierXL As String
Dim Boucle, Cmpt As Integer
'
FichierXL = "C:\WINDOWS\Bureau\Maintenance\PréventifMill1bis2.xls"
'Création de l'objet Excel (main mise sur !)
Set xlApp = CreateObject("Excel.Application")
'Création de l'objet [Fichier Excel]
Set xlBook = xlApp.Workbooks.Open(FichierXL)
'Création de l'objet [Feuille] du classeur Excel.
Set xlWks = xlBook.Worksheets(1)
'Création de la plage permise dans la feuille Excel.
Set xlRange = xlWks.Range("A1:A65535")


'Afin de renseigner la propriété [RecordCount]
DoCmd.GoToRecord , , acLast 'Capture le nombre d'enregistrement
Cmpt = Forms![MonFormulaire].Recordset.RecordCount 'Retourne au premier enregistrement
DoCmd.GoToRecord , , acFirst

' Boucle sur tous les enregistrements
For Boucle = 1 To Cmpt 'Place en position [Boucle,1] la valeur du premier champs
xlRange.Cells(Boucle, 1).Value = Forms![MonFormulaire].[Champs1] 'Place en position [Boucle,1] la valeur du second champs
xlRange.Cells(Boucle, 2).Value = Forms![MonFormulaire].[Champs2] 'Place en position [Boucle,1] la valeur du troisième champs
xlRange.Cells(Boucle, 3).Value = Forms![MonFormulaire].[Champs3] 'Enregistrement suivant
DoCmd.GoToRecord , , acNext Next Boucle 'Retourne au premier enregistrement
DoCmd.GoToRecord , , acFirst

'Fermeture de Excel
'Rend Excel visible
xlApp.Visible = True
'Active le classeur xlWks.Activate 'Positionnement en [ A1 ]
xlRange.Cells(1, 1).Select
'Message d'erreur en arrêt xlApp.DisplayAlerts = False
'Sauvegarde du fichier Excel créé. xlBook.SaveAs FichierXL 'Ferme l'application Excel
xlApp.Quit
'Message d'erreur actif
xlApp.DisplayAlerts = True

'Libération des variables
Set xlRange = Nothing Set xlWks = Nothing Set xlBook = Nothing Set xlApp = Nothing

MsgBox "Fin du travail"

End Sub

Tu vois ce qui ne vas pa? (je debute en vba dc je compren pa gd chose lol)

Merci de ton aide...
0
Utilisateur anonyme
16 août 2005 à 14:58
re:

Sous acces, lorsque tu ouvre ta base, tu vois les objets
suivants dans la colonne de gauche.

Tables
Requetes
Formulaires
États
Pages
Macros
Modules

Rend toi à la section [ Modules ]
Crée un nouveau module et colle-y la procédure
Sub InitialiseExcel()


Maintenant, par défaut le nom du nouveau module
est [ Module1 ], soit tu le renomme, soit tu appelleras
la procédure par :

Call Module1.InitialiseExcel

dans mon exemple, je renommer le module par [ Fonctions ]

d'ou mon exemple : Call Fonctions.InitialiseExcel

maintenant, dans ton formulaire, si tu as rajouter le bouton,
dans les propriétés [ OnClic ] -> procédure événementiel ->

tu y place :
Call Module1.InitialiseExcel
ou
Call Fonctions.InitialiseExcel

ça devrait tourner comme ça!

Lupin
0
Je commence a comprendre doucement mais surment!
J'ai créer donc le module que tu m'as di mais lorsque je clic sur le bouton, il ne me reconait pa les lignes de code suivante :

DoCmd.GoToRecord , , acNext Next Boucle 'Retourne au premier enregistrement
en supriman "Next Boucle 'Retourne au premier enregistrement" cela marche!

'Libération des variables
Set xlRange = Nothing Set xlWks = Nothing Set xlBook = Nothing Set xlApp = Nothing

la ligne ci dessus non plus n'est pas reconnu...

Ta une idée de ce qui ne va pa? (moi pa du tt lol)

Merci bcq!!
0
Utilisateur anonyme
16 août 2005 à 15:42
re:

j'ai déposé l'exemple que j'ai construis ici :

http://www.oricom.ca/lupin/document/piloterexcel.zip

Regarde le tout, chez moi ça fonctionne nickel !

Lupin
0
Mici bcq ca marche!
Sauf que je voudrais que en appuyant sur le bouton cela me crée une nouvelle feuille dans le fichier excel défini (pour comparer la feuille ou il y a le tableau initial avec la nouvelle feuille créée en fonction des données entrées par l'utilisateur)
Alor que la ca minssere tout dans la mm feuille!

Quelle ligne de code dois-je rajouter pour faire ceci?

Mici de ton aide
0
Utilisateur anonyme
16 août 2005 à 16:19
re:

Pour ajouter une feuille a chaque exécution :

Modifier les lignes suivantes :
   'Création de l'objet [Feuille] du classeur Excel.
   Set xlWks = xlBook.Worksheets(1)

par :
   'Création de l'objet [Feuille] du classeur Excel.
   xlApp.ActiveWorkbook.Worksheets.Add
   Set xlWks = xlBook.ActiveSheet


Lupin
0
Slt!
Merci pour ton code ca marche nickel c super!
Mais j'ai encore quelque prob :
Comen faire pour laisser ouvert le fichier excel apres avoir cliqué sur le bouton? (car actuelement apres avoir cliqué sur le bouton le tableau est créer mé le fichier excel se referme et je dois louvrir manuelement)
et j'ai un probleme o niveau de la mise en page du tableau, je voudrais que le Champs1 forme la 1ere colone, le Champs2 la 1er ligne et le champs3 le centre de mon tableau (reste)...
Comment pourrais-je faire ceci automatiquement (en cliquant sur mon bouton) ?
(actuelement ca met champs1 1ere colone; champs2 2eme col; champs3 3eme col)

Merci de ton aide (et dsl detre ossi nul en vba lol)
a+
0
Utilisateur anonyme
17 août 2005 à 13:07
Salut,

Pour la fermeture , ça se passe ici :
'Fermeture de Excel
'Rend Excel visible
xlApp.Visible = True
'Active le classeur 
xlWks.Activate 
'Positionnement en [ A1 ]
xlRange.Cells(1, 1).Select
'Message d'erreur en arrêt 
xlApp.DisplayAlerts = False
'Sauvegarde du fichier Excel créé. 
xlBook.SaveAs FichierXL 
'Ferme l'application Excel
xlApp.Quit
'Message d'erreur actif
xlApp.DisplayAlerts = True 

La ligne qui ferme Excel est la suivante :
'Ferme l'application Excel
xlApp.Quit

Pour la mise en page, je ne peux te pondre ça la tout de suite.
Je te rapporte quelques lignes plus tard !

Lupin
0
ok merci (c t tt con le truc pour garder le fichier excel ouvert!) jcomprend mieu mintenan!!

Pour la disposition du tableau (champs1 1ere col; champs2 2eme col; champs 3 le milieu du tablo), j'arrive a le faire en manuel (formulaire-nouvo-Assistant tableau croisé dynamik) mais ce que je veux c automatiser cela ; dc par code ce que jarive pas snif!

Mici bcq de ton aide!
+++
0
Utilisateur anonyme
17 août 2005 à 14:24
Re:

la, je suis pas sur ! En somme une fois le tableau Excel créé,
tu crées un tableau dynamique croisé avec le résultat et
cette mise en page te convient ?

bien entendu, il est possible par VBA de créer un tableau
dynamique croisé. Est-ce bien cela, la création d'un tableau
dynamique croisé fera ce que tu cherche ?

Lupin
0
Ben en fait faire un tableau croisé dynamique me permet davoir un tableau avec la mise en forme que je souhaite ( mé je dois assigner manuelemen chacun de mes 3 champs dans la 1ere ligne, 1ere colone et o centre du tableau) dc manuelemen jarive a faire cke je veu...
Cependant j'aimerais automatiser cete tache c a dire par code dire que le champs1 je veux kil constitue la 1ere colone de mon tableau, le champs2 la 1ere ligne et le champs3 le cendre de mon tableau.

Tu as compris ou je veu en venir? C possible de faire cela par code?

Merci de ton aide...
0
Slt! merci pour ton code il marche bien, c t exactement ce que javé besoin! Mais il reste n derniere petit détail :
en fait dans mon champs2 joré une série de chiffre (de 1 a 52) et je voudrais que lorsqu'on crée le tableau, les différents chiffres soient classés par ordre croissan...
C possible? Quesque t'en pense?
Merci de ton aide +++
0
Hello! en testant mon appli access je me suis rendu compte d'un probleme : en fait il est possible qu'il y é plusieur fois les mm valeur dans le champs1 et le champs2 , et que seule la valeur du champs3 différe...
Quand je génére le tableau sous excel, il me rajoute une ligne lorsque les champs1 et 2 st les mm (cki me fait un tableau un peu fouilli)
Tout ceci, c'est parce que mon champs1 c le num de la semaine ; le champs2 un travail précis et le champs3 une case a cocher (qd le travail é fait). Or, il peu arriver qu'un mm travail soit fait a plusieurs semaines (ex sem 1-15-50) dc il faudrai que lorsque je génére le tableau sous excel, dans le k ou un travail a été fait plusieur fois a plusieur semaine d'intervalle que cela reste sur une ligne (ex: semaine1 5 15
changement charbons moteur oui oui oui

Avez vous compris? Suis je assez clair?

Es-il possible de remédier a ce probleme?

Merci de votre aide
0
Utilisateur anonyme
19 août 2005 à 16:17
Salut,

de simple requête dans access te permettrons de gérer
tout ça. Ordre croissant, dédoublement de valeur !

en fait je ne vais pas coder tout ton appli. Je te donne des
exemples pour te mettre sur la piste mais je ne peux faire
le travail pour toi !

Lupin
0