Aide sur erreur code VBA svp

William77

XLDnaute Nouveau
Bonjour à tous,

Je crée un userform malheureusement une erreur s'est immiscée et je n'en trouve pas la cause.
Avant de poster ce message, j'ai regardé les solutions possible, mais je ne trouve pas ......

Pourriez-vous m'indiquer mon erreur dans le code mis en surbrillance par VBA excel?

VB:
Private Sub Cbx_article_Change()

Dim article As String

article = Me.Cbx_article.Value

'Rechercher dans la colonne article de la feuille 4
Part_prix = Application.VLookup(article, Sheets(4).Range("c:i"), 4, 0)
Part_stock = Application.VLookup(article, Sheets(4).Range("c:i"), 3, 0)

'Affichage des informations dans les labels associés
Me.Label_prix_unit.Caption = CCur(Part_prix) & " €"
Me.Label_stock.Caption = Part_stock

End Sub

Les variables Part_prix et Part_stock sont déclarées en Public en début de code.
J'avais testé avec worksheetfunction en lieu et place de Application, mais j'ai la même erreur.

Si besoin, je vous transmettrai le code entier.

Cordialement.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Désolé, je ne suis pas arriver à reproduire l'erreur.
La macro incriminé en pas à pas passe bien. Les valeurs Prix et Stock sont correctes. Les deux Captions sont bien transférées.

20200915_183424.gif
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
J'ai fait du pas à pas sur l'appui du bouton Ajouter.
On passe par ce code :
VB:
'vider l'article et le nombre
Me.Cbx_article = ""
Me.Txt_nombre = ""
où on vide Me.Cbx_article.
Puis on saute à Sub Cbx_article_Change, et alors évidemment Part_prix plante puisque
article = Me.Cbx_article.Value est vide. Il y a erreur sur VLookup.
Je ne vais pas plus loin car il faut avoir une bonne connaissance de ce que vous faites pour trouver.
mais voici le cheminement :
1.jpg

Pourquoi ne pas rajouter un article = Me.Cbx_article, juste avant d'effacer Me.Cbx_article.
et comme ça vous utilisez directement Article dans Cbx_article_change ?

Question subsidiaire : si ça marchait hier, qu'avez vous changé depuis ?
 
Dernière édition:

William77

XLDnaute Nouveau
Je vais expliquer le fonctionnement théorique de mon usine à gaz (je n'ai pas toutes les bonnes méthodes de codage ). ;)

Quand je choisis un article:
le prix -> Label_prix_unit
le stock -> Label_stock.

En appuyant sur ajouter, une ligne se crée dans la Liste_cde et une fois l'ajout effectué, on vide les combobox Cbx_article et Txt_nombre.
Pour finir, on peut choisir un article et recommencer les étapes précédentes.

Au final, je pense qu'il faudrait que je supprime le vidage de Me.Cbx_article, soit que je rajoute une contre mesure contre une erreur potentielle.

Suis-je sur la bonne voie?

Pour ce qui est de ce que j'ai modifié, je n'arrive pas à m'en souvenir, c'est un gros problème.....

De plus je viens de m'apercevoir, qu'il y a un risque d'erreur en effaçant une lettre dans les comboboxs.

Cordialement.
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
J'ai créé une variable globale SaveArticle que j'initialise par article avant de vider Me.Cbx_article.
Quand je l'utilise je regarde si c'est vide, si oui je l'initialise.
Ca à l'air de marcher. Mais c'est à prendre avec des pincettes. J'ai résolu le problème sans tenir compte du reste.;)
 

Pièces jointes

  • Test stock V2 (2).xlsm
    94.6 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
bonsoir
juste comme ca en passant
Kado ! ;)

en haut de module userform
VB:
Dim Part_prix As Double
Dim Part_stock As Double
l'events combo
VB:
Private Sub Cbx_article_Change()

    Dim article As String, ligne&

    article = Me.Cbx_article.Value

    'Rechercher dans la colonne article de la feuille 4
    'utilisation de match avec son  garde fou iferror
    With Application: ligne = .IfError(.Match(article, Sheets(4).[c:c], 0), 0)
        If ligne > 0 Then
            Part_prix = Sheets(4).Cells(ligne, "F").Value
            Part_stock = Sheets(4).Cells(ligne, "E").Value
        End If
    End With

    'Affichage des informations dans les labels associés
    Me.Label_prix_unit.Caption = CCur(Part_prix) & " €"
    Me.Label_stock.Caption = Part_stock

End Sub
 

patricktoulon

