Transfert d'une requête ACCESS dans une feuille Excel [Résolu]

Molenn 797 Messages postés mardi 7 juin 2005Date d'inscription 23 février 2011 Dernière intervention - 25 août 2005 à 09:54 - Dernière réponse : Molenn 797 Messages postés mardi 7 juin 2005Date d'inscription 23 février 2011 Dernière intervention
- 6 oct. 2005 à 16:51
Bonjour,

J'ai donc un petit soucis lors de ce transfert de fichier, à partir d'ACCESS.
Je sais le faire à partir d'Excel, mais cette solution ne me satisfait pas pour ce que je veux faire.

A partir d'Access donc ...
J'utilise la commande TransferSpreadsheet pour transférer la requête dans mon fichier Excel
Mon petit bout de code :
DoCmd.TransferSpreadsheet acExport, , "Requête", Chemin, False
où Chemin est une variable contenant le chemin du fichier Excel.

Cela marche bien dans le sens où effectivement, je transfère ma requête dans le fichier Excel, mais elle se met dans une nouvelle feuille ayant pour nom le nom de la requête.

Ma question est :
Connaitriez-vous un moyen de transférer ma requête dans la feuille et à partir de la cellule de mon choix (par exemple, sur la Feuille 2, cellule "B5:D15") ?

Je préfèrerai éviter la solution consistant à créer une boucle et alimenter les cellules une par une, mon programme finira sans doute par être assez lourd et je voudrais qu'il s'exécute quand même assez rapidement. Et comme j'ai des dizaines de requêtes à exporter de cette façon.

P.S. : J'ai utilisé le moteur de recherche sur la fonction TransferSpreadsheet.
Aucune réponse ne convient.
Cette solution revient à chaque fois :

Docmd.TransferSpreadsheet
acExport,8, "NomdeLaTableOuDeLaRequête","NomDuFichierACréer",True, "Feuil1!A1:HZ3000"

Comme il est expliqué dans l'aide en ligne :
"Lorsque vous effectuez une exportation vers une feuille de calcul, vous devez laisser cet argument vierge. Si vous tapez une plage, l'exportation échoue."

D'avance merci,

Molenn
Afficher la suite 

5 réponses

thtdlx2 17 Messages postés dimanche 10 octobre 2004Date d'inscription 3 juillet 2008 Dernière intervention - 25 août 2005 à 22:38
+3
Utile
J'ai peut-être une solution pour toi. Le principe est de transférer tes données avec TransferSpraedSheet dans une feuille temporaire, d'ouvrir le fichier ou tu veux mettre tes données au final, et de copier, à partir de la feuille temporaire les données exactement où tu le souhaites dans la feuille finale. Pour ceci, j'exécute le code dans Access, mais en agissant sur les feuilles Excel.
Voici ce que le code donne :

Sub Transfert_Excel()
Dim myXL_Connection As Object
Dim myXL_export As Object
Dim myXL_final As Object
Dim nom_requete As String
Dim erreur_liaison As Boolean
Dim i, j As Integer
Dim blnRunning As Boolean
Dim Fichier_ouvert As Boolean
Dim nb_fichier_Excel_ouverts As Integer
Dim adresse_fichier_exportation As String
Dim adresse_fichier_final As String


On Error GoTo Gestion_Erreur


nom_requete = "Q_2_Arbre_des_Causes_Sous_Rubrique"
adresse_fichier_exportation = "C:\Temp\Donnees.xls" 'le nom du fichier vers lequel sera transféré les données temporairement
adresse_fichier_final = "C:\Temp\perso.xls" 'le nom du fichier dans lequel tu souhaites mettre les données au final
erreur_liaison = False


Connection:
Set myXL_Connection = GetObject(, "Excel.Application")
While myXL_Connection Is Nothing
GoTo Connection
Wend
If Err.Number <> 0 Then
Set myXL_Connection = CreateObject("Excel.Application")
blnRunning = False
Else
blnRunning = True
End If
'Il y a probablement des étapes redondantes, mais des fois, sans cette structure, ça ne marche pas
'et je n'ai jamais trouvé pourquoi


nb_fichier_Excel_ouverts = myXL_Connection.Workbooks.Count
For i = 1 To nb_fichier_Excel_ouverts
If myXL_Connection.Workbooks(i).Name = nom_du_fichier(adresse_fichier_exportation) Then
Fichier_ouvert = True
End If
Next i

'Si le fichier temporaire est déjà ouvert, on le ferme.
If Fichier_ouvert = True Then
myXL_Connection.Workbooks(nom_du_fichier(adresse_fichier_exportation)).Close SaveChanges:=False
End If

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, nom_requete, adresse_fichier_exportation
'J'ouvre les 2 fichiers dans Excel
myXL_Connection.Workbooks.Open adresse_fichier_exportation
myXL_Connection.Workbooks.Open adresse_fichier_final

