Message d'erreur 1004 VBA excel
SD71
-
pilas31 Messages postés 1878 Statut Contributeur -
pilas31 Messages postés 1878 Statut Contributeur -
Bonjour,
Je débute en VBA, je me suis acheté un bouquin avec des exercices que j'essaie d'adapter à mes besoins!
Je cherche à automatiser une facture, j'ai créer un classeur liste client avec feuil1 facture, feuil2 clients, feuil3 prestations
A l'aide du livre j'ai voulu créer un formulaire de facture (conception d'une interface graphique)
Mais là, j'ai un message d'erreur 1004, erreur définie par l'application ou par l'objet!
Lorsque je fais le débogage pas à pas ça m'indique un passage de la programmation que j'ai justement tenté d'adapter à mes besoins
Private Sub UserForm_Initialize()
CmdValid.Visible = True
Me("Code_prest" & i).List = (Sheets("Prestations").Range([A2], [A2].End(x1Down)))
Me("Nom" & i).List = (Sheets("Clients").Range([A2], [A2].End(x1Down)))
End Sub
Sur le bouquin c'est ça
Private Sub UserForm_Initialize()
CmdValid.Visible = True
Me("Code_prest" & i).List = (Range([H2], [H2].End(x1Down)))
Me("Nom" & i).List = (Range([M2], [M2].End(x1Down)))
End Sub
H2 correspondant à la 1ère référence produit et M2 au 1er nom client qui dans l'exemple sont sur la même feuille que la facture
Or pour mes besoins c'est sur des feuilles séparées, seulement le bouquin n'explique pas comment faire dans ces cas là, j'ai donc parcouru internet pour tenter de solutionner le problème mais en vain!
Pourriez vous m'aider, s'il vous plait
Merci
Je débute en VBA, je me suis acheté un bouquin avec des exercices que j'essaie d'adapter à mes besoins!
Je cherche à automatiser une facture, j'ai créer un classeur liste client avec feuil1 facture, feuil2 clients, feuil3 prestations
A l'aide du livre j'ai voulu créer un formulaire de facture (conception d'une interface graphique)
Mais là, j'ai un message d'erreur 1004, erreur définie par l'application ou par l'objet!
Lorsque je fais le débogage pas à pas ça m'indique un passage de la programmation que j'ai justement tenté d'adapter à mes besoins
Private Sub UserForm_Initialize()
CmdValid.Visible = True
Me("Code_prest" & i).List = (Sheets("Prestations").Range([A2], [A2].End(x1Down)))
Me("Nom" & i).List = (Sheets("Clients").Range([A2], [A2].End(x1Down)))
End Sub
Sur le bouquin c'est ça
Private Sub UserForm_Initialize()
CmdValid.Visible = True
Me("Code_prest" & i).List = (Range([H2], [H2].End(x1Down)))
Me("Nom" & i).List = (Range([M2], [M2].End(x1Down)))
End Sub
H2 correspondant à la 1ère référence produit et M2 au 1er nom client qui dans l'exemple sont sur la même feuille que la facture
Or pour mes besoins c'est sur des feuilles séparées, seulement le bouquin n'explique pas comment faire dans ces cas là, j'ai donc parcouru internet pour tenter de solutionner le problème mais en vain!
Pourriez vous m'aider, s'il vous plait
Merci
A voir également:
- Message d'erreur 1004 VBA excel
- Liste déroulante excel - Guide
- Recuperer message whatsapp supprimé - Guide
- Word et excel gratuit - Guide
- Message absence thunderbird - Guide
- Si ou excel - Guide
5 réponses
Bonjour,
tu écris x1Down avec un 1, mais c'est xlDown avec un l (xl étant une abréviation de Excel).
Cordialement.
tu écris x1Down avec un 1, mais c'est xlDown avec un l (xl étant une abréviation de Excel).
Cordialement.
Bonjour,
A priori je trouve 3 erreurs dans cette syntaxe :
Me("Code_prest" & i).List = (Sheets("Prestations").Range([A2], [A2].End(x1Down)))
1/ la valeur de i n'est pas initialisée (a moins que ce soit une variable globale initialisée ailleurs). Mais cela ressemble à l'initialisation de plusieurs listBox dans une boucle qui est absente de la macro montrée ici. Donc par exemple si il y a dans cet UF deux listBox qui s'appellent Code_prest1 et Code_prest2 , il faudra inclure cette ligne dans une boucle for par exemple.
2/ x1Down est une erreur de transcription ce n'est pas le chiffre 1 mais la lettre l : xlDown
3/ il faut initialiser la liste non pas avec le Range mais avec les valeurs
Donc une syntaxe correcte serait par exemple
idem pour le deuxième jeu de listbox
sauf si je répète le i est initialisé ailleurs...
A+
Cordialement,
A priori je trouve 3 erreurs dans cette syntaxe :
Me("Code_prest" & i).List = (Sheets("Prestations").Range([A2], [A2].End(x1Down)))
1/ la valeur de i n'est pas initialisée (a moins que ce soit une variable globale initialisée ailleurs). Mais cela ressemble à l'initialisation de plusieurs listBox dans une boucle qui est absente de la macro montrée ici. Donc par exemple si il y a dans cet UF deux listBox qui s'appellent Code_prest1 et Code_prest2 , il faudra inclure cette ligne dans une boucle for par exemple.
2/ x1Down est une erreur de transcription ce n'est pas le chiffre 1 mais la lettre l : xlDown
3/ il faut initialiser la liste non pas avec le Range mais avec les valeurs
Donc une syntaxe correcte serait par exemple
For i= 1 to 2
Me("Code_prest" & i).List = Sheets("Prestations").Range([A2], [A2].End(xlDown)).Value
next i
idem pour le deuxième jeu de listbox
sauf si je répète le i est initialisé ailleurs...
A+
Cordialement,
Bonsoir!!
Tout d'abord grand merci pour vos réponses
1) je pense investir dans des lunettes pour faire la différence entre les 1 et les l !! :)
2) effectivement le i apparait seulement à cet endroit, donc il n'est pas initialisé
mais du coup je n'ai pas vraiment compris le "for" n'est pas abordé dans mon bouquin (il n'y a pas de bonnes explications, juste des exercices à faire bêtement- d'ailleurs si vous avez un bon bouquin à me conseiller, je prends!!)
si ça peut vous aider à y voir plus clair, voici la totalité de la programmation
Private Sub Cmdvalid_Click()
'Ajouter ligne suivante
Dim Ligne As Integer
Ligne = Sheets("Facture").Range("A33").End(xlUp).Row + 1
With Sheets("Facture")
Range("A" & Ligne).Value = Me.CodePrest
Range("B" & Ligne).Value = Me.Prestation
Range("C" & Ligne).Value = Me.PrixU
Range("D" & Ligne).Value = Me.Qte
Range("E" & Ligne).Value = Me.Total
End With
'Récupération des données de la boite de dialogue
Nom = Form_Facture.Adresse
Adresse = Form_Facture.Adresse
CP = Form_Facture.CPostal
Ville = Form_Facture.Ville
'Entrée des données du client dans la facture
Sheets("Facture").Select
Range("C3").Value = Nom
Range("C4").Value = Adresse
Range("C5").Value = CPostal
Range("D5").Value = Ville
Sheets("Facture").Range("B16") = Format(Now, "DD/MM/YYYY")
End Sub
Private Sub CodePrest_Change()
Me("Prestation") = Application.VLookup(Me("CodePrest"), [BDPrestations], 2, False)
Me("PrixU") = Application.VLookup(Me("CodePrest"), [BDPrestations], 3, False)
End Sub
Private Sub Com_Quitter_Click()
Unload Me
End Sub
Private Sub Com_Reset_Click()
'Réinitialisation de la fiche
Prestation.Value = ""
PrixU.Value = ""
Qte.Value = ""
Total.Value = ""
End Sub
Private Sub Frame2_Click()
End Sub
Private Sub Label2_Click()
End Sub
Private Sub Label8_Click()
End Sub
Private Sub Label9_Click()
End Sub
Private Sub Nom_Change()
Me("Adresse") = Application.VLookup(Me("Nom"), [BDClients], 3, False)
Me("CPostal") = Application.VLookup(Me("Nom"), [BDClients], 4, False)
Me("Ville") = Application.VLookup(Me("Nom"), [BDClients], 5, False)
End Sub
Private Sub Qte_AfterUpdate()
If Me("PrixU") <> "" And Me("Qte") <> "" Then
Me("Total") = CDbl(Me("PrixU")) * CDbl(Me("Qte"))
Cmdvalid.Visible = True
Else
MsgBox "Vous n'avez pas entré de quantités ou indiquez 0 !"
Exit Sub
End If
End Sub
Private Sub UserForm_Initialize()
Cmdvalid.Visible = True
Me("Code_prest" & i).List = Sheets("Prestations").Range([A2], [A2].End(xlDown))
Me("Nom" & i).List = Sheets("Clients").Range([A2], [A2].End(xlDown))
End Sub
et donc quand je suis sur ma feuil facture, si je click sur le bouton de commande "Nouvelle facture", j'ai ce fameux message d'erreur, et le débogage m'envoie sur le dernier paragraphe ci dessus
et si j'ai bien compris le but de ce paragraphe, de faire un lien avec mes codes prestations de ma feuil prestations et avec le nom de mes clients de ma feuil clients
(j'ai peut-être visé gros pour débuter!? :/)
voilà si ça peut vous éclairer sur mon problème
En tout cas encore grand merci pour votre temps
Tout d'abord grand merci pour vos réponses
1) je pense investir dans des lunettes pour faire la différence entre les 1 et les l !! :)
2) effectivement le i apparait seulement à cet endroit, donc il n'est pas initialisé
mais du coup je n'ai pas vraiment compris le "for" n'est pas abordé dans mon bouquin (il n'y a pas de bonnes explications, juste des exercices à faire bêtement- d'ailleurs si vous avez un bon bouquin à me conseiller, je prends!!)
si ça peut vous aider à y voir plus clair, voici la totalité de la programmation
Private Sub Cmdvalid_Click()
'Ajouter ligne suivante
Dim Ligne As Integer
Ligne = Sheets("Facture").Range("A33").End(xlUp).Row + 1
With Sheets("Facture")
Range("A" & Ligne).Value = Me.CodePrest
Range("B" & Ligne).Value = Me.Prestation
Range("C" & Ligne).Value = Me.PrixU
Range("D" & Ligne).Value = Me.Qte
Range("E" & Ligne).Value = Me.Total
End With
'Récupération des données de la boite de dialogue
Nom = Form_Facture.Adresse
Adresse = Form_Facture.Adresse
CP = Form_Facture.CPostal
Ville = Form_Facture.Ville
'Entrée des données du client dans la facture
Sheets("Facture").Select
Range("C3").Value = Nom
Range("C4").Value = Adresse
Range("C5").Value = CPostal
Range("D5").Value = Ville
Sheets("Facture").Range("B16") = Format(Now, "DD/MM/YYYY")
End Sub
Private Sub CodePrest_Change()
Me("Prestation") = Application.VLookup(Me("CodePrest"), [BDPrestations], 2, False)
Me("PrixU") = Application.VLookup(Me("CodePrest"), [BDPrestations], 3, False)
End Sub
Private Sub Com_Quitter_Click()
Unload Me
End Sub
Private Sub Com_Reset_Click()
'Réinitialisation de la fiche
Prestation.Value = ""
PrixU.Value = ""
Qte.Value = ""
Total.Value = ""
End Sub
Private Sub Frame2_Click()
End Sub
Private Sub Label2_Click()
End Sub
Private Sub Label8_Click()
End Sub
Private Sub Label9_Click()
End Sub
Private Sub Nom_Change()
Me("Adresse") = Application.VLookup(Me("Nom"), [BDClients], 3, False)
Me("CPostal") = Application.VLookup(Me("Nom"), [BDClients], 4, False)
Me("Ville") = Application.VLookup(Me("Nom"), [BDClients], 5, False)
End Sub
Private Sub Qte_AfterUpdate()
If Me("PrixU") <> "" And Me("Qte") <> "" Then
Me("Total") = CDbl(Me("PrixU")) * CDbl(Me("Qte"))
Cmdvalid.Visible = True
Else
MsgBox "Vous n'avez pas entré de quantités ou indiquez 0 !"
Exit Sub
End If
End Sub
Private Sub UserForm_Initialize()
Cmdvalid.Visible = True
Me("Code_prest" & i).List = Sheets("Prestations").Range([A2], [A2].End(xlDown))
Me("Nom" & i).List = Sheets("Clients").Range([A2], [A2].End(xlDown))
End Sub
et donc quand je suis sur ma feuil facture, si je click sur le bouton de commande "Nouvelle facture", j'ai ce fameux message d'erreur, et le débogage m'envoie sur le dernier paragraphe ci dessus
et si j'ai bien compris le but de ce paragraphe, de faire un lien avec mes codes prestations de ma feuil prestations et avec le nom de mes clients de ma feuil clients
(j'ai peut-être visé gros pour débuter!? :/)
voilà si ça peut vous éclairer sur mon problème
En tout cas encore grand merci pour votre temps
Bonsoir,
Je pense que le mieux c'est de nous joindre le fichier en exemple.
Pour cela le déposer sur www.cjoint.com en enlevant les données confidentielles.
Puis venir coller ici dans un message le lien de téléchagement.
A+
Je pense que le mieux c'est de nous joindre le fichier en exemple.
Pour cela le déposer sur www.cjoint.com en enlevant les données confidentielles.
Puis venir coller ici dans un message le lien de téléchagement.
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
J'ai regardé les macros.
A priori il y a des petites erreurs. Voici les corrections que je propose pour la macro initialize et Cmdvalid :
Pour le reste c'est correct. Les sub .. endsub vides comme Frame2 ne servent à rien. Ils ont été générés automatiquement vides. Ils peuvent être supprimés.
A tester.
A+
J'ai regardé les macros.
A priori il y a des petites erreurs. Voici les corrections que je propose pour la macro initialize et Cmdvalid :
Private Sub UserForm_Initialize()
Dim DerLig As Integer
Cmdvalid.Visible = True
DerLig = Sheets("Prestations").Range("A2").End(xlDown).Row
CodePrest.List = Sheets("Prestations").Range("A2", "A" & DerLig).Value
DerLig = Sheets("Clients").Range("A2").End(xlDown).Row
Nom.List = Sheets("Clients").Range("A2", "A" & DerLig).Value
End Sub
Private Sub Cmdvalid_Click()
'Ajouter ligne suivante
Dim Ligne As Integer
With Sheets("Facture")
Ligne = .Range("A33").End(xlUp).Row + 1
.Range("A" & Ligne).Value = Me.CodePrest
.Range("B" & Ligne).Value = Me.Prestation
.Range("C" & Ligne).Value = Me.PrixU
.Range("D" & Ligne).Value = Me.Qte
.Range("E" & Ligne).Value = Me.Total
'Récupération des données de la boite de dialogue
'et Entrée des données du client dans la facture
.Range("C3").Value = Me.Nom
.Range("C4").Value = Me.Adresse
.Range("C5").Value = Me.CPostal
.Range("D5").Value = Me.Ville
.Range("B16") = Format(Now, "DD/MM/YYYY")
End With
End Sub
Pour le reste c'est correct. Les sub .. endsub vides comme Frame2 ne servent à rien. Ils ont été générés automatiquement vides. Ils peuvent être supprimés.
A tester.
A+