XL 2019 des calculs dans un tableau ("array") ?

Sheldor

XLDnaute Occasionnel
Supporter XLD
bonjour à toutes et tous,

j'ai des opérations assez simples à faire et je fais une boucle du style :

'arrondi de valeur:
precision = 0.2
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Cells(i, 3) = Int(Cells(i, 1) / precision) * precision
Next i

quand j'ai des dizaines de milliers de lignes à traiter je suis patient... mais je me demandais si on peut utiliser les "array" (cet outils incroyable qui m'émerveille mais que j'ai du mal à comprendre) pour faire ce genre de choses et aller plus vite ....

merci par avance pour vos lumières et excellente journée à vous

nico
 

Pièces jointes

  • macro_operation_array.xlsm
    16.3 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Sheldor,
Un essai en PJ avec :
VB:
Sub Arrondir()
   ' Pour l'exemple, remplit A de valeurs aléatoires
    [C2:C10000].ClearContents
    Application.ScreenUpdating = False
    For i = 2 To 10000
        Cells(i, "A") = 100 * Rnd
    Next i
    Application.ScreenUpdating = True
    ' Arrondir valeur, ici 1 chiffre après la virgule
    Application.ScreenUpdating = False
    tablo = Range("A2:A" & Range("A1000000").End(xlUp).Row) ' Transfert données colonne A dans array
    For i = LBound(tablo) To UBound(tablo)                  ' Pour toutes les lignes de l'array
        tablo(i, 1) = Round(tablo(i, 1), 1)                 ' Arrondir sa valeur
    Next i
    [C2].Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo ' Reverser ce tablo en colonne A
End Sub
La première partie ne sert à rien, juste pour l'exemple en remplissant un tableau de valeurs aléatoires.
J'ai arrondi à 1 chiffre après la virgule, la demande n'était pas claire.

C'est vrai que le passage par array est "obligatoire" si on veut aller vite.
Un autre PJ démo qui montre la différence de temps d'exécution entre RW cellules et RW arrays.
 

Pièces jointes

  • macro_operation_array.xlsm
    253.8 KB · Affichages: 3
  • 3- Test RW cellules vs array.xlsm
    22.1 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
Bonjour nico, sylvanu,

une autre façon de faire, avec un tableau T() à une seule dimension. :)

clique sur ton bouton pour voir les résultats ; ensuite, c'est à tester
sur ton vrai fichier avec des dizaines de milliers de lignes.



code VBA (14 lignes) :

VB:
Option Explicit

Sub Bouton1_Cliquer()
  Dim n&: n = Cells(Rows.Count, 1).End(3).Row: If n = 1 Then Exit Sub
  Dim T, précision#, i&: précision = 0.2: n = n - 1
  T = Application.Transpose([A2].Resize(n))
  For i = 1 To n
    T(i) = Int(T(i) / précision) * précision
  Next i
  Application.ScreenUpdating = 0
  Columns(3).ClearContents: [C1] = "Mon résultat"
  [C2].Resize(n) = Application.Transpose(T)
End Sub

soan
 

Pièces jointes

  • macro_operation_array.xlsm
    19.3 KB · Affichages: 3
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof