IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

vitesse d'exécution sur plage > 100000 celles


Sujet :

Macros et VBA Excel

  1. #41
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    Pour le moment je ne coche pas résolut "officiellement car je n'arrive pas pour le moment pas à reproduire tes < à 1s.
    entre le taff sur 250000 lignes à 5s et chez moi à 4,5s ayant tout virer en terme de macro seule une userform avec un pauvre combo et litsbox
    me donne 4,5s

    je me rend compte actuellement qu'en cliquant sur le bouton droit de la souris, dans la feuille, le menu qui s'affiche 2 fonctions non propre à excel sont présentes: celles du taff et je cherche comment les virées car si cela se trouve, elles travaillent en tâche de fond. j'essaye cette piste...

  2. #42
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re,
    Tu auras toujours une différence de vitesse de quelques minimes secondes entre un PC et un Mac, de part la configuration d'un ordi à un autre, mais aussi parce que Excel est plus adapté en version PC que sur un Mac, et ce malgré qu'Excel 2011 soit une très bonne version sur Mac (je déconseille la version 2016 Mac, pleins de problèmes ont été relevés notamment en VBA)
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  3. #43
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    oui bien moi qui croyait que mac c'était le top, avec des données sur feuil1 pourvue de 9 colonnes, juste un pauvre combobox et une listbox en userform, (sur mac donc), j'obtiens pour :

    méthode filtre advanced version2
    250 000 lignes -> 2,3s
    950 000 lignes -> 7,3s

    méthode tab1D
    250 000 lignes -> 0,8s
    950 000 lignes -> 4s

    avec pc au taff
    c'est le même ordre de grandeur

    j'ai peur du coup pour mon tri :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      ComboBox2.List = Tb1 'le résultat dans la comboBox2
    End With
     
     
    For i = 1 To UBound(Tb1, 1)
            For j = 1 To UBound(Tb1, 1)
     
            If Tb1(i) < Tb1(j) Then
            temp = Tb1(i)
            Tb1(i) = Tb1(j)
            Tb1(j) = temp
            End If
            Next j
    Next i
     
    ComboBox2.List = Tb1
    peut-on faire mieux ? (toujours en terme de vitesse de traitement)
    (car les articles seont de la forme au final par exemple 666666_34, concaténation grosso modo de la colonne "H" & "_" & "B")

  4. #44
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je passe en coup de vente, très très occupé ces derniers jours

    je rebondis sur la question du tri qui semble être la source de temps de traitement.

    Les objets "collection" permettent de créer des listes sans doublon : chaque élément contient une clé unique et une valeur quelconque.

    Un objet presque similaire va en plus classer les clé lorsque tu les ajoutes au fur et à mesure : Collections.SortedList

    Je ne sais pas si cet objet est disponible sous mac ??

    essaye de cette procédure test on sera fixé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub toto()
    Dim ObjSortedList As Object
     
    Set ObjSortedList = CreateObject("System.Collections.Sortedlist")
     
    With ObjSortedList
        .Add "Zebre", "MaValeur1"
        .Add "Cheval", "MaValeur2"
        .Add "Antilope", "MaValeur3"
        .Add "Souris", "MaValeur4"
     
        For i = 0 To .Count - 1
           Debug.Print .GetKey(i) & vbTab & .GetByIndex(i)
        Next
    End With
     
    End Sub
    tu verras que tes entrées seront triées dans l'ordre alphabétique des clés : les animaux

  5. #45
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour joe,
    Merci de ton intervention même tardive car toute info est bonne à prendre
    Étant sur Mac aussi, je regarde de près le maximum de solutions/codes qui marchent sur les 2 plateformes
    Je ne suis pas sur que cela marche à cause de : System.Collections.Sortedlist
    Tout ce qui est attrait au système fait appel en majorité à Windows,
    mais dans le doute je vais tester dès que je peux, et te donne un retour
    Merci

    Re,
    C'est bien ce qu'il me semblait, en relation avec ActiveX, donc seulement windows
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  6. #46
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    Merci pour ton intervention joe.levrai pour le tri.

    mais SVP peux-tu commenter un peu les lignes car comme tu l'as certainement remarqué, je suis un néophyte.

    et la méthode "dico" est-elle applicable aussi ?

    Je regarde ta méthode d'ici vendredi au taff.



    ça marchote avec ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim ObjSortedList As Object
     
    Set ObjSortedList = CreateObject("System.Collections.Arraylist")
     
     
     
    For i = 1 To x - 1
        ObjSortedList.Add Tb1(i)
     
     Next i
     ComboBox2.List = ObjSortedList
    le soucis est lors du passage du comboBox2.list = ObjSortedList il n'aime pas
    erreur d'exécution '381' :
    impossible de définir la propriété List. Index de table de propriétés non valide.

  7. #47
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    ceci à remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ComboBox2.List = ObjSortedList
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ComboBox2.List = ObjSortedList.toarray
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #48
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ObjSortedList.sort
    ComboBox2.List = ObjSortedList.toarray

  9. #49
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tck = Range("B9" & Rows.Count).End(xlDown)
    espace pile insuffisant pourquoi ?
    tck est déclaré comme un Long

  10. #50
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    tck y est sans doute pour rien.
    Tu n'es pas dans une boucle infinie plutôt ? Condition de sortie de boucle absente ou jamais obtenue.
    eric

  11. #51
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    enlève le "& Rows.Count" pour obtenir ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tck = Range("B9").End(xlDown)
    Ceci te donnera la cellule précédant la première cellule vide de la colonne B, en partant de B9

    ta ligne de code, telle qu'écrite, revenait à ajouter le chiffre 9 devant le nombre maximal de ligne de la feuille.. ce qui représentait donc 90 millions de lignes.

  12. #52
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    Merci, mais ça ne marche pas. donc j'explique un peu plus.


    depuis un private sub optionbutton2_click(), puis je fais appel à une procédure
    call Gestion_Spin
    sub end


    dans ce private sub Gestion_Spin()
    je fais tck = range("B9").end(xldown) comme vous me l'indiquez
    puis j'effectue une condition if tck<10 alors ...
    si tck<100 alors fait ceci
    si tck < 1000 alors blablabla



    tout ce que je peux dire est que mes optionbutton sont dans frame6

    avec en mode debugger

    le (xldown) à -4121

  13. #53
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    xldown à -4121 c'est normal, puisque c'est la constante numérique équivalente à l'instruction littérale "xldown"


    tck est de quel type ?
    tel que tu as écris ton code, tu utilises la valeurs de la dernière cellule écrite, en descendant à partir de B9

    Est-ce bien le comportement voulu ?
    Comme tu ne renseignes pas la feuille sur laquelle tu travailles, c'est par défaut la feuille active, c'est normal aussi ?

    En utilisant tck comme Range, afin de travailler sur l'objet "Cellule",
    Fait un debug.print sur l'adresse de la cellule trouvée, sa feuille et ensuite sa valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim tck As Range
    Set tck = Range("B9").End(xlDown)
    Debug.print tck.Parent ' on verra la feuille
    Debug.print tck.Address ' on aura l'adresse de la cellule
    Debug.print tck.Value ' on aura sa valeur

  14. #54
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    tck est de quel type ?
    As Long

    tel que tu as écris ton code, tu utilises la valeurs de la dernière cellule écrite, en descendant à partir de B9

    Est-ce bien le comportement voulu ?
    je souhaite que tck soit le nombre de valeur non vide depuis B9 jusqu'à la fin possible.

    Comme tu ne renseignes pas la feuille sur laquelle tu travailles, c'est par défaut la feuille active, c'est normal aussi ?
    pour l'instant j'ai une unique feuille. Mais j'ai ajouté ceci avant la ligne qui bloque
    ou ceci
    mais c'est pareil


    En utilisant tck comme Range, afin de travailler sur l'objet "Cellule",
    Fait un debug.print sur l'adresse de la cellule trouvée, sa feuille et ensuite sa valeur.
    avec ou sans point d'arrêt en plus de la fenêtre d'exécution

    ça plante sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set tck = Range("B9").End(xlDown)
    et dans ma fenêtre d'exécution rien ne s'affiche du coup.

    J'pige pô !

  15. #55
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Je n'arrive pas à reproduire ce comportement...


    si tu veux le nombre de cellules non vides, ce n'est pas ainsi qu'on procède
    il faut calculer le nombre (NB) de cellules qui ne sont pas vides de valeur (VAL)

    d'où l'emploi de la formule de feuille de calcul NBVAL (CountA en anglais)

    regarde si avec ça c'est mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub toto()
    Dim tck As Long
    Dim Plage As Range
    Set Plage = Range(Range("B9"), Range("B" & Rows.Count))
        tck = Application.WorksheetFunction.CountA(Plage)
        MsgBox tck
    End Sub

  16. #56
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 294
    Points : 87
    Points
    87
    Par défaut
    J'ai peut-être trouver la cause de mon problème, je dis peut-être

    mon programme selon ma logique est fait ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub optionbutton2_click()
    'Call RAZ
    'OptionButton2.Value = True
    CommandButton4.Visible = True
    CommandButton4.Enabled = True
    Call inhib_frame(False, True, False, True, True, True)
    Call masque_contenu_frame2(True, True, True)
    Call effacer_text_frame2
    Call Gestion_Spin
    End Sub
    dans call RAZ je remets les optionbuttonX.value à false

    de façon lorsque j'appuis sur un boutoncommand cela efface my userform => remet à zéro mes optionbutton

    puis à chaque fois que j'entre dans optionbutton_click je force la main optionbuttonX.value = true

    en mettant le RAZ en commentaire et optionbuttonX.value ça passe mieux et en mettant dans la procédure Gestion_Spin ceci :
    tck = Range("B9").End(xlDown).Row


    j'essaye cependant ta méthode ce soir.

  17. #57
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    puis à chaque fois que j'entre dans optionbutton_click je force la main optionbuttonX.value = true
    qui génère un nouveau click, qui génère un nouveau click, qui génère un nouveau click, ...
    c'est bien une boucle sans fin (http://www.developpez.net/forums/d15...s/#post8697463) qui explique le message de saturation de la pile.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. [XL-2010] Optimisation exécution de code : suppression espace de fin sur plage de données
    Par Poussemousse dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/02/2015, 14h25
  2. Problème d'exécution sur un OnMouseWheel
    Par Omeggg dans le forum Composants VCL
    Réponses: 7
    Dernier message: 15/04/2006, 18h24
  3. Réponses: 4
    Dernier message: 02/04/2006, 18h42
  4. [VBA-E]Arrêt d'exécution sur une requette d'enregistrement
    Par thierry27 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/02/2006, 18h53
  5. Exécutable sur un autre PC
    Par Yphon dans le forum Langage
    Réponses: 6
    Dernier message: 13/01/2006, 21h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo