Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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,


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

Cousinhub

XLDnaute Barbatruc
Re-,
J'oubliais,
J'avais également testé avec un filtre élaboré.. 0.055
VB:
Sub Macro2()
T = Timer
Dim Plg As Range
With Sheets("DA")
    Set Plg = .Range("A4:Q" & .Cells(Rows.Count, "F").End(xlUp).Row)
    .Range("S5").FormulaR1C1 = "=RC[-11]<>0"
End With
With Sheets("Résultat")
    .Range("K1").Resize(, 4).Value = Sheets("DA").Range("E4").Resize(, 4).Value
    Plg.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
        Sheets("DA").Range("S4:S5"), CopyToRange:=.Range("K1").Resize(, 4), Unique:=False
End With
Sheets("DA").Range("S4:S5").Clear
MsgBox Timer - T
End Sub

Mais, bon trop de choix pourrait nuire au choix...
 
C

Compte Supprimé 979

Guest
Bonsoir à tous et un GRAND merci

Vous me sortez d'un sacré calvaire.... j'ai les neurones qui chauffaient dur...

J'ai effectivement l'embarras du choix vous êtes des cadors les mecs

Je ne sais pas si je dois vous dire quel code je prends
ils sont tous au TOP et ça va m'éviter m'arracher les derniers cheveux que j'ai.

BRAVO
 

patricktoulon

XLDnaute Barbatruc
ce que j'aime bien dans cette pratique de app.index
tabl = Application.Index(variable tableau , array 2 dim(x ligne 1 colonne), Array 1 dim )

c'est que l'on peut mettre les colonnes dans l'ordre qu'on veut

tabl = Application.Index(Tbl, Application.Transpose(lignes), Array(8,5,7,6))

c'est kool non?
 

Cousinhub

XLDnaute Barbatruc
Hello,
0.21
Comme je l'avais dit à @patricktoulon , le filtre auto semble bien moins rapide que le filtre élaboré
Bonne soiré
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Moi aussi je veux jouer.
Pour 20 000 lignes de données, la durée pour remplir le tableau résultat r est de 0,008 s à 0,016 s.
VB:
Sub Essai()
Dim deb, der&, t, i&, n&, j&
   deb = Timer: Application.ScreenUpdating = False
   With Sheets("DA")
      der = .Cells(.Rows.Count, "e").End(xlUp).Row
      t = .Range("e5:h" & der)
   End With
   For i = 1 To UBound(t)
      If IsNumeric(t(i, 4)) Then If t(i, 4) > 0 Then n = n + 1
   Next i
   ReDim r(1 To n, 1 To 4): n = 0
   For i = 1 To UBound(t)
      If IsNumeric(t(i, 4)) Then
         If t(i, 4) > 0 Then n = n + 1: For j = 1 To 4: r(n, j) = t(i, j): Next
      End If
   Next i
   MsgBox "Durée construction du tableau résultat r = " & Format(Timer - deb, "0.000\ sec.")
   'vérif
   Sheets("résultat").Columns("a:d").Clear
   Sheets("résultat").Columns("a:d").Resize(UBound(r)) = r
End Sub
 

Pièces jointes

  • BrunoM45- lecture tableau- v1a.xlsm
    27.4 KB · Affichages: 5

mapomme

XLDnaute Barbatruc
Supporter XLD
il faut aussi tester en mettant le résultat du timer après avoir collé le tableau
jean marie
Bonsoir @ChTi160 ,

J'ai considéré que la question était (je cite) :

Méthode rapide pour mettre cellules dans variable tableau​

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.
 
Dernière édition:

Eric C

XLDnaute Barbatruc
Bonsoir le fil

@BrunoM34 - j'ai les neurones qui chauffaient dur...
Je ne sais pas si je dois vous dire quel code je prends
ils sont tous au TOP et ça va m'éviter m'arracher les derniers cheveux que j'ai.
Je n'aurais pas été d'une grande utilité dans ce fil. Au vu de tes commentaires et à la suite de tes neurones bouillants, tu as choisi de t'auto-congratuler en choisissant ton post #22 comme solution
Ne le prends surtout pas mal - Bonne soirée
@+ Eric c
 

laurent950

XLDnaute Accro
Bonsoir,

J'ai optimisé :
Pour 1 045 079 Lignes = 2,781 secondes

VB:
Option Explicit
Sub Test4()
Dim deb As Single
deb = Timer
Application.ScreenUpdating = True
  Dim ShtDA As Worksheet
      Set ShtDA = ThisWorkbook.Worksheets("DA") ' ..................... Feuille DA
  Dim dLig As Long
      dLig = ShtDA.Range("F" & Rows.Count).End(xlUp).Row ' ............ Derniére ligne non vide
  Dim Filtre As Range
      Set Filtre = ShtDA.Range(ShtDA.Cells(4, 5), ShtDA.Cells(dLig, 8)) ' .. Zone de séléction pour Filtre
          Filtre.AutoFilter Field:=4, Criteria1:="<>" ' .............. Filtre sur Place
  Dim Plage As Range
      Set Plage = Filtre.SpecialCells(xlCellTypeVisible) ' .......... Cellule visible de la zone de Filtre
                  Filtre.AutoFilter ' ............................... Suppression du filtre
  Dim ShtResult As Worksheet
      Set ShtResult = Worksheets("Résultat")
  Dim t() As Variant
  Dim i As Long
  ReDim t(1 To Plage.Areas.Count)
        For i = LBound(t) To UBound(t)
            t(i) = Plage.Areas(i).Value
            ShtResult.Cells(i, 1).Resize(UBound(t(i), 1), UBound(t(i), 2)) = t(i)
        Next i
Application.ScreenUpdating = False
MsgBox "Durée construction du tableau résultat r = " & Format(Timer - deb, "0.000\ sec.")
End Sub

Ou

VB:
Option Explicit
Sub Test7()
Dim deb As Single
deb = Timer
Application.ScreenUpdating = False
  Dim ShtDA As Worksheet
      Set ShtDA = ThisWorkbook.Worksheets("DA") ' ..................... Feuille DA
  Dim dLig As Long
      dLig = ShtDA.Range("F" & Rows.Count).End(xlUp).Row ' ............ Derniére ligne non vide
  Dim Filtre As Range
      Set Filtre = ShtDA.Range(ShtDA.Cells(4, 5), ShtDA.Cells(dLig, 8)) ' .. Zone de séléction pour Filtre
          Filtre.AutoFilter Field:=4, Criteria1:="<>" ' .............. Filtre sur Place
  Dim Plage As Range
      Set Plage = Filtre.SpecialCells(xlCellTypeVisible) ' .......... Cellule visible de la zone de Filtre
                  Filtre.AutoFilter ' ............................... Suppression du filtre
  Dim ShtResult As Worksheet
      Set ShtResult = Worksheets("Résultat")
  Dim t(), temp() As Variant
  ReDim temp(1 To Plage.Areas.Count, 1 To Plage.Areas(1).Count)
  Dim i, j As Long
  ReDim t(1 To Plage.Areas.Count)
        For i = LBound(t) To UBound(t)
            t(i) = Plage.Areas(i).Value
                For j = LBound(temp, 2) To UBound(temp, 2)
                    temp(i, j) = t(i)(1, j)
                    'temp(i, j) = Plage.Areas(i)(1, j)
                Next j
        Next i
        ShtResult.Cells(1, 1).Resize(UBound(temp, 1), UBound(temp, 2)) = temp
Application.ScreenUpdating = True
MsgBox "Durée construction du tableau résultat r = " & Format(Timer - deb, "0.000\ sec.")
End Sub
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
324
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…