Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment copier une feuille EXCEL sous ACCESS?

7 réponses
Avatar
PAULOM
Bonjour =E0 tous, voici mon probl=E8me je n'arrive pas =E0 copier le
contenu d'une feuille EXCEL dans une autre feuille EXCEL du meme
classeur.



Je dois transf=E9rer une table ACCESS vers EXCEL, bon =E7a j'y arrive je
transf=E8re ma table ACCESS (toute les semaines) vers la feuille EXCEL
(SXX) et cette feuille ainsi cr=E9er doit =EAtre copier dans le meme
classeur dans la feuille S0, en gros je dois avoir 2 feuilles
identiques dans le meme classeur mais sous 2 noms diff=E9rents, et
j'aimerais =E9galement mettre mes champs si possible.



Je met pour l'instant pour mon code si =E7a peut vous aider.



Je vous remercie d'avance pour votre aide.



[code]Option Compare Database

Sub ExportTblAccessInExcel()

Dim Db As DAO.Database

Dim Rs As DAO.Recordset

Dim Xlapp As Excel.Application

Dim XlBook As Excel.Workbook

Dim XlSheet As Excel.Worksheet

Dim NomFeuille As String

Dim LigneCopiees As Long

On Error GoTo errOuvrirExcel

Set Xlapp =3D GetObject(, "Excel.Application")

'On Error GoTo oups:

On Error GoTo 0

Xlapp.Visible =3D True

NomFeuille =3D "S" & DatePart("ww", Date) - 1



Set XlBook =3D Xlapp.Workbooks.Open("C:\Documents and
Settings\A4382\Bureau\stage\Nvx_clients_par_BG_2006_S14.xls")



If FeuilleExiste(NomFeuille, XlBook) Then

Set XlSheet =3D XlBook.Worksheets("NomFeuille")

' efface les donn=E9es

XlSheet.Cells.Clear

Else

' Ajouter nouvelle feuille en derni=E8re position

Set XlSheet =3D XlBook.Worksheets.Add(,
XlBook.Worksheets(XlBook.Worksheets.Count - 2))

XlSheet.Name =3D NomFeuille



End If



Set Db =3D CurrentDb



' Copie dans feuille (nouvelle ou effac=E9e)



If DCount("*", "T31_Cumul_Nvx_clients_par_BG") > 0 Then

Set Db =3D CurrentDb

' Copie dans feuille (nouvelle ou effac=E9e)

Set Rs =3D Db.OpenRecordset("T31_Cumul_Nvx_clients_par_BG", ,
dbOpenForwardOnly)

Rs.MoveFirst

LigneCopiees =3D XlSheet.Range("A1").CopyFromRecordset(Rs)

' Ferme les Var

Rs.Close: Set Rs =3D Nothing

Db.Close: Set Db =3D Nothing

Else

MsgBox "Pas de donn=E9es"

End If

' Ferme les Var

Set XlSheet =3D Nothing

' Sauve le fichier

XlBook.Save

'XlBook.Close

Set XlBook =3D Nothing

Set Xlapp =3D Nothing

Exit Sub

errOuvrirExcel:

'Err 429 : Un serveur OLE Automation ne peut pas cr=E9er d'objet

' -> Excel n'est PAS encore ouvert.

If Err =3D 429 Then

Set Xlapp =3D CreateObject("Excel.Application")

Resume Next

End If

oups:

MsgBox Err.Number & " - " & Err.Description

End Sub

Function FeuilleExiste(NomFeuille As String, Classeur As
Excel.Workbook) As Boolean

Dim errNum As Long, strName As String

errNum =3D 0: Err.Clear

On Error Resume Next

strName =3D Classeur.Worksheets(NomFeuille).Name

errNum =3D Err.Number

On Error GoTo 0

If errNum =3D 0 Then FeuilleExiste =3D True Else FeuilleExiste =3D False

End Function

[/code]

7 réponses

Avatar
PAULOM
Avatar
Gilles MOUGNOZ
Bonjour à tous, voici mon problème je n'arrive pas à copier le
contenu d'une feuille EXCEL dans une autre feuille EXCEL du meme
classeur.
Je dois transférer une table ACCESS vers EXCEL, bon ça j'y arrive je
transfère ma table ACCESS (toute les semaines) vers la feuille EXCEL
(SXX) et cette feuille ainsi créer doit être copier dans le meme
classeur dans la feuille S0, en gros je dois avoir 2 feuilles
identiques dans le meme classeur mais sous 2 noms différents, et
j'aimerais également mettre mes champs si possible.
Je met pour l'instant pour mon code si ça peut vous aider.
Je vous remercie d'avance pour votre aide.
...


Bonjour, Paulom

As-tu essayé de faire ce que tu décris dans Excel en utilsant l'enregistreur
de macros ?
Le code écrit dans Access en utilisant Automation devrait être très proche,
voir identique.
Quand à "mettre mes champs si possible", je ne comprends pas ce que tu
souhaites. Peux-tu être plus précis ?

Bonne continuation

Avatar
PAULOM
Mais le problème si je fais sous Excel, il faut que les feuilles aient
toujours le meme nom or celui des "sxx" change automatiquement toutes
les semaines...

Les champs signifient que j'aimerais bien mettre lors du transfert les
champs des tables access car j'ai rien^^

Merci beaucoup pour ton aide
Avatar
Gilles MOUGNOZ
Mais le problème si je fais sous Excel, il faut que les feuilles aient
toujours le meme nom or celui des "sxx" change automatiquement toutes
les semaines...
Les champs signifient que j'aimerais bien mettre lors du transfert les
champs des tables access car j'ai rien^^
Merci beaucoup pour ton aide


On ne s'est pas compris...
Je te disais simplement de le faire sur Excel pour, dans un premier temps,
voir quel code VBA était généré et ,dans un deuxième temps, reporter ce code
dans Access.
Ceci dit, le VBA d'Excel n'est pas différent de celui d'Access, il y a
seulement des objets et conteneurs spécifiques à chacun (Forms, Reports, ...
pour Access, WorkBooks, WorkSheets, ... pour Excel).
Pour ton autre question, je ne suis pas sûr. Il est tout à fait possible de
faire une boucle sur la définition des champs du recordset mais je ne sais
pas s'ils seront dans le bon ordre.
Cela devrait donner ceci:

Dim ChampRs As Field
Dim NumLigne As Long
Dim NumColonne As Long
For Each ChampRs In Rs.Fields
' copie du nom de champ dans la cellule de la ligne NumLigne
' de la colonne NumColonne
XlSheet.Cells(NumLigne,NumColonne) = ChampRs.Name
Next ChampRs

Je te laisse tester. N'oublie pas d'initialiser et d'incrémenter NumLigne ou
NumColonne dans la boucle.

Bonne continuation

Avatar
PAULOM
Merci beaucoup pour ta reponse je teste tout ça ce soir et je te dit
mon avancement!
Merci à toi
Avatar
PAULOM
Voila ça marche impec:

Option Compare Database

Sub ExportTblAccessInExcel()
Dim Db As DAO.Database
Dim Rs As DAO.Recordset
Dim Xlapp As Excel.Application
Dim XlBook As Excel.Workbook
Dim XlSheet As Excel.Worksheet
Dim NomFeuille As String
Dim LigneCopiees As Long
On Error GoTo errOuvrirExcel
Set Xlapp = GetObject(, "Excel.Application")
'On Error GoTo oups:
On Error GoTo 0
Xlapp.Visible = True
NomFeuille = "S" & DatePart("ww", Date) - 1
SemPrec = "S" & DatePart("ww", Date) - 2

Set XlBook = Xlapp.Workbooks.Open("C:Documents and
SettingsA4382BureaustageNvx_clients_par_BG_2006_S14.xls")

If FeuilleExiste(NomFeuille, XlBook) Then
Set XlSheet = XlBook.Worksheets(NomFeuille)
' efface les données
XlSheet.Cells.Clear
Else
' Ajouter nouvelle feuille en dernière position
Set XlSheet = XlBook.Worksheets.Add(,
XlBook.Worksheets(XlBook.Worksheets.Count - 2))
XlSheet.Name = NomFeuille

End If
' Worksheets("S0").Copy After:=Worksheets("S14")
Set Db = CurrentDb

' Copie dans feuille (nouvelle ou effacée)

If DCount("*", "T31_Cumul_Nvx_clients_par_BG") > 0 Then
Set Db = CurrentDb
' Copie dans feuille (nouvelle ou effacée)
Set Rs = Db.OpenRecordset("T31_Cumul_Nvx_clients_par_BG", ,
dbOpenForwardOnly)
For I = 0 To Rs.Fields.Count - 1
XlSheet.Cells(1, I + 1) = Rs.Fields(I).Name
Next I
Rs.MoveFirst
LigneCopiees = XlSheet.Range("A2").CopyFromRecordset(Rs)
' Ferme les Var
Rs.Close: Set Rs = Nothing
Db.Close: Set Db = Nothing
Else
MsgBox "Pas de données"
End If

'copie SXX dans S0
Sheets(NomFeuille).Select
Range("A1:G1").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Names.Add Name:="Semaine",
RefersToR1C1:="=S16!R1C1:R111C7"
Sheets(NomFeuille).Select
Selection.Copy
Sheets("S0").Select
Range("A1:A1").Select
ActiveSheet.Paste
ActiveSheet.Paste
'Copie la semaine précedente dans Semaine-1
Sheets(SemPrec).Select
Cells.Select
Selection.Copy
Sheets("Semaine S-1").Select
Cells.Select
ActiveSheet.Paste
'Application.CutCopyMode = False
Sheets("S0").Select
' Ferme les Var
Set XlSheet = Nothing
' Sauve le fichier
XlBook.Save
'XlBook.Close
Set XlBook = Nothing
Set Xlapp = Nothing
Exit Sub
errOuvrirExcel:
'Err 429 : Un serveur OLE Automation ne peut pas créer d'objet
' -> Excel n'est PAS encore ouvert.
If Err = 429 Then
Set Xlapp = CreateObject("Excel.Application")
Resume Next
End If
oups:
MsgBox Err.Number & " - " & Err.Description
End Sub
Function FeuilleExiste(NomFeuille As String, Classeur As
Excel.Workbook) As Boolean
Dim errNum As Long, strName As String
errNum = 0: Err.Clear
On Error Resume Next
strName = Classeur.Worksheets(NomFeuille).Name
errNum = Err.Number
On Error GoTo 0
If errNum = 0 Then FeuilleExiste = True Else FeuilleExiste = False
End Function
Avatar
Gilles MOUGNOZ
Voila ça marche impec:
...


Encore une victoire de canard ! ;o)