petit proble avec VBA

petit proble avec VBA - VB/VBA/VBS - Programmation

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
 
 
 

Reply

Marsh Posté le 09-04-2003 à 14:24:36   

Reply

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:  
 
"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
 
 
 
 

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)
                 

Reply

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

Reply

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.
 
_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

essaye de supprimer la ligne pôur voir
 
pour num il faut juste ne pas oublier de l'incrementer
 
if ch1 <> ch2 then
 
 
endif

Reply

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!

Reply

Marsh Posté le 09-04-2003 à 16:17:33    

Toun a écrit :

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!


 
si tu as bien incrementer num je vois pas trop
teste avec tes msgbox() les differentes valeurs des variables pas a pas pour voir

Reply

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é!

Reply

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.

Reply

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.

Reply

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+
  :D

Reply

Sujets relatifs:

Leave a Replay

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