XL 2016 Boucler sur les éléments d'un type

xUpsilon

XLDnaute Accro
Bonjour tout le monde,

Question très rapide pour aujourd'hui mais à laquelle je ne trouve pas de réponse vu que tout le monde utilise le mot "type" dans tous les sens.
Je cherche à faire une collection de lignes d'un tableau afin de pouvoir les dédoubler et retravailler, je vous passe les détails mais en gros j'ai créé un Type de manière à intégrer des lignes d'un tableau de plusieurs colonnes au sein d'une même variable.
Ma question est la suivante : comme j'ai pas mal d'éléments dans mon type, est-il possible de remplir ces éléments en bouclant dessus ? Un espère de truc du genre
VB:
For each Element in MonType
    MonType.Element(i) = Cells(i,1)
    i=i+1
Next Element

Merci !

PS : Je ne peux pas utiliser d'array car j'ai besoin de ReDim mon tableau en permanence et un tableau à 2 dimensions n'aime pas qu'on ReDim son nombre de lignes.
 

tbft

XLDnaute Accro
Bonjour

Personnellement, en cas de tableau à deux dimensions qui peut évoluer dans toutes les directions, j'ai tendance à utiliser un module de classe. je déclare 2 variables par dimensions que j'utilise comme des pointeurs.
Il y a une gymnastique à faire pour les procédures d'ajout, de parcourt et de retrait. Mais, une fois ces techniques maitrisées, on obtiens un outil très flexible.
 

xUpsilon

XLDnaute Accro
Bonjour tbft, job,

@tbft J'ai vu des fils parlant de ça à droite à gauche je vais essayer de m'y intéresser, merci !

@job le souci c'est aussi que je cherche à insérer des lignes dans un tableau. Donc un array ça veut dire qu'il faut que je décale toutes mes lignes avant d'insérer là où je veux, donc pas sûr que ça soit très optimisé (on parle de l'ajout de 10.000 lignes dans un tableau de 60.000).
Du coup je pensais passer par un type perso que je stockerai dans une collection en indiçant les clés de mes valeurs. Comme ça pas besoin de tri ou de décalage, j'ai juste à regarder si ma ligne indicée existe et si oui, je vais chercher mon élément par sa clé.

Si vous avez des idées, je suis à l'écoute

Merci !
 

job75

XLDnaute Barbatruc
Bonjour xUpsilon, tbft, soan,
le souci c'est aussi que je cherche à insérer des lignes dans un tableau. Donc un array ça veut dire qu'il faut que je décale toutes mes lignes avant d'insérer là où je veux, donc pas sûr que ça soit très optimisé (on parle de l'ajout de 10.000 lignes dans un tableau de 60.000).
Oui c'est tout à fait classique avec les tableaux VBA et 60000 lignes ce n'est pas énorme.

A+
 

job75

XLDnaute Barbatruc
Voyez cette macro :
VB:
Sub Insertion()
Dim t#, tablo, ncol%, resu(), i&, n&, j%
t = Timer
With [A1].CurrentRegion.Offset(1)
    tablo = .Resize(.Rows.Count + 1) 'matrice, plus rapide, au moins 2 éléments
    ncol = UBound(tablo, 2)
    ReDim resu(1 To Rows.Count, 1 To ncol)
    For i = 1 To UBound(tablo) - 2
        n = n + 2
        For j = 1 To ncol
            resu(n, j) = tablo(i, j)
    Next j, i
    If n Then .Resize(n, ncol) = resu 'restitution
End With
MsgBox "Durée " & Format(Timer - t, "0.00 \sec")
End Sub
Appliquée à un tableau 5 x 60000 elle s'exécute chez moi en 0,8 seconde, fichier sur Cjoint :


A+
 

xUpsilon

XLDnaute Accro
Rebonjour,

@soan effectivement je n'ai pas fait attention ;)

@job75 je regarde ça en rentrant du boulot, je ne peux pas télécharger depuis mon poste de travail. Pour donner un meilleur contexte voici un fichier que j'utilise pour des essais avec de la data banalisée.
En gros ce que je cherche à faire c'est que suivant la plage entre le début et la fin de mon OF, je vais casser le BECNPREVU pour le répartir en plusieurs lignes (chaque ligne correspondant à un mois avec la somme des BECNPREVU des lignes égale au BECNPREVU initial).
Bref je vais tester ça et je te redis, merci pour le coup de main en tout cas !

PS : Comme tu le verras dans le fichier ci-joint, j'ai commencé à faire des essais à l'aise de Classes mais ça fait vraiment usine à gaz d'avoir 34 dimensions dans ma classe que je Get/Let une par une.

PPS : Tiens c'est bizarre, la macro s'est executée correctement une fois et depuis lorsque je veux la relancer je reçois l'erreur Dépassement de capacité
 

Pièces jointes

  • Tests collection type et classes.xlsm
    89.6 KB · Affichages: 15
Dernière édition:

xUpsilon

XLDnaute Accro
Bon du coup si jamais ça intéresse quelqu'un je suis passé par un module de classe dans lequel j'ai créé une variable par colonne.
Comme ça via un objet de Classe je remplissais ligne à ligne, puis j'ai traité ma Collection via les clés pour optimiser mon temps d'exécution.
Traitement et formatage compris : 1.30min d'exécution pour 50k lignes * 34 colonnes.

Bonne journée !
 

Discussions similaires

Statistiques des forums

Discussions
315 123
Messages
2 116 459
Membres
112 748
dernier inscrit
Pboiusquet