Export Excel --> Access avec VBA depuis Access

Export Excel --> Access avec VBA depuis Access - VB/VBA/VBS - Programmation

Marsh Posté le 09-06-2009 à 15:36:00    


 

Citation :

Bonjour,
Je fais une fonction en vba qui va exporter les données d'une colonne d'une feuille excel dans le cchamp corrspondant en Access:
Or dans la boucle do while quand je veux mettre le contenu d'une cellule dans un champ de la table tbl_personnes, ça m'affiche une erreur au niveau de la condition de la boucle.
Pourriez vous m'aider svp.
Merci d'avance.
 


Option Compare Database
 
 
Function ExportRabih() As Integer
 
 
Dim NomFic As String
 
Dim Db As DAO.Database
Dim fldId_Personne As DAO.Field
Dim fldPrenom As DAO.Field
 
 
Dim appExcel As Object
Dim Xlwb As Object
 
Dim rs As DAO.Recordset
Dim deb As Integer
Dim ws As Object
 
 
MsgBox "Bonjour"
Set appExcel = CreateObject("Excel.Application" )
appExcel.Visible = True
Set Xlwb = appExcel.Workbooks.Open("C:\Users\rmahfouz\Desktop\Classeur1.xlsx" )
Set ws = Xlwb.Sheets(1)
MsgBox ws.Cells(1, 1)
Set Db = CurrentDb
Set rs = Db.OpenRecordset("tbl_personnes", dbOpenTable)
 
 
deb = 1
 
Do While Len(ws.Range("A" & r).Formula) > 0
 
With rs
.AddNew
MsgBox ws.Cells(1, deb)
.Fields("Prenom" ) = ws.Cells(1, deb)
.Update
End With
deb = deb + 1
Loop
 
 
 
 
rs.Close
Set rs = Nothing
Db.Close
Set Db = Nothing
ExportRabih = 1
End Function
[quote]

Reply

Marsh Posté le 09-06-2009 à 15:36:00   

Reply

Marsh Posté le 09-06-2009 à 16:02:40    

Citation :

Do While Len(ws.Range("A" & r).Formula) > 0

D'où vient le r dans "A" & r ? C'est problablement un numéro de ligne (row), mais il faudrait lui donner une valeur, par exemple r = 1

Reply

Marsh Posté le 09-06-2009 à 19:25:02    

olivthill a écrit :

Citation :

Do While Len(ws.Range("A" & r).Formula) > 0

D'où vient le r dans "A" & r ? C'est problablement un numéro de ligne (row), mais il faudrait lui donner une valeur, par exemple r = 1


 
Je plussoie : Range("A0" ) va te retourner une erreur, c'est sûr. Il faut absolument que ta variable "r" soit initialisée sous peine de plantage. Mais j'ai l'impression que c'est une coquille, c'était pas "deb" que tu voulais mettre à la place de "r" ?


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 10-06-2009 à 11:04:11    

Bonjour,
C'était just eune coquille mais là j'ai un autre souci,
Je te renvoie mon code :

Citation :


Option Compare Database
 
 
 
Function ExportRabih() As Integer
 
 
Dim NomFic As String
 
Dim Db As DAO.Database
Dim fldId_Personne As DAO.Field
Dim fldPrenom As DAO.Field
 
 
Dim appExcel As Object
Dim Xlwb As Object
 
Dim rs As DAO.Recordset
Dim deb As Integer
Dim ws As Object
 
 
MsgBox "Bonjour"
Set appExcel = CreateObject("Excel.Application" )
appExcel.Visible = True
Set Xlwb = appExcel.Workbooks.Open("C:\Users\rmahfouz\Desktop\Classeur1.xlsx" )
Set ws = Xlwb.Sheets(1)
MsgBox ws.Cells(1, 1)
Set Db = CurrentDb
Set rs = Db.OpenRecordset("tbl_personnes", dbOpenTable)
 
 
 
 
rs.AddNew
rs.Fields("Prenom" ).Value = Range("A1" ).Value
rs.Update
 
 
 
 
 
 
rs.Close
Set rs = Nothing
Db.Close
Set Db = Nothing
ExportRabih = 1
End Function
 


 
Il m'affiche l'erreur de compilation suivante :  
 
Erreur d'exécution '1004'
La méthode 'Range' de l'objet '_Global' a échoué.
 
Je t eremercie d'avance

Reply

Marsh Posté le 10-06-2009 à 11:13:31    

Ce programme tourne du côté d'Access, qui ne connait pas Range.
La solution est

rs.Fields("Prenom" ).Value = ws.Range("A1" ).Value

Reply

Marsh Posté le 10-06-2009 à 11:21:39    

Apparemment ça marche pas, y'a toujours une erreur.
Merci quand même.
Si t'as une autre idée, n'hésites pas à m'écrire.
Merci d'avance

Reply

Marsh Posté le 10-06-2009 à 11:22:16    

mais sans le message d'erreur dont j'ai cité la dessus

Reply

Marsh Posté le 10-06-2009 à 11:24:17    

Une autre idée :

rs.Fields("Prenom" ).Value = ws.Cells(1, 1).value

Reply

Marsh Posté le 10-06-2009 à 11:24:48    

Le nom de la colonne d'excel que je souhaite exporter est A. Le nom du champ de ma table créée sous Access 'tbl_personnes' est Prenom.
Le nom du champ et celui de la colonne devraient t'ils obligatoirement être les mêmes?
Merci

Reply

Marsh Posté le 10-06-2009 à 11:26:27    

Le nom du champ Access n'a pas de rapport avec le nom de la colonne Excel. le lien se fait avec le signe égal.

Reply

Marsh Posté le 10-06-2009 à 11:26:27   

Reply

Marsh Posté le 10-06-2009 à 11:26:41    

C'est pas parceque je lu' pas spécifié la table dans laquelle se trouve le champ Prenom?

Reply

Marsh Posté le 10-06-2009 à 11:27:40    

Tu l'as spécifié là : Set rs = Db.OpenRecordset("tbl_personnes", dbOpenTable)  
Donc normalement il devrait le savoir.

Reply

Marsh Posté le 10-06-2009 à 11:27:45    

Le nom de la table est connu grâce à la déclaraction de rs (recordset).

Reply

Marsh Posté le 10-06-2009 à 11:29:35    

Ah oui c'est vrai ;-).
Je suis con.lol.
La solution alors?
j'ai trop cherché sur internet et partout ils mettent la même chose

Reply

Marsh Posté le 10-06-2009 à 11:36:54    

Le message d'erreur ne concernait pas rs.Fields mais concernait Range, qu'il fallait préfixer, c'est certain. Je pensais à le préfixer par ws, mais si ça ne marche pas, alors, il vaut mieux peut-être abandonné Range et utiliser Cells qui devrait marcher et revenir au même. Donc

rs.Fields("Prenom" ).Value = ws.Cells(1, 1).value


Reply

Marsh Posté le 10-06-2009 à 12:06:41    

Même avec ça y'a toujours une erreur je ne comprends toujours pas.
Peut etre que sous Microsoft Visual basic, faut activer une librairie ds Outils --> Références???

Reply

Marsh Posté le 10-06-2009 à 19:44:06    

rabihm81 a écrit :

Même avec ça y'a toujours une erreur je ne comprends toujours pas.
Peut etre que sous Microsoft Visual basic, faut activer une librairie ds Outils --> Références???


Non, ça m'étonnerait.
 
Déjà, que te retourne ton "MsgBox ws.Cells(1, 1) " ? S'il te retourne bien la valeur que tu veux, alors il faut définitivement utiliser "ws.Cells(1, 1).value" dans la deuxième partie de ton instruction "rs.Fields("Prenom" ).Value = ws.Cells(1, 1).value", tu sauras que c'est bon et que le problème ne vient pas de là.
 
Pour moi, c'est la première partie de ton instruction qui merde (ton "Erreur d'exécution '1004' La méthode 'Range' de l'objet '_Global' a échoué." a dû être résolu par l'ajout du "ws" devant). Tu devrais peut-être essayer avec "rs![Prenom] = ws.Cells(1, 1).value" (et c'est bien "Prenom" et pas "Prénom" dans ta table ?)
Sinon, il ne veut peut-être pas créer de nouvel enregistrement si tu ne peuples pas le champ correspondant à ta clé primaire dans ta table "tbl_personnes", et ça m'étonnerait que tu utilises le champ "Prénom" comme clé (ou alors tu t'exposes à de gros problèmes plus tard !  :D )
 
Voila quelques idées à tester/creuser.


---------------
If you think it could look good, then I guess it should
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed