Microsoft 365 Lenteur macro

Calvus

XLDnaute Barbatruc
Bonsoir ou bonjour à tous,

Tout d'abord, tous mes vœux pour cette nouvelle année. 😊

J'ai un code à l'initialisation d'un userform qui rend très lente, a savoir environ 3,5 secondes.

C'est une ligne qui pose problème. Si je l'enlève, le userform s'ouvre en 0,06 secondes.
Cela concerne l'alimentation d'un combobox, sur 2000 lignes.

La voici :
VB:
For i = 1 To UBound(TPlages)
    If TPlages(i, 2) = 0 Then
        ComboBox3.AddItem "" & WorksheetFunction.Proper(Format(Weekday(TPlages(i, 1), 1), "dddd")) 
        ComboBox3.List(ComboBox3.ListCount - 1, 1) = TPlages(i, 1)
    End If
Next

Et c'est en particulier cette ligne qui est la cause du ralentissement :
Code:
ComboBox3.AddItem "" & WorksheetFunction.Proper(Format(Weekday(TPlages(i, 1), 1), "dddd"))

Ceci afin d'avoir le jour indiqué en regard de la date, comme sur l'image ci-dessous :

1704841412243.png


C'est donc le WorksheetFunction.Proper(Format(Weekday(TPlages(i, 1), 1), "dddd")) qui pose problème, en affectant le jour à chaque item.

Avez-vous une idée de contournement de cette instruction afin de rendre le code plus rapide ?

Merci d'avance.
 

Franc58

XLDnaute Occasionnel
Salut, teste en stockant les éléments dans un tableau puis en envoyant celui-ci au combobox en une fois:

VB:
Dim arr() As Variant
ReDim arr(1 To UBound(TPlages), 1 To 2)

For i = 1 To UBound(TPlages)
    If TPlages(i, 2) = 0 Then
        arr(i, 1) = WorksheetFunction.Proper(Format(Weekday(TPlages(i, 1), 1), "dddd"))
        arr(i, 2) = TPlages(i, 1)
    End If
Next

ComboBox3.List = arr
 

Calvus

XLDnaute Barbatruc
Bonjour,

Merci @mapomme 😊

Tu as raison pour le classeur, j'ai l'habitude d'en joindre un quand je fais des demandes. Je me suis raté sur ce coup-là et ça tombe sur toi en plus ! Navré.

Je te remercie, ça résout tout à fait le problème.
Si je comprends bien la logique, c'est le AddItem qui est gourmand en ressources ? D'où l'utilité de passer par un tableau que l'on transfère en une fois grâce à l'instruction .List ?

Merci d'éclairer ma lanterne. :)

@Franc58
Je te remercie pour ta solution. Malheureusement, le temps de traitement est identique.

Bonne journée à tous.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Si je comprends bien la logique, c'est le AddItem qui est gourmand en ressources ? D'où l'utilité de passer par un tableau que l'on transfère en une fois grâce à l'instruction .List ?
Oui c'est le premier point. Le second point est que j'évite de passer par des fonctions qui font appel à Excel (proper et weekday). Le texte du jour avec sa majuscule est issu de fonctions implantées dans VBA.
 

Calvus

XLDnaute Barbatruc
Bonjour,
@mapomme
Tiens tiens... en redémarrant mon PC, mon code fonctionne pratiquement aussi vite...
200 millisecondes contre 90 avec le tien.
Le problème ne semblait donc pas se trouver dans l'utilisation du AddItem, mais de la mémoire du PC.
Certainement pour cela que je ne m'en étais pas rendu compte avant...
Qu'en penses tu ? Certainement que cela pourra faire une différence sur un tableau de plusieurs milliers de lignes en revanche.

Bonne journée.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Tiens tiens... en redémarrant mon PC, mon code fonctionne pratiquement aussi vite...
200 millisecondes contre 90 avec le tien.
bonjour @Calvus :) .
C'est rassurant!
Je crois bien me souvenir que j'ai été une fois confronté à ce phénomène (il a belle lurette). Mais je n'y ai absolument pas pensé à la lecture de ta question. Donc tout est bien qui finit bien👌.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour a tous
et oui quand je dis que 365 fait des fichiers bizarres
quand je teste le fichier de @mapomme j'ai 15 millisec
quand je recopie les données dans un fichier 2013(bref le même)
j'ai tout le temps 00.000
avec mon code pareil
VB:
Option Explicit

Private Sub UserForm_Initialize()
    Dim t, i&, t2(), a&, deb#, n&
    deb = Timer
    ComboBox3.ColumnCount = 2
    t = Range("a1:b4000")
    n = Application.WorksheetFunction.CountIf(Range("b1:b4000"), "=0")
    If n > 0 Then
        ReDim t2(1 To n, 1 To 2)
        For i = 1 To UBound(t)
            If t(i, 2) = 0 Then a = a + 1: t2(a, 2) = t(i, 1): t2(a, 1) = StrConv(Format(t(i, 1), "Dddd"), vbProperCase)
                    Next
        ComboBox3.List = t2
    End If
    Label1 = Int((Timer - deb) * 1000) & " millisec."
End Sub
 

patricktoulon

XLDnaute Barbatruc
ben je sais que dans les xml du zip (xlsm), il y a des nouveautés que je n'ai pas dans les xmls de mes fichier 2013 et je pense que c'est ca qui fout le boxon

ce qui rend difficile les échanges de fichier
et quelque chose me dit que c'est pas près de s'arranger ;)
microsoft pousse clairement vers la sortie les versions anterieures et VBA pour faire passer au premier plan sa grosse daube de M.... de pompe a fric de 365 et ce PQ de M....
perso je resiterais tant qu'il m'en sera possible après je passerais en libre office tant pis

perso de plus en plus je pilote mes fichiers excel par mes form en vb.net
les fichiers excel restent des xlsx (lecture/ ecriture) et là je pilote tout moi même
 

Cousinhub

XLDnaute Barbatruc
Inactif
microsoft pousse clairement vers la sortie les versions anterieures et VBA pour faire passer au premier plan sa grosse daube de M.... de pompe a fric de 365 et ce PQ de M....
Un peu de respect pour les Merdeux, qui eux, essaient de progresser...
T'aime pas, t'aime pas, Point.
Ne viens pas juger un produit que
(pourtant tu essaies d'utiliser)
tu ne sais pas utiliser
Donc, juste, modère tes propos
Bonne soirée
 

Discussions similaires

Réponses
8
Affichages
880

Statistiques des forums

Discussions
315 094
Messages
2 116 143
Membres
112 669
dernier inscrit
Guigui2502