Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

help me please...

3 réponses
Avatar
Rémi
Bonjour,
j'avance mais en définitive il y a trop de chose que je ne comprends pas et
ça me bloque (il faut dire que je n'ai jamais suivi de cours de
programmation)
je tente d'adapter ce bout de code à mon cas pour récupérer des données vers
une table access mais je bute sur la compréhension des erreurs
si quelqu'un pouvait m'aider j'en serais très heureux
merci d'avance
Rémi

Dim Plage As Range
Dim Array1 As Variant
Dim x As Variant
Dim Db1 As Database
Dim Rs1 As Recordset
' Ouverture de la base de données ENRG_NVX.mdb
Set Db1 = DBEngine.OpenDatabase("B:\ENRG\ENRG_NVX.mdb")
' Ouverture de la table Factures
' Un objet Recordset représente les enregistrements d'une table
Set Rs1 = Db1.OpenRecordset("enrg", dbOpenDynaset)
' Détermination de la taille de la plage à envoyer vers Access
Set Plage = Worksheets("dossier de
fabrication").Range("D4").CurrentRegion.Offset(1, 0) --->ici j'ai mis la
cellule D4 mais sans savoir si c'est vraiment ça
Set Plage = Plage.Resize(Plage.Rows.Count - 1,
Plage.Columns.Count) --->ici il y a une erreur d'exécution '1004' : erreur
définie par l'application ou par l'objet
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
ENRG
For x = 1 To UBound(Array4, 4) --->ici j'ai indiqué la cellule D4 mais
je ne sais toujours pas si c'est ça
With Rs1
.AddNew
.Fields("date_arrivee") = Array1(11, 4) --->je veux
récupérer les données de la cellule K4
.Fields("dossier") = Array1(4, 4) --->je veux récupérer les
données de la cellule D4
.Fields("client") = Array1(4, 6) --->je veux récupérer les
données de la cellule D6
.Fields("designation") = Array1(4, 7) --->je veux récupérer
les données de la cellule D7
.Fields("quantite") = Array1(5, 10) --->je veux récupérer les
données de la cellule E10
.Fields("date_livraison") = Array1(17, 4) --->je veux
récupérer les données de la cellule Q4
.Update
End With
Next
' Fermeture de la base ENRG_NVX.mdb
Db1.Close
' Effacement des données copiées vers la base (sauf les titres)
With Selection.CurrentRegion
Intersect(.Cells, .Offset(1)).Select
End With
Selection.ClearContents

3 réponses

Avatar
FdeCourt
Salut,

Il y a une erreur, car tu demande à ce que la plage soit redefini avec
0 ligne, ce qui n'est pas possible puisque tu n'a mis qu'une cellule
(D4)

Ce bout de code :
Set Plage = Worksheets("dossier de fabrication").Range
("D4").CurrentRegion.Offset(1, 0)

te permet de sélectionner la plage D5.
Au lieu de mettre D4, tu devrais mettre toute la plage qui contient
les données que tu souhaites transférer dans Access (entetes de
colonne comprises), genre "A1:G5"

Avec le code ci-dessus, la plage sera automatiquement reduite aux
lignes et colonnes réellement utilisées, puis décaler d'une ligne ver s
le bas pour probablement éviter les entêtes.

ENsuite, le code Set plage = plage.Resize(plage.Rows.Count - 1,
plage.Columns.Count) te permet de réduire la taille de ta plage d'une
ligne.
Avec le code précédent, la plage a été décalée d'une ligne vers le
bas, donc au lien de A1:G5, plage est devenue A2:G6, or la ligne G6
est vide. Le Resize permet de retransformer plage en A2:G5.

Enfin, pour finir, je trouve que c'est une méthode bien compliquée
pour sélectionner une plage !!!!

Si je puis me permettre, essayes avec un truc comme ca :

Set plage = Range("A1").Resize(Cells(65536, 1).End(xlUp).Row - 1,
10).Offset(1, 0)

Ou tu mets la première cellule de ta plage de données (Range("A1")
Ou 10 correspond aux nombre de colonne dans ta plage de données
Le .Offset te permet d'exclure les entêtes. S'il n'y en a pas, tu peux
supprimer ce dernier bout de code (.Offset...)


Cordialement,

F.
Avatar
Daniel.C
Bonjour.
Tu mets :
Set Plage = Plage.Resize(Plage.Rows.Count - 1, Plage.Columns.Count)
Si la configuration de "Plage" est telle qu'elle n'a qu'une seule ligne
ou une seule colonne, alors tu cherches à définir une plage de 0 ligne
ou 0 colonne.
Pour t'en assurer, essaie :

Set Plage = Worksheets("dossier de
fabrication").Range("D4").CurrentRegion.Offset(1, 0)
MsgBox "nbre de lignes : " & Plage.Rows.Count
MsgBox "nbre de colonnes : " & Plage.Columns.Count
Set Plage = Plage.Resize(plage.Rows.Count - 1, plage.Columns.Count)

Cordialement.
Daniel
Bonjour,
j'avance mais en définitive il y a trop de chose que je ne comprends pas et
ça me bloque (il faut dire que je n'ai jamais suivi de cours de
programmation)
je tente d'adapter ce bout de code à mon cas pour récupérer des données vers
une table access mais je bute sur la compréhension des erreurs
si quelqu'un pouvait m'aider j'en serais très heureux
merci d'avance
Rémi

Dim Plage As Range
Dim Array1 As Variant
Dim x As Variant
Dim Db1 As Database
Dim Rs1 As Recordset
' Ouverture de la base de données ENRG_NVX.mdb
Set Db1 = DBEngine.OpenDatabase("B:ENRGENRG_NVX.mdb")
' Ouverture de la table Factures
' Un objet Recordset représente les enregistrements d'une table
Set Rs1 = Db1.OpenRecordset("enrg", dbOpenDynaset)
' Détermination de la taille de la plage à envoyer vers Access
Set Plage = Worksheets("dossier de
fabrication").Range("D4").CurrentRegion.Offset(1, 0) --->ici j'ai mis la
cellule D4 mais sans savoir si c'est vraiment ça
Set Plage = Plage.Resize(Plage.Rows.Count - 1, Plage.Columns.Count)
--->ici il y a une erreur d'exécution '1004' : erreur définie par
l'application ou par l'objet
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
ENRG
For x = 1 To UBound(Array4, 4) --->ici j'ai indiqué la cellule D4 mais
je ne sais toujours pas si c'est ça
With Rs1
.AddNew
.Fields("date_arrivee") = Array1(11, 4) --->je veux récupérer
les données de la cellule K4
.Fields("dossier") = Array1(4, 4) --->je veux récupérer les
données de la cellule D4
.Fields("client") = Array1(4, 6) --->je veux récupérer les
données de la cellule D6
.Fields("designation") = Array1(4, 7) --->je veux récupérer
les données de la cellule D7
.Fields("quantite") = Array1(5, 10) --->je veux récupérer les
données de la cellule E10
.Fields("date_livraison") = Array1(17, 4) --->je veux
récupérer les données de la cellule Q4
.Update
End With
Next
' Fermeture de la base ENRG_NVX.mdb
Db1.Close
' Effacement des données copiées vers la base (sauf les titres)
With Selection.CurrentRegion
Intersect(.Cells, .Offset(1)).Select
End With
Selection.ClearContents


Avatar
Rémi
je te remercie infinimentde ton aide, j'ai appliqué tes explications et ton
correctif et je m'en suis tiré
encore merci
Rémi


"FdeCourt" a écrit dans le message de
news:
Salut,

Il y a une erreur, car tu demande à ce que la plage soit redefini avec
0 ligne, ce qui n'est pas possible puisque tu n'a mis qu'une cellule
(D4)

Ce bout de code :
Set Plage = Worksheets("dossier de fabrication").Range
("D4").CurrentRegion.Offset(1, 0)

te permet de sélectionner la plage D5.
Au lieu de mettre D4, tu devrais mettre toute la plage qui contient
les données que tu souhaites transférer dans Access (entetes de
colonne comprises), genre "A1:G5"

Avec le code ci-dessus, la plage sera automatiquement reduite aux
lignes et colonnes réellement utilisées, puis décaler d'une ligne vers
le bas pour probablement éviter les entêtes.

ENsuite, le code Set plage = plage.Resize(plage.Rows.Count - 1,
plage.Columns.Count) te permet de réduire la taille de ta plage d'une
ligne.
Avec le code précédent, la plage a été décalée d'une ligne vers le
bas, donc au lien de A1:G5, plage est devenue A2:G6, or la ligne G6
est vide. Le Resize permet de retransformer plage en A2:G5.

Enfin, pour finir, je trouve que c'est une méthode bien compliquée
pour sélectionner une plage !!!!

Si je puis me permettre, essayes avec un truc comme ca :

Set plage = Range("A1").Resize(Cells(65536, 1).End(xlUp).Row - 1,
10).Offset(1, 0)

Ou tu mets la première cellule de ta plage de données (Range("A1")
Ou 10 correspond aux nombre de colonne dans ta plage de données
Le .Offset te permet d'exclure les entêtes. S'il n'y en a pas, tu peux
supprimer ce dernier bout de code (.Offset...)


Cordialement,

F.