XLDnaute Barbatruc
re
et on continu (t'en fait pas c'est qu'un tango ;))
VB:
Private Sub CommandButton1_Click()

    Dim Total As Single    'déclare la variable Total
    Dim i As Integer

    If Me.Cbx_article.ListIndex >= 0 And Me.Txt_nombre <> "" Then
        If Me.Liste_cde.ListCount >= 10 Then    's'il y a plus de 10 articles
            MsgBox "Vente limitée à 10 lignes !"
        Else

            'Rechercher dans article
            'Part_prix = Application.VLookup(Me.Cbx_article, Sheets(4).Range("c:i"), 4, 0)
            'Part_stock = Application.VLookup(Me.Cbx_article, Sheets(4).Range("c:i"), 3, 0)
            ' BIEN QUE LA JE PIGE PAS LE BESOINS D4ALLER ENCORE CHERCHER
            ' PUISQUE LES 2 VARIABLE SONT EN GLOBAL ET DONC DEJA RENSEIGNEE
            'MAIS BON COMME TU VEUX lol lol et encore lol
            With Application: ligne = .IfError(.Match(Me.Cbx_article, Sheets(4).[c:c], 0), 0)
                If ligne > 0 Then
                    Part_prix = Sheets(4).Cells(ligne, "F").Value
                    Part_stock = Sheets(4).Cells(ligne, "E")
                End If
            End With

            'Remplir la zone de liste
            With Me.Liste_cde
                .AddItem
                .List(memoire, 0) = Me.Cbx_article
                .List(memoire, 1) = Part_stock
                .List(memoire, 2) = Me.Txt_nombre
                .List(memoire, 3) = CCur(Part_prix) & " €"
                .List(memoire, 4) = CCur(CCur(Part_prix) * Me.Txt_nombre) & " €"
            End With
            memoire = memoire + 1

            'vider l'article et le nombre
            Me.Cbx_article = ""
            Me.Txt_nombre = ""
        End If
    End If

    With Liste_cde                                                      'prend en compte la Liste_cde (à adapter)
        For i = 0 To .ListCount - 1                                     'boucle sur tous les lignes de la ListBox1
            Total = Total + .Column(4, i)                               'définit le Total (à adapter car tu parles de la colonne 7 et la c'est la "7ème" colonne)
        Next i                                                          'prochaine ligne de la boucle
        Me.Label_total.Caption = CCur(Total) & " €"                     'renvoie dans la Label_total le Total
        'Range("A11").Resize(.ListCount, .ColumnCount) = .List          'renvoie la da la cellule A1 la les éléments de la ListBox1
    End With                                                            'fin de la prise en compte de la ListBox1

End Sub
 

patricktoulon

XLDnaute Barbatruc
re
on peut puisque l'on se sert de "Application." l'ecrire autrement aussi
VB:
Private Sub Cbx_article_Change()
    Dim article$, ligne&
    article = Me.Cbx_article.Value
    'Rechercher dans la colonne article de la feuille 4
    'utilisation de match avec son  garde fou iferror
    With Application: ligne = .IfError(.Match(article, [stock!c:c], 0), 0)
        If ligne > 0 Then
            Part_prix = .Index([stock!F:F], ligne)
            Part_stock = .Index([stock!E:E], ligne)
        End If
    End With
    'Affichage des informations dans les labels associés
    Me.Label_prix_unit.Caption = Part_prix & " €"
    Me.Label_stock.Caption = Part_stock
End Sub
;)
 

William77

XLDnaute Nouveau
Bonsoir Patricktoulon,

Ayant ajouté au fur et à mesure des nouvelles tâches, je n'avait pas prévu le besoin des variables en global, et lorsque j'ai modifié le code, je n'ai pas tout contrôlé.....

Je viens testé le code que vous m'avez proposé, et il fonctionne comme je le souhaite :)
Par contre le code ne ressemble quasiment plus au mien lol.

Petite question, a quoi sert le $ collé à article et ligne?

Merci pour votre aide Sylvanu et patricktoulon.

Cordialement.
 

patricktoulon

XLDnaute Barbatruc
re
tiens si a l'avenir on devait se passer de variable le code condensé serait
VB:
Private Sub Cbx_article_Change()
'Rechercher dans la colonne article de la feuille 4
'utilisation de match avec son  garde fou iferror
    With Application
        Me.Label_prix_unit.Caption = .IfError(.Index([stock!F:F], .Match(Me.Cbx_article.Value, [stock!c:c], 0)), "")
        Me.Label_stock.Caption = .IfError(.Index([stock!E:E], .Match(Me.Cbx_article.Value, [stock!c:c], 0)), "")
    End With
End Sub
 

Statistiques des forums

Discussions
311 720
Messages
2 081 898
Membres
101 834
dernier inscrit
Jeremy06510