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

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
 
I

imanuelga

Guest
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+
 
P

Pascal76

Guest
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
 
P

Pascal76

Guest
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
 
I

imanuelga

Guest
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
 
R

René

Guest
On peut probablement encore gagner un peu de temps
en déclarant les tableaux comme tableaux de long au lieu de tableaux de variants.

Ceci suppose bien entendu que l'on soit sur que les cellules soient des entiers.
 

Discussions similaires

Statistiques des forums

Discussions
312 967
Messages
2 094 028
Membres
105 920
dernier inscrit
SAUSSARd