XL 2019 temps d'exécution très long

escudo

XLDnaute Nouveau
bonsoir,
j'ai conçu une application pour création des fiches techniques des plats tout marche bien sauf que pour un userform dont le temps d'exécution d'une macro est très long parfois Excel ne répond pas
l'userform contient une listbox qui affiche les noms des plats qui peut atteindre 60 PLATS et chaque ligne du listbox est lier avec un textbox où je tape les ventes pour chaque plat
j'ai cree une macro pour que les ventes de chaque plat que j'entre dans les textbox se transfèrent vers une cellule prédéfinit dans chaque feuille qui constitue une fiche technique
sachant qu' il y a des plats dont les textboxs vente restent vides
voici le code du bouton valider:

Sub recherche()
Dim Feuil As Worksheet
Dim cherche As Variant
Dim VT As Variant
Dim i2 As Integer

Application.Calculation = xlCalculationManual
For i2 = ListBox1.ListCount - 1 To 0 Step -1
cherche = ListBox1.List(i2, 1)
VT = Controls("Textbox" & i2 + 1).Value
For Each Feuil In Sheets
If Feuil.Name Like cherche Then
Feuil.[G3] = VT
Feuil.Calculate
Sheets("STOCK").Calculate
End If
Next Feuil
Next i2
End Sub
 

Pièces jointes

  • sodapdf-converted.jpg
    sodapdf-converted.jpg
    361.2 KB · Affichages: 6

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Escudo,
Sans fichier test difficile de se prononcer.
Si le nombre de feuilles est important, le temps d'exécution le sera aussi.

Juste une question :
Avez vous besoin de recalculer chaque feuille et la feuille Stock à chaque itération.
N'est il pas possible de ne faire qu'un seul recalcul juste avant le EndSub avec un Calculate qui vous recalculera l'ensemble des feuilles ?

Second point : Dans votre boucle "For Each Feuil In Sheets" n'y a t-il qu'une seule feuille qui répondra au critère ( nom contient cherche ) ?
Si c'est le cas juste après "Feuil.[G3] = VT" faites un Exit For, cela lui évitera de boucler sur le reste des feuilles.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Alors un peu au pif, en utilisant un array avec le nom des feuilles, cela devrait accélérer l'exécution :
VB:
Public T()
Sub recherche()
Dim Feuil As Worksheet, cherche As Variant, VT As Variant, i2 As Integer
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
ListeNomFeuilles                                ' Construit un array avec la liste des noms des feuilles
For i2 = ListBox1.ListCount - 1 To 0 Step -1
    cherche = ListBox1.List(i2, 1)
    VT = Controls("Textbox" & i2 + 1).Value
    ChercheNom cherche, VT
Next i2
Application.Calculation = xlCalculationAutomatic
Calculate
End Sub

Sub ListeNomFeuilles()                          ' Fait la liste des noms des feuilles dans l'array nommé T
N = -1
For Each F In Worksheets
    N = N + 1
    ReDim Preserve T(N)
    T(N) = F.Name
Next F
End Sub

Sub ChercheNom(cherche, Valeur)                 ' Cherche un nom de feuille qui contient "cherche" et range VT en G3
For i = 0 To UBound(T)
    If T(i) Like cherche Then Sheets(T(i)).[G3] = Valeur
Next i
End Sub
 

escudo

XLDnaute Nouveau
IL A 60 FEUILLE EN TOTAL

chaque feuille contient une fiche technique dont la cellule G3 où je transfert les ventes pour chaque plat bien sur que l'ensemble des feuilles doivent être recalculer ainsi la feuille stock voici ce à quoi ressemble une feuille fiche technique toute les autre feuilles se ressemble à celle ci
 

Pièces jointes

  • sodapdf-converted.jpg
    sodapdf-converted.jpg
    326.2 KB · Affichages: 7

escudo

XLDnaute Nouveau
Re,
Alors un peu au pif, en utilisant un array avec le nom des feuilles, cela devrait accélérer l'exécution :
VB:
Public T()
Sub recherche()
Dim Feuil As Worksheet, cherche As Variant, VT As Variant, i2 As Integer
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
ListeNomFeuilles                                ' Construit un array avec la liste des noms des feuilles
For i2 = ListBox1.ListCount - 1 To 0 Step -1
    cherche = ListBox1.List(i2, 1)
    VT = Controls("Textbox" & i2 + 1).Value
    ChercheNom cherche, VT
Next i2
Application.Calculation = xlCalculationAutomatic
Calculate
End Sub

Sub ListeNomFeuilles()                          ' Fait la liste des noms des feuilles dans l'array nommé T
N = -1
For Each F In Worksheets
    N = N + 1
    ReDim Preserve T(N)
    T(N) = F.Name
Next F
End Sub

Sub ChercheNom(cherche, Valeur)                 ' Cherche un nom de feuille qui contient "cherche" et range VT en G3
For i = 0 To UBound(T)
    If T(i) Like cherche Then Sheets(T(i)).[G3] = Valeur
Next i
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 206
Messages
2 086 220
Membres
103 158
dernier inscrit
laufin