Message d'erreur 1004 VBA excel

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

5 réponses

  1. Contributeur
    Bonjour,

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

    Cordialement.
    0
    1. Contributeur
      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
      1. 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
        1. Contributeur
          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
          1. Contributeur
            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