récupérer une colonne d'un tableau variant sans boucle

  • Initiateur de la discussion Initiateur de la discussion imanuelga
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

I

imanuelga

Guest
Bonjour à tous,

Je voudrais pouvoir réccupérer la 3 ème colonnede mon tableau sans passer par la 2ème boucle de mon exemple. Est-ce possible ?
existe-t'il quelque chose comme Range("c1:c" & nl) = tabl(,3) ?

Merci à ce forum !

Sub tabl1()

Dim nl As Long, i As Long,tabl() As Variant

nl = Cells(1, 1).CurrentRegion.Rows.Count

tabl = Range("a1:c" & nl)

For i = 2 To nl
tabl(i, 3) = IIf(tabl(i, 1) = tabl(i - 1, 1), tabl(i, 2) + tabl(i - 1, 3), tabl(i,2))
Next i

For i = 1 To nl
tabl(i, 1) = tabl(i, 3)
Next i

Range("c1:c" & nl) = tabl

End Sub
 
Bonjour Pascal,

Heureux te te retrouver !

Pour ma question, ce n'est pas la réponse que j'attends.
En effet, ( pour des raisons de test de vitesse) mon idée est de traiter des calculs dans un tableau dynamique a 2 dimensions (dans la mémoire du pc ) et décrire en une fois les résultats calculés sur une ou plusieurs colonnes. Or pour l'intant, en appliquant l'instruction
Range("")= x '( x étant le tableau )
Je ne sais que lui faire recopier dans une plage soit la totalité du tableau variant soit les primières colonnes de ce tableau (en prenant une plage avec un nombre de colonnes inférieurs à ce tableau )

Ainsi dans mon exemple, lorsque je la macro exécute
Range("c1:c" & nl) = tabl
elle ne recopie que la première colonne dans cette plage alors que le tableau variant en a en réalité 3 (cf l'instruction tabl = Range("a1:c" & nl) du début ).

a+
 
Essaies avec ce code si j'ai bien compris cette fois ......

Sub tabl1()

Dim nl As Long, i As Long, tabl() As Variant

nl = Cells(1, 1).CurrentRegion.Rows.Count

tabl = Range("a1:c" & nl)

For i = 2 To nl
tabl(i, 3) = IIf(tabl(i, 1) = tabl(i - 1, 1), tabl(i, 2) + tabl(i - 1, 3), tabl(i, 2))
Next i

For i = 1 To nl
Cells(i, 3) = tabl(i, 3)
Next i

End Sub


Pascal
 
Regarde le code ci-dessous j'ai rajouté une deuxième table qui te récupère tes données au fur et à mesure et c'est celle-ci que tu récupères.
est-ce plus rapide ? tu vas bientôt me le dire

Sub tabl1()

Dim nl As Long, i As Long, tabl() As Variant, tabl2() As Variant

nl = Cells(1, 1).CurrentRegion.Rows.Count

tabl = Range("a1:c" & nl)
tabl2 = Range("c1:c" & nl)

For i = 2 To nl
tabl(i, 3) = IIf(tabl(i, 1) = tabl(i - 1, 1), tabl(i, 2) + tabl(i - 1, 3), tabl(i, 2))
tabl2(i, 1) = tabl(i, 3)
Next i

Range("c1:c" & nl) = tabl2

End Sub
 
Bravo Pascal ! 🙂

L'idée d'utiliser 2 tableaux est super! Du coup j'ai ammélioré encore en ne faisant qu'une ligne de programe dans la boucle.
Il faut donc avoir 2 tableaux un pour les données d'entrée l'autre pour les résultats. Puis ensuite copier le tableau résultats sur les plages.

Au niveau du temps, si l'on ne fait qu'un seul calcul avant de recopier les données sur une plage, on ne gagne pas par rapport a une formula
R1C1 sur la plage "c", car lire les données dans le tableau variant prend du temps. Par contre, sur plusieurs résultats, cela pourrait être interéssant , les données n'étant lues qu'une fois et l'écriture étant trés rapide.

As-tu d'autres commentaires ?

Merci beaucoup Pascal,
A la prochaine ...


Sub tabl2() ' cumul besoin : colonne a ="article", colonneb = "besoin", colonne c = "cumul"

Dim nl As Long, i As Long, tabl() As Variant, tabl2() As Variant, deb As Date

Application.ScreenUpdating = False
nl = Cells(1, 1).CurrentRegion.Rows.Count

deb = Timer
tabl = Range("a1:b" & nl)
tabl2 = Range("c1:c" & nl)

For i = 2 To nl
tabl2(i, 1) = IIf(tabl(i, 1) = tabl(i - 1, 1), tabl(i, 2) + tabl2(i - 1, 1), tabl(i, 2))
Next i

Range("c1:c" & nl) = tabl2

MsgBox Format(Timer - deb, "0.00")&"s"

End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
5
Affichages
703
Réponses
3
Affichages
833
Réponses
5
Affichages
477
Réponses
8
Affichages
646
Réponses
10
Affichages
530
Retour