'Je me connecte aux 2 fichiers sous Excel
Set myXL_export = myXL_Connection.Workbooks(nom_du_fichier(adresse_fichier_exportation)).Sheets(1)
Set myXL_final = myXL_Connection.Workbooks(nom_du_fichier(adresse_fichier_final)).Sheets(1)
'Je copie la plage qui m'intéresse (cela implique que tu connaisses le nombre de ligne et de colonne, mais je pense que tu sais faire ?
'si c'est un nombre qui peut changer, tu peux aussi les trouver à partir d'Excel en faisant quelquechose du style
' nb_ligne = myXL_export.End(xlDown).Row ou un truc comme ça (je ne connais pas la syntaxe exacte))
myXL_export.Range(myXL_export.Cells(1, 1), myXL_export.Cells(11, 2)).Copy
'copie des données à la ligne 3 et à la colonne 4 : tu met ce que tu veux.
myXL_Connection.Workbooks(nom_du_fichier(adresse_fichier_final)).Sheets(1).Cells(3, 4).Select
myXL_final.Paste

myXL_Connection.Workbooks(nom_du_fichier(adresse_fichier_final)).Save

Gestion_Erreur:
If Err.Number <> 0 And Err.Number <> 20 Then
If Err.Number = 429 Then
If blnRunning = False Then
Shell "Excel.exe"
blnRunning = True
erreur_liaison = True
Resume Next
Else
Resume Next
End If
Else
MsgBox Err.Number & " " & Err.Description
End If
End If
End Sub
Cette réponse vous a-t-elle aidé ?  
thtdlx2 17 Messages postés dimanche 10 octobre 2004Date d'inscription 3 juillet 2008 Dernière intervention - 25 août 2005 à 22:40
0
Utile
j'ai oublié de joindre le code de la fonction

Function nom_du_fichier(chemin As String) As String
Dim i As Integer
i = Len(chemin)
While Mid(chemin, i, 1) <> ""
i = i - 1
Wend
nom_du_fichier = Mid(chemin, i + 1)
End Function

et j'ai oublié de préciser (je ne l'ai pas fait) que tu peux ensuite supprimer le fichier temporaire du disque dur.
Et le nom de requête "Q_2_Arbre_des_Causes_Sous_Rubrique" est à changer naturellement.
Molenn 797 Messages postés mardi 7 juin 2005Date d'inscription 23 février 2011 Dernière intervention - 26 août 2005 à 09:16
0
Utile
Effectivement, je n'avais pas pensé à cette solution.

Le code me parait un brin compliqué par rapport à celui que j'ai déjà (la faute à ma façon de coder sans doute :), mais je vais adapter.

Je retiens l'idée et une bonne partie du code, et je tiens au courant.
Merci.
thtdlx2 17 Messages postés dimanche 10 octobre 2004Date d'inscription 3 juillet 2008 Dernière intervention - 31 août 2005 à 22:48
0
Utile
Si tu vois des simplifications à faire dans mon code, ça m'interesse ! J'ai appris sur le tas, et je dois avoir plein de mauvaises habitudes et de lacunes. C'est l'occasion d'apprendre tous les jours de nouvelles choses !
Molenn 797 Messages postés mardi 7 juin 2005Date d'inscription 23 février 2011 Dernière intervention - 6 oct. 2005 à 16:51
0
Utile
Hop, il m'a fallu du temps, mais bon, les congés sont passé par là aussi ^^

En fait, je n'ai gardé que l'idée, à savoir que je suis apssée par une feuille temporaire dans mon fichier Excel.

Pour me simplifier le tout, j'écris la requête directement dans ACCES.

Je l'exporte dans mon fichier Excel (pas besoin de l'ouvrir) avec un
DoCmd.TransferSpreadsheet acExport, , "Nom Requête", "Chemin fichier", False

J'ouvre ensuite mon fichier Excel, toujours à partir d'ACCESS :
Set FichierExcel = CreateObject("Excel.Application")
FichierExcel.Visible = True
Set FichierExcelAsset = FichierExcel.Workbooks.Open(Chemin)

Et je travaille mon fichier EXCEL, toujours à partir d'ACCESS, en utilisant des commandes du type :
Temp = FichierExcel.Worksheets("Nom Requête").Range("A1").Value
FichierExcel.Worksheets("Feuil1").Range("B3").Value = Transfert


Donc, je valide la réponse même si je ne l'ai pas utilisée en tant que telle ^^

Molenn

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.