Range ou Cells ?

Salut à tous, petite question philosophique.

Il est préférable d'utiliser range ou cells quand on cherche à ne cible qu'une cellule ?

Range("A1") ou Cells(1,1) ?

Est ce que les deux sont parfaitement équivalents ?

Si oui, on est d'accord que range est bien plus pratique ?

bonjour,

Est ce que les deux sont parfaitement équivalents ?

non pas tout à fait range devra d'abord convertir la chaine "A1" en numéro de ligne et de colonne et d'après mes tests range("A1") met 2 fois plus de temps que cells(1,1).

Si oui, on est d'accord que range est bien plus pratique ?

question de goût ou de couleur !

Bonjour,

Personnellement, je vois les choses un peu différemment.

En général la question ne se pose que pour les débutants. Le macroteur un peu habitué n'utilisera dans la majeur partie des cas ni l'un ni l'autre. (Parce que c'est chronovore.)

Reste les 10 % des cas ou ça n'a que peu d'importance (parce qu'il ne s'agit que de "petit" calculs" en général instantanés : Dans ce cas effectivement la question de pratique est très discutable. Personnellement je trouve Cells plus pratique : ça permet de variabiliser facilement dans une boucle... Après c'est une question d'expérience...

A+

Le macroteur un peu habitué n'utilisera dans la majeur partie des cas ni l'un ni l'autre. (Parce que c'est chronovore.)

Ça m’intéresse, qu’est-ce que le macroteur habitué utilise dans ce genre de cas ?

bonjour,

Ça m’intéresse, qu’est-ce que le macroteur habitué utilise dans ce genre de cas ?

si les performances sont importantes, on travaillera avec des variables array VBA dans lesquelles on aura copié le contenu des plages nécessaires.

Est ce que tu aurais des tutos pour ça ? Ou existe-t-il un ouvrage de référence avec toutes les fonctions avancées de vba ?

Sub test()
Dim t
Dim i As Long
Dim l As Long
Dim Myrange As Range, c As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
l = 100000
    Set Myrange = Range("A1:A" & l)

    t = Timer
    Myrange = Evaluate("Row(1:" & l & ")")
Debug.Print "Avec Evaluate,Temp écoulé : "; Timer - t

    t = Timer
    For Each c In Myrange
        c.Value = c.Row
    Next
Debug.Print "Avec For each, Temp écoulé : "; Timer - t

    t = Timer
    For i = 1 To l
        Range("A" & i).Value = i
    Next
Debug.Print "Avec Range, Temp écoulé : "; Timer - t

    t = Timer
    For i = 1 To l
        Cells(i, 1).Value = i
    Next
Debug.Print "Avec Cells, Temp écoulé : "; Timer - t
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Sub test1()
Dim t, t1, t2
Dim i As Long
Dim l As Long
Dim Myrange As Range, c As Range
Application.ScreenUpdating = False
Application.EnableEvents = False

Debug.Print "____________________________________"

    Set Myrange = Range("A1:A100000")
    t = Timer
    Myrange = Evaluate("Row(1:100000)")
Debug.Print "Avec Evaluate,Temp écoulé : "; Timer - t

    t = Timer
    For Each c In Myrange
        c.Value = c.Row
    Next
Debug.Print "Avec For each, Temp écoulé : "; Timer - t

    t = Timer
    For i = 1 To 100000
        Range("A" & i).Value = i
    Next
Debug.Print "Avec Range, Temp écoulé : "; Timer - t

    t = Timer
    For i = 1 To 100000
        Cells(i, 1).Value = i
    Next
Debug.Print "Avec Cells, Temp écoulé : "; Timer - t

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Voilà les résultats :

Avec Evaluate,Temp écoulé :  0,1796875 
Avec For each, Temp écoulé :  4,296875 
Avec Range, Temp écoulé :  5,921875 
Avec Cells, Temp écoulé :  4,664063 
____________________________________
Avec Evaluate,Temp écoulé :  0,1796875 
Avec For each, Temp écoulé :  4,234375 
Avec Range, Temp écoulé :  6,046875 
Avec Cells, Temp écoulé :  4,664063 

Le grand gagnant pour remplir des cellules c'est bien avec Evaluate.

Pour les autres cela ce suit dans un mouchoir de poche, Cells est un peu plus rapide mais tout de même pas deux fois moins....

Donc pour moi n'utilisant pas de gros fichiers mon choix se porte sur Range, les plages nommées, et les boucle For Each qui sont plus parlantes

For Each IdClient in Range("tab_Clients[ID]")
if Range("TotalMois") = ...
'...

Et plus parlant qu'un

For i = 1 To Cells(Rows.Count, 4).End(xlUp).Row
If Cells(12, 4) = ...
'...

Encore une fois ceci est, et reste, mon avis personnel.

Est ce que tu aurais des tutos pour ça ? Ou existe-t-il un ouvrage de référence avec toutes les fonctions avancées de vba ?

Regardes de ce coté et plus précisément sur les tableaux...

bonsoir à tous,

voici le test que j'ai fait

Sub test()
    t = Timer
    For i = 1 To 10000
        a = Range("A1")
    Next i
    Debug.Print "range temps, " & Timer - t
    t = Timer
    For i = 1 To 10000
        a = Cells(1, 1)
    Next i
    Debug.Print "cells temps, " & Timer - t
End Sub

résultat

range temps, 6.500244E-02

cells temps, 3.100586E-02

range est donc 2 fois plus lent que cells.

@Jean-Paul

Le grand gagnant pour remplir des cellules c'est bien avec Evaluate.

pour remplir les cellules A1:A100000 avec les valeurs de 1 à 100000, le grand gagnant pour moi est .filldown, suivi de array vba/evaluate (tantôt l'un, tantôt l'autre selon les essais)

...Pour que le tableau soit complet on pourrait ajouter qu'il est communément admis que le travail sur des Array divise le temps d'exécution d'une macro au moins par 20 ! C'est à dire qu'une macro qui mettrait 20 secondes à s'exécuter n'en met plus qu' 1 si on travaille sur des Array...

Bien sur cette évaluation se base sur des macros correctement optimisées. S'agissant des macros de débutants truffées de Select, Offset Activate et autres joyeusetés, ce gain pourrait encore multiplié par 5...

A+

Rechercher des sujets similaires à "range"