Résolu 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
Bonjour William,
Sans le fichier, on ne peut que supposer :
1- Articles est bien en colonne C, Prix en colonne F et Stock en colonne E ?
2- Part_prix est bien un nombre, pas une chaîne ?
En fait sur quelle ligne se trouve l'erreur ?
 

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
 

William77

XLDnaute Nouveau
L'erreur se produit quand je clique sur le bouton "Ajouter", mais ce que je trouve étonnant, hier soir celà fonctionnait.....
 

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.;)
 

Fichiers joints

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
 

William77

XLDnaute Nouveau
Ne connaissant pas "Application", tje restai dans un codage les plus basique mais pas le plus fonctionnel^^.
Je reconnais certaines parties du code, quand vous marquez [stock!f:f], c'est le nom de la feuille ou le nom du tableau??
 

patricktoulon

XLDnaute Barbatruc
bonsoir
c'est l'abrégé d'evaluate de sheets("stock").range("F:F")

1°codage classique:

set plage=sheets("stock").range("F:F")

2°codage classique un peu différent :
set plage=range("stock!F:F")

3°codage avec evaluate
set plage=evaluate("stock!f:f ")

4°code avec evaluate abrégé
set plage= [stock!f:f]

voila tu sais tout ;)
 

soan

XLDnaute Occasionnel
Bonjour Patrick,

J'aime mieux [stock!f:f] car c'est le plus court ; mais en termes de performances,
crois-tu que c'est plus lent via evaluate et plus rapide avec le plus long :
sheets("stock").range("F:F") ? ou c'est pareil ?

(ceci d'un point de vue général, pas seulement pour set plage=)

Si c'est dans une grande boucle, genre For i = 1 To 10 000 ..
Next i
, ce sera la même réponse ? ou ce sera différent ?


soan
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour soan
c'est une très bonne question que tu pose là
en effet evaluate simplifie les choses mais en revanche fait travailler vba pour EVALUER l'expression entre crochet ou dans les parenthèses pour la version entière d'evaluate
il y a donc forcement une charge supplémentaire de mémoire et procc
bon la différence est difficilement contrôlable mais c'est un fait
mais si tu variablise le resultat de l evaluation tu a plus de soucis

alors selon le besoins il est préférable d'avoir tout en magasin mémoire pour exploiter plus vite

par exemple je veux examiner une plage de grande taille je vais me servir de variable tableau
ben pour simplifier l’écriture
je vais faire
montableau=[Stock!A1:J10000].value
ici on a simplifié l’écriture et je peux exploiter les valeurs dans un tableau

on a donc tout gagné

maintenant si je voulais faire un find ou travailler sur cellules
je dois donc variabiliser une plage
et bien je vais faire
set maplage=montableau[Stock!A1:J10000]

voila ou réside l'avantage d'evaluate


@job75 par exemple ;prétend une méthode bien a lui qui consiste a utiliser le resize
je n'ai pas eu la possibilité de vérifier mais ce serait une bonne chose
exemple:
montableau=[Stock!A1].resize(10000,10).value
tout simplement l'evaluation a eu a évaluer une seule cellule donc pas très lourd
reste a savoir si le resize ne génère pas une gourmande consommation
 
Dernière édition:

soan

XLDnaute Occasionnel
Rebonjour Patrick,

Merci beaucoup pour ta réponse, et tes explications bien détaillées ! :)

soan
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Patrick, Soan,
Just for the fun.
Je pensais que le compilo ne ferait pas de différence de temps entre les 4 propositions de Patrick.

J'ai fait une mesure de temps sur les 4 propal avec boucle de 100k sur un range de 5000.
Et, perturbant, j'obtiens en moyenne sur mon PC :

1°codage classique:
set plage=sheets("stock").range("F:F") 1200ms

2°codage classique un peu différent :

set plage=range("stock!F:F") 717ms

3°codage avec evaluate

set plage=evaluate("stock!f:f ") 4500ms

4°code avec evaluate abrégé

set plage= [stock!f:f] 4800ms

Cet écart me laisse pantois. Avez vous le même type d'écart ?
 

Fichiers joints

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas