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.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour à tous...

Voilà mon résultat sur une "vieille" machine,
  • Intel .Core 2 Quad CPU 2.66Ghz
  • RAM 8.0 Go
  • Windows 8.1 Pro
  • Office 2013 Pro Plus (32),
1600510844116.png


Au début les six essais avec le Set Plage Nothing, puis les six autres essais en commentaires...

J'ai ajouté la "méthode 5" qui est la "Set Objects Fully Qualified" à l'ancienne comme j'avais apris à programmer avec Excel 5.
Il est clair que c'est quand même assez aléatoire sur plusieurs essais, mais bon ça donne une idée quand même avec le fichier de Sylvanu...

Bon week-end
@+Thierry
 

Pièces jointes

  • EssaiRange_Review_Thierry.xlsm
    60.6 KB · Affichages: 15

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
de ce que j'ai constater avec WXp,W7 et supérieur et ca va de plus mal en pire
dans une boucle comme celle ci qui finalement ne met a jour qu'une variable (plage)
a chaque tour la memoire et de plus en plus solicité
j'ai fait des test avec un logiciel et en effet
je sais pas trop comment expliquer cela mais en gros
la mémoire n'est pas vidé tout du moins pas tout de suite
a chaque tour la mise en mémoire de valeur va dans un autre secteur de mémoire et écrase le précédent secteur
je sais pas si je me suis fait comprendre ;)
d'autant plus que vba execute son code ligne par ligne donc les if et select case et tout i cointi n'arrange pas les chose
pour ma part de 2007 a 2013 j'ai deja une différence de latence de mémoire phénoménale selon les fonctions executées en vba

C'EST POUR CA que ces tests de boucles ne sont pas valides d'ailleurs si vous lancez X fois le même module vous aurez des résultats différents essayez vous verrez ;)

la plus rapide( @job75) est effectivement la set plage =cells(1,1) resize(x,y)
 

patricktoulon

XLDnaute Barbatruc
ben comme je l'ai dit a chaque tour de boucle la memo de la variable est enregistrée dans un autre secteur mémoire et la memoire garde une trace du passé comme tu dis
fait le test X fois avec un même module même le plus rapide tu verra

le vidage qui n'en est pas vraiment un consiste a réduire a 2 octet( de cela j'en suis pas sur ) si je ne me trompe pas en mettant la variable a nothing mais même cette simple instruction prend de la mémoire elle aussi :D ;)

c'est pour cela que comme je disais plus haut ces test ne donnent vraiment qu'une idée et je suis pas sur qu'elle soit exacte à 100%

si je ne me trompe pas tu constatera toute les deux ou trois tours avec un seul module , un retours au minimum
ce qui veut bien dire que la fois fois précédente n'est pas vraiment effacée ou écrasée

et après 2007 c'est de plus mal en pire
j'essairais quand j'ai un moment avec le pc portable XP avec 2003 ( si il demarre LOL)pour voir
 

patricktoulon

XLDnaute Barbatruc
tiens testez ça et utilisez la méthode que vous voulez
ici j'utilise la plus rapide
VB:
Sub test()
    For i = 1 To 10
        T0 = Timer
        For t = 1 To 100000
              Set plage = Nothing
            Set plage = Range("feuil1!A1").Resize(5000, 6)
        Next t
        x = Int(1000 * (Timer - T0))
        Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 2).Value = Array("tour" & i, x)
    Next
End Sub
 

soan

XLDnaute Barbatruc
Inactif
Bonjour VIARD,

Tu as écrit : « J'ai refait le test de "Sylvanu" en l'automatisant. »

Ah ben ça y'est ! Sylvanu va maintenant entrer dans la légende avec son test, comme
quand on dit : « le théorème de Pythagore », ou « le théorème de Thalès ». ;):p


soan