petit proble avec VBA - VB/VBA/VBS - Programmation
Marsh Posté le 09-04-2003 à 15:46:56
Toun a écrit : Voila , j'ai programmé une application VBA pour inserer des champs d'une feuille de calcul Excel dans une base de donnée Access. Mais j'ai un petit pb, il insere une seule ligne correctement, ensuite, il plante au niveau du second update. Et voici l'erreur qu'il me met: |
je crois que c'est parce que tu as oublié: num=num+1
.AddNew
num=num+1
.Fields("Numéro" ) = num
sinon tu es sur que:
Set Plage = Plage.Resize(Plage.Rows.Count - 1, Plage.Columns.Count)
Plage.Select
est necessaire ?
array1=plage suffit (pas besoin de mettre .value)
Marsh Posté le 09-04-2003 à 15:58:24
_pour array1=plage.value, c'est juste, le value n'est pas utile.
_Pour Set Plage = Plage.Resize(Plage.Rows.Count - 1, Plage.Columns.Count)
Plage.Select
Tu me conseillerais de mettre quoi a la place?
_Et pour l'incrementation de num, c'est la meme chse si je l'incremente avant.
PS: soit indulgent, je commence VB depuis ce matin, alor je ne connais pas grand chose!
Encore une petite questio, comment tu peux dire dans une condition que deux truc sont different
(ex en java: truc1 != truc2)
Merci
Marsh Posté le 09-04-2003 à 16:04:27
Toun a écrit : _pour array1=plage.value, c'est juste, le value n'est pas utile. |
essaye de supprimer la ligne pôur voir
pour num il faut juste ne pas oublier de l'incrementer
if ch1 <> ch2 then
endif
Marsh Posté le 09-04-2003 à 16:11:25
Aparament, t'avais raison, les lignes
Set Plage = Plage.Resize(Plage.Rows.Count - 1, Plage.Columns.Count)
Plage.Select
ne sont pas utiles, ou du moins y'a pas de difference.
Mais c'est toujours la même chose, c'est a dire qu'il arrive a inserer la premiere ligne sans probleme, ensuite, pour le deuxieme enregistrement, il plante au niveau du update!
Marsh Posté le 09-04-2003 à 16:17:33
Toun a écrit : Aparament, t'avais raison, les lignes |
si tu as bien incrementer num je vois pas trop
teste avec tes msgbox() les differentes valeurs des variables pas a pas pour voir
Marsh Posté le 09-04-2003 à 16:44:56
A mon avis, ça ne viens pas de l'incrementation, car si je ne met pas le numero dans la base, ça plante aussi.
c'est chiant, ça fait une demi journée que je traine sur ce truc.
Merci quand même, tu m'as beaucoup aidé!
Marsh Posté le 09-04-2003 à 17:12:09
En fait, j'ai trouver pourquoi il ne voulait pas m'en inserer de nouvelles. C'est parce-que il essaie d'inserer la même ligne de la feuille de calcul il ne passe pas a la suivante, et àa, je ne comprend pas pourquoi.
Si t'as des idée, je suis ouvert.
Marsh Posté le 10-04-2003 à 06:32:51
bon bah moi j'ai fait ça et ça marche
mais c'est peut etre ds ta feuille excel que ça deconne,il faut verifier que tes données sont bien disposées de maniere a ce qu'il n'y ait pas de trous :
Sub WritingWorksheetData()
Dim Plage As Range
Dim Array1 As Variant
Dim x As Variant
Dim Db1 As Database
Dim Rs1 As Recordset
Dim num As Integer
num = 0
Set Db1 = DBEngine.OpenDatabase(ThisWorkbook.Path & "\Essai_base_produit.mdb" )
Set Rs1 = Db1.OpenRecordset("produit", dbOpenDynaset)
Set Plage = Worksheets("europrices" ).Range("A1" ).CurrentRegion.Offset(1, 0)
Array1 = Plage
For x = 1 To UBound(Array1, 1)
num = num + 1
With Rs1
.AddNew
.Fields("Numéro" ) = num
.Fields("Nom" ) = Array1(x, 3)
.Fields("CAS Number" ) = Array1(x, 1)
.Fields("Fournisseur" ) = "Avocado"
.Fields("Product code" ) = Array1(x, 2)
.Fields("Quality" ) = Array1(x, 10)
.Fields("Molecular weight" ) = Array1(x, 11)
.Fields("Molecular formula" ) = Array1(x, 12)
.Update
End With
Next
Essai_base_produit.Close
End Sub
il faut pas oublier les references a access et microsoft dao 2.5 ds ton module bien sur.
Marsh Posté le 10-04-2003 à 10:47:03
C bon, j'ai trouvé, c'est une erreur con!
En fait, j'ai une colonne "specification" dans ma feuille de calcul, qui correspond a un pourcentage. Mais dans la deuxieme ligne, le pourcentage est accompagner d'un + : "98+", et dans ma table access, le type etait numerique. Honte a moi!!!!
Merci quand même d'avoir utilisé tous ce temps pour moi. A+
Marsh Posté le 09-04-2003 à 14:24:36
Voila , j'ai programmé une application VBA pour inserer des champs d'une feuille de calcul Excel dans une base de donnée Access. Mais j'ai un petit pb, il insere une seule ligne correctement, ensuite, il plante au niveau du second update. Et voici l'erreur qu'il me met:
"Erreur d'execution '3022'
Erreur definie par l'application ou par l'objet"
et vu les erreurs floues de VBA, je ne comprend pas trop ce qui se passe!!!
Voici mon petit bout de programme:
Sub WritingWorksheetData_DAO()
Dim Plage As Range
Dim Array1 As Variant
Dim x As Variant
Dim Db1 As Database
Dim Rs1 As Recordset
Dim num As Integer
num = 0
' Ouverture de la base de données Essai_base_produit.mdb
Set Db1 = DBEngine.OpenDatabase(ThisWorkbook.Path & "\Essai_base_produit.mdb" )
' Ouverture de la table commande
' Un objet Recordset représente les enregistrements d'une table
Set Rs1 = Db1.OpenRecordset("produit", dbOpenDynaset)
' Détermination de la taille de la plage à envoyer vers Access
Set Plage = Worksheets("europrices" ).Range("A1" ).CurrentRegion.Offset(1, 0)
Set Plage = Plage.Resize(Plage.Rows.Count - 1, Plage.Columns.Count)
Plage.Select
' Lecture de la plage pour renvoyer une valeur contenant un tableau
Array1 = Plage.Value
' Ecriture des données depuis Excel vers les enregistrement de la table commande
For x = 1 To UBound(Array1, 1)
With Rs1
.AddNew
.Fields("Numéro" ) = num + 1
.Fields("Nom" ) = Array1(x, 3)
.Fields("CAS Number" ) = Array1(x, 1)
.Fields("Fournisseur" ) = "Avocado"
.Fields("Product code" ) = Array1(x, 2)
.Fields("Quality" ) = Array1(x, 10)
.Fields("Molecular weight" ) = Array1(x, 11)
.Fields("Molecular formula" ) = Array1(x, 12)
.Update
End With
Next
' Fermeture de la base Essai_base_produit.mdb
Essai_base_produit.Close
End Sub