XL 2016 Méthode rapide pour mettre cellules dans variable tableau

  • Initiateur de la discussion Compte Supprimé 979
  • Date de début
C

Compte Supprimé 979

Guest
Bonjour à toutes et à tous,

Qui pourrait me donner une méthode rapide pour le code pour mettre des cellules dans une variable tableau

Situation :
- J'ai un classeur de DA (Demande d'Achats) qui contient 12.500 lignes
- Sur la feuille "DA" on saisi en colonne H les quantités souhaitées de matériel

Objectif :
- Mettre plusieurs cellule de la ligne contenant une Qt dans une variable tableau

Sachant que le fichier contient plus de 12.000 lignes
- je vais comptabiliser le nombre de lignes dont Qt <> 0

Je pensais faire une boucle et mémoriser chaque ligne dont Qt <>0 et sortir de la boucle si NbLignesQt est atteint
Mais n'y a t'il pas une solution plus rapide ?

Un fichier test qui va bien pour quelques lignes... mais pour plus de 10.000 🥴

Par avance merci de votre aide
 

Pièces jointes

  • Classeur DA.xlsm
    32.1 KB · Affichages: 24
Solution
C
Salut mapomme, tous,

J'ai considéré que la question était (je cite) :
Donc, logiquement, on ne mesure pas le transfert sur la feuille ;).
C'est pourquoi la durée est comptée quand r est rempli.
nota : pour 20 000 lignes de données, si on mesure après le transfert sur la feuille Résultat, on trouve entre 0,016 et 0,032 s.

Tu penses bien que je ne garde pas ma variable tableau comme ça... au chaud 😜
Je colle mon tableau sur une feuille, il faut donc bien prendre en compte ce délais

Mais c'est tout bon, vous m'avez donné toutes les codes possible et inimaginables 😁

Comme je ne peux les marquer tous comme solution, j'ai marqué ce message 🤣 👍
C

Compte Supprimé 979

Guest
Salut mapomme, tous,

J'ai considéré que la question était (je cite) :
Donc, logiquement, on ne mesure pas le transfert sur la feuille ;).
C'est pourquoi la durée est comptée quand r est rempli.
nota : pour 20 000 lignes de données, si on mesure après le transfert sur la feuille Résultat, on trouve entre 0,016 et 0,032 s.

Tu penses bien que je ne garde pas ma variable tableau comme ça... au chaud 😜
Je colle mon tableau sur une feuille, il faut donc bien prendre en compte ce délais

Mais c'est tout bon, vous m'avez donné toutes les codes possible et inimaginables 😁

Comme je ne peux les marquer tous comme solution, j'ai marqué ce message 🤣 👍
 

patricktoulon

XLDnaute Barbatruc
c'est comme à l'école de fans
tout le monde a gagné
diabolo.gif
 

job75

XLDnaute Barbatruc
Bonjour à tous,

@bhbh avec des durées de quelques centièmes de seconde je me suis demandé comment tu pouvais avoir confiance dans les résultats, tu fais une boucle sur le timer ?

Pour en avoir le cœur net avec le fichier du post #1 j'ai copié la plage 6:38 sur 132 000 lignes.

Chez moi sur Win 11 Excel 2019 j'obtiens les résultats suivants :

- post #5 => 0,42 sec

- post #6 => 0,42 sec

- post #18 => 0,75 sec

- post #21 => 0,31 sec (filtre avancé)

- post #27 => 0,20 sec (avec restitution dans la feuille)

- post #33 => 2 sec et 1,6 sec.

@mapomme ta 1ère boucle qui prend 9 millisecondes :
VB:
   For i = 1 To UBound(t)
      If IsNumeric(t(i, 4)) Then If t(i, 4) > 0 Then n = n + 1
   Next i
peut être remplacée par cette ligne dans le bloc With qui prend 3 millisecondes :
VB:
      n = Application.CountIf(.Columns("h"), ">0")
A+
 

Efgé

XLDnaute Barbatruc
Bonjour à tous
En reprenant les idées des intervenants et en limitant la plage prise en compte par le tableau sourcej'ai fait ça.
Juste pour ma gouverne personnelle, @job75 aurais-tu la gentillesse de tester ce code dans les mêmes conditions que les autres (même si je pense que dans le vrai fichier les colonnes ne sont pas continues)?
VB:
Sub post_34()
Dim dLig&, Lig&, i&, Inc&, n&
Dim TabSource As Variant, TabReport As Variant
Dim T!
T = Timer
Application.ScreenUpdating = False
With ThisWorkbook.Sheets("DA")
    dLig = .Cells(.Rows.Count, 6).End(xlUp).Row
    TabSource = .Range(.Cells(7, 5), .Cells(dLig, 8))
    n = Application.CountIf(.Columns("h"), ">0") + 7
    TabReport = .Range(.Cells(7, 5), .Cells(n, 8))
End With
For Lig = LBound(TabSource, 1) To UBound(TabSource, 1)
    If TabSource(Lig, 4) <> 0 Then
        Inc = Inc + 1
        For i = 1 To 4
            TabReport(Inc, i) = TabSource(Lig, i)
        Next i
    End If
Next Lig
If Inc > 0 Then Sheets("Résultat").Range("A1").Resize(Inc, 4) = TabReport
MsgBox Timer - T
End Sub

Cordialement
 

job75

XLDnaute Barbatruc
Bonjour Efgé,

Ta dernière macro est très voisine de celle de mapomme corrigée comme je l'ai dit.

Sur 132 000 lignes elle s'exécute en 0,18 seconde environ,

Mais pourquoi diable initialiser TabReport à partir de la feuille "DA" ?

A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :),

Pour ma part le sujet est clos, je mets une dernière version qui possède un bouton Init... sur la feuille DA qui permet d'initialiser les données sources à sa convenance (pour test). Les valeurs par défaut sont 200 000 lignes avec 15% de lignes à quantité supérieure à 0.

nota : j'ai pris en compte la suggestion de @job75 (que je salue :)) sur le calcul du nombre de lignes avec Qté >0 sur la feuille DA ;).

Bonne journée à tous.
 

Pièces jointes

  • BrunoM45- lecture tableau- v3.xlsm
    27.2 KB · Affichages: 6
C

Compte Supprimé 979

Guest
Salut,

Les gars vous me faites trop rire 😂 👍

Pour moi ce n'était pas une compétition (j'ai horreur de ça)
mais juste un souffle à me donner pour que je puisse décoller 😜

Surtout que la finalité est quand même un peu plus compliqué 😁

Mais grâce à vous tous, j'ai pris mon envole... et ça fait du bien 👌✌️

Au plaisir et bon week-end
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Pour moi ce n'était pas une compétition (j'ai horreur de ça)
mais juste un souffle à me donner pour que je puisse décoller

Vole, vole petit @BrunoM45 ! 🦋 🦋

Point de compétition, à mon âge je me hâte lentement 🐛 🐛.

Juste qu'il est intéressant de comparer des méthodes. Quelquefois, on est surpris qu'une méthode qu'on croyait moins célère par principe soit en fait plus rapide que les méthodes qu'on croyait très promptes ; ça peut me permettre de revenir sur quelques idées préconçues.

Bon après-midi à tous... :)
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
316

Statistiques des forums

Discussions
312 040
Messages
2 084 827
Membres
102 684
dernier inscrit
flint125