Incrémenter régulièrement un onglet Excel à partir d'une table ACCESS
Messieurs-dames bonjour !
En ce jour ensoleillé, j'essaie de finir un projet sur ACCESS et un coup de pouce serait le bienvenu si vous tomber sur mon topic..
En résumé:
- j'ai crée une base ACCESS qui me fourni tous les jours une table "RESULTATS_J" avec des données mise à jour --> ça, c'est OK.
--> je souhaite, via un bouton de mon formulaire ACCESS, ajouter ces données à un fichier excel "VENTES" déjà existant (onglet "RECAP"), sans supprimer les données présentes dans cet onglet.
C'est à dire, je cherche la 1ere ligne non vide de mon onglet excel existant, et je copie-colle mes données de la table access à la suite
J'ai trouvé la façon d'exporter mes données dans mon fichier excel, mais ça écrase les données à chaque fois, or je veux les incrémenter à la suite..
Ma première question:
- Est ce réalisable sur le principe ?
- Est ce que quelqu'un a des billes à me fournir ou un exemple existant dont je pourrai m'inspirer ?
Merci à bientôt
Bonjour Sidwel,
à tester,
Set wk = Workbooks("MonFichierExcel.xlsm") 'à adapter
Set sh = wk.Sheets("Feuil1") 'à adapter
LastRow = sh.Cells(Rows.Count, "A").End(xlUp).Row + 1 ' + 1 pour la première ligne videBonjour i20100
Merci pour ton retour
Alors pour aller chercher la 1ere ligne non vide, je vois le code à utiliser. Mais ma question c'est plus sur comment incorporer ceci dans ma base existante ?
Je n'ai pas crée de module VBA directement dans ma base, j'ai utilisé la fonctionnalité "macro" via l'action "ImporterExporterFeuilleDeCalcul". Et en convertissant la macro en VB (fonctionnalité ACCESS qui me dépanne bien
Function Export_VENTES()
End Function
--> Je me demande comment intégrer la notion de recherche de la 1ere ligne non vide de l'onglet excel où je déverse ma table access?
J'aurai dû commencer par fournir ces lignes de codes dans mon message initial, désolée !
re,
est ce que le fichier "VENTES.xlsx" est ouvert au moment du transfert ?
et au moment de l'exécution de Function Export_VENTES() ?
re,
voici un exemple pour connaitre la première cellule vide de la colonne A
Sub Test_LastRow()
Dim Fichier As String, NomFeuille As String, texte_SQL As String
Dim cn As Object 'ADODB.Connection
Dim Rst As Object 'ADODB.Recordset
Fichier = "C:\Users\isabelle\Documents\test ADODB\Data_Demo_ADO.xlsx" 'à adapter
NomFeuille = "Donnees" 'à adapter
Set cn = New ADODB.Connection
With cn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
Set Rst = New ADODB.Recordset
Rst.Open texte_SQL, cn, adOpenKeyset, adLockOptimistic
Rst.MoveLast
MsgBox Range("A" & Rst(0) + 2).Address
.Close
End With
End SubMerci pour ce retour
Mon fichier Excel est toujours fermé et c’est access qui l’ouvre pour copier coller les données.
Je regarde ce bout de code et je vous fais un retour dans la soirée, je vais essayer de joindre le fichier, ce sera plus parlant pour échanger.
re,
si le fichier excel a été ouvert au moment de l'exécution de Export_VENTES
il y a possibilité de faire plus simple,
as-tu attribue une référence d'objet à application excel et au fichier excel pour l'ouvrir ?
Re I20100,
Je ne peux pas te joindre ma base de données car le site ne prend pas l'extension
Sais tu comment je pourrai te la partager ? ça serait vraiment plus explicite. J'ai crée une base "fake" juste pour ne pas mettre les données professionnelles, mais le principe est exactement le même !
Je pense que oui, le fichier excel s'ouvre quand access lancer l'export, mais cela ne se voit pas (ou alors ça va très vite..).
De mon côté, j'ai "juste" utilisé une "action" disponible dans ACCESS pour exporter ma table "T_ResultatsNew" et le bout de code que ça produit est le suivant:
[size=85]Option Compare Database
End Function[/size]
Merci encore..
re,
à tester sur un Module,
Sub Export_After_LastRow()
Dim Fichier As String, NomFeuille As String, texte_SQL As String, rng As String
Dim cn As Object
Dim Rst As Object
Fichier = "C:\Users\isabelle\Documents\test ADODB\Data_Demo_ADO.xlsx" 'à adapter
NomFeuille = "Donnees" 'à adapter
Set cn = New ADODB.Connection
With cn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" _
& Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
Set Rst = New ADODB.Recordset
Rst.Open texte_SQL, cn, adOpenKeyset, adLockOptimistic
Rst.MoveLast
rng = NomFeuille & "!" & Range("A" & Rst(0) + 2).Address
.Close
End With
Export_VENTES Fichier, rng
End Sub
Function Export_VENTES(Fich, cellule)
On Error GoTo Export_VENTES_Err
DoCmd.TransferSpreadsheet acExport, 8, "RESULTATS_J", Fich, True, cellule
Export_VENTES_Exit:
Exit Function
Export_VENTES_Err:
MsgBox Error$
Resume Export_VENTES_Exit
End FunctionBonjour I20100
J'ai une "erreur de compilation: type défini par l'utilisateur non défini" en ce qui concerne le New ADODB.Connection
L'idée ensuite c'est de faire une sub qui appelle Sub Export_After_LastRow() et Function Export_VENTES(Fich, cellule) ?
[size=85]Sub Export_After_LastRow()
End Function[/size]
Je dois continuer à travailler dessus aujourd'hui, au plaisir de te lire !
Merci et bonne journée
re,
J'ai une "erreur de compilation: type défini par l'utilisateur non défini" en ce qui concerne le New ADODB.Connection
il faut activer la référence: Microsoft ActiveX Data Objects xx Library
L'idée ensuite c'est de faire une sub qui appelle Sub Export_After_LastRow() et Function Export_VENTES(Fich, cellule) ?
tu peux appeler la macro Sub Export_After_LastRow() celle-ci appel la Function Export_VENTES(Fich, cellule)
ok pour la référence, je n'avais pas coché la bonne.
Je pense qu'on se rapproche!! mais il ne reconnait pas "Range" qui est souligné quand je lance l’exécution: "erreur de compilation: sub ou fonction non définie"
Peut être à cause du Rst qu'il ne prend pas car c'est une variable ?
Ce range c'est bien la 1ere cellule non vide en colonne A ?
J'ai essayé avec cells( ) : mais j'ai le même message d'erreur
rng = NomFeuille & "!" & cells(Rst(0) + 2, 1).Address
----------------Code--------------------------
[size=85]Option Compare Database
End Function[/size]
re,
ok, remplace la ligne
rng = NomFeuille & "!" & Range("A" & Rst(0) + 2).Addresspar
rng = NomFeuille & "!A" & Rst(0) + 2voici une nouvelle version avec ACE
Sub Export_After_LastRow()
Dim Fichier As String, NomFeuille As String, texte_SQL As String, rng As String
Dim cn As Object
Dim Rst As Object
Fichier = "C:\Users\isabelle\Documents\test ADODB\Data_Demo_ADO.xlsx" 'à adapter
NomFeuille = "Donnees" 'à adapter
Set cn = New ADODB.Connection
With cn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
Set Rst = New ADODB.Recordset
Rst.Open texte_SQL, cn, adOpenKeyset, adLockOptimistic
Rst.MoveLast
rng = NomFeuille & "!A" & Rst(0) + 2
.Close
End With
Export_VENTES Fichier, rng
End Sub
Function Export_VENTES(Fich, cellule)
On Error GoTo Export_VENTES_Err
DoCmd.TransferSpreadsheet acExport, 8, "RESULTATS_J", Fich, True, cellule
Export_VENTES_Exit:
Exit Function
Export_VENTES_Err:
MsgBox Error$
Resume Export_VENTES_Exit
End FunctionEn effet, en remplaçant JET par ACE, ça tourne.
Ce que je trouve bizarre c'est qu'il me dit que ma table a un nom non valide, pourtant je l'ai appelé "T_ResultatsNew"
Il a rajouté &A19/02/2019 au nom.. ?
Alors en effet, la dernière cellule nom vide avait la date 17/02/2019 donc +2 ça fait 19/02/2019.. mais pourquoi me le rajoute t-il lors de l'export..?
re,
un autre essai avec Rst.RecordCount
Sub Export_After_LastRow()
Dim Fichier As String, NomFeuille As String, texte_SQL As String, rng As String, n As Long
Dim cn As Object
Dim Rst As Object
Fichier = "C:\Users\isabelle\Documents\Test1\base2.xlsx" 'à adapter
NomFeuille = "Feuil1" 'à adapter
Set cn = New ADODB.Connection
With cn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
Set Rst = New ADODB.Recordset
Rst.Open texte_SQL, cn, adOpenKeyset, adLockOptimistic
n = Rst.RecordCount + 2
rng = NomFeuille & "!A" & n
.Close
End With
Export_VENTES Fichier, rng
End Sub

