Incrémenter régulièrement un onglet Excel à partir d'une table ACCESS
re,
as-tu mis le ! avant le A ?
rng = NomFeuille & "!A" & noui il y est @I20100
Je te mets le code :
[size=85]Option Compare Database
End Function[/size]
re,
tu n'a pas essayer avec mon dernier envoi 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 SubRe,
Il me semble que si, j'ai bien la ligne avec Rst.RecordCount+2
n = Rst.RecordCount + 2
En fait j'avais mis les autres lignes en commentaire, je les ai carrément supprimé du coup. Mais j'ai tjs la même fenêtre qui s'affiche malheureusement..
[size=85]
End Sub[/size]
Bonjour Sidwel ,
j'ai essayé de reproduire le problème, mais sans succès,
je ne comprend pourquoi le ! se transforme en $
Bonjour I20100
J'ai essayé d'avancer sur mon sujet..
Ce que je remarque c'est que quand j'enlève le "!" alors je n'ai pas de msg d'erreur mais ça ne fait pas le résultat attendu: ça prend ma table et ça la colle dans un nouvel onglet "ResultatsA20". Or je souhaite que ça incrémente mon onglet "Résultats" plutôt.. !!
Si quelqu'un peut m'aider..merci merci
[size=85]Option Compare Database
End Function[/size]
re,
peux-tu essayer cette macro pour voir si le problème du ! subsiste toujours,
le résultat devrait être T_ResultatsNew!A100
Sub test1()
NomFeuille = "T_ResultatsNew" 'adapté
n = 100
Rng = NomFeuille & "!" & Range("A" & n).Address(0, 0)
MsgBox Rng
End SubBonjour à tous,
Si je peux me permettre, on pourrait peut être aborder le problème d'une autre façon.
1/ Si j'ai bien compris, depuis Access on veux alimenter un fichier Excel. C'est bien ça?
2/ Si tout va bien l'onglet Excel est structuré en une colonne par champs, une ligne par enregistrement. C'est bien ça?
3/ Visiblement la méthode souhaitée passe par de l'ADODB. C'est bien ça?
Si j'ai bon sur les 3 questions précédentes, pourquoi ne pas utiliser un bon vieux INSERT classique du SQL?
Par ailleurs simple remarque, ACE est bien pour aller vers Access, mais pour se connecter vers Excel, MSDASQL est plus adapté, avec un truc genre :
Cnx.Provider = "MSDASQL"
Cnx.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
"DBQ=" & Fichier & "; ReadOnly=False;"Ceci étant dit, si le souhait est de récupérer le n° de la première ligne vide de l'onglet Excel, on peut écrire une p'tite fonction :
Function Derniere_ligne()
Dim Cnx As Object, Rst As Object
Dim Fichier As String, NomFeuille As String
Fichier = "C:\Users\isabelle\Documents\test ADODB\Data_Demo_ADO.xlsx" 'à adapter
NomFeuille = "Donnees" 'à adapter
Set Cnx = CreateObject("ADODB.Connection")
Cnx.Provider = "MSDASQL"
Cnx.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
"DBQ=" & Fichier & "; ReadOnly=False;"
Set Rst = CreateObject("ADODB.Recordset")
Rst.Open "SELECT * FROM [" & NomFeuille & "$]", Cnx, 3
Derniere_ligne = Rst.RecordCount + 2
Rst.Close
Cnx.Close
Set Cnx = Nothing
Set Rst = Nothing
End FunctionAvec un appel du genre :
Sub test()
Dim Rng As Range
Set Rng = Sheets("Resultats").Range("A" & Derniere_ligne)
MsgBox Rng.Address
End SubPierre
Bonjour Pierre, I20100 !
@I20100:
même message avec
rng = "Resultats!A" & n
@Pierre
Oui je veux incrémenter l'onglet Resultats de mon fichier Excel VENTES.xlsm
Mais je ne veux pas écraser mon onglet, je veux rajouter mes nouvelles données (table Resultats de Access) à la suite, d'où la nécessité d'aller chercher la 1ere ligne non vide de mon onglet Resultats
Peux tu me donner plus de détails?
Il ne se passe rien quand je lance la Function Dernière_Ligne --> cette fonction enregistre le numéro de la 1ere ligne non vide?
et j'ai un msg d'erreur lors du lancement de l'appel
Sub test() 'nouvelle proposition
Dim Rng As Range
[color=#FF0040] Rng = Sheets("Resultats").Range("A" & Derniere_ligne)[/color]
MsgBox Rng.Address
End Submerci merci
Ok,
Voici une démo de lecture/ecriture avec ADO :
* Un fichier "Principal.xlsm" avec quelques données quelconques
* Un fichier "Base.xlsx" avec d'autres données quelconques
Les 2 fichiers sont à placer dans un même dossier.
La procédure Démo() comporte 2 parties :
1/ une lecture ADO des données de la feuille active avec un SELECT (les données sont placées dans un tableau T)
2/ une écriture ADO de ces données lues (de T donc) dans le fichier "Base.xlsx" via un INSERT (sans écraser les données existantes!)
Mis à part la procédure Démo, l'ensemble du code peut être utilisé tel quel dans une autre appli VBA (dans Excel ou dans Access)
Dans ton cas, les données à injecter dans le fichier Excel de destination seront tes données Access mais le principe est exactement le même concernant le `INSERT` (et plus besoin de chercher le n° de la dernière ligne vide)
Est-ce que cet exemple est clair?
Pierre
NB, en SQL :
* pour injecter une date dans excel, on la transforme en entier long
* pour du texte, on l'entoure de guillemets et on double les apostrophes
* pour une valeur décimale, on substitue la virgule par un point
* les entêtes sont entourés par des guillemets `Alt Gr + 7 puis Backspace`
Voici une autre démo :
* fichier "Principal.xlsm"
* fichier "Base.xlsx"
* fichier access
Cette fois-ci la procédure "Démo" en plus va lire le .accdb pour injecter les données lues dans "Base.xlsx"
Pierre
Pierre,
merci pour ton aide!
Disons qu'avant de trouver ça fun il faut que je me l'approprie..
J'essaie de l'adapter à ma problématique, c'est à dire ma table Access "Resultats" et mon fichier Excel VENTES.xlsm/onglet Resultats
Dans l'exemple que tu m'as fourni,
T = ma table Access "Resultats" ?
Base.xlsx = mon fichier excel "VENTES" ?
Feuil1= mon onglet excel "Resultats"?
J'ai encore besoin d'aide je crois
Regarde plutôt dans la 2ème démo (parties 3 et 4) :
* source des données Access => Table `Donnees_demo` de la base `Base_demo.accdb`
* cible Excel => onglet `Feuil1` du fichier `Base.xlsx`
Pierre








