Message d'erreur 1004 VBA excel

Fermé
SD71 - 8 mars 2013 à 09:21
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 - 11 mars 2013 à 11:48
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
A voir également:

5 réponses

chossette9 Messages postés 4239 Date d'inscription lundi 20 avril 2009 Statut Contributeur Dernière intervention 12 septembre 2014 1 306
8 mars 2013 à 11:12
Bonjour,

tu écris x1Down avec un 1, mais c'est xlDown avec un l (xl étant une abréviation de Excel).

Cordialement.
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
Modifié par pilas31 le 8/03/2013 à 11:16
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

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,
0
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
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
11 mars 2013 à 00:32
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+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
11 mars 2013 à 11:48
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 :

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+
0