Est-il plus performant de renseigner une cellule en utilisant le range ou en activant la feuille et en utilisant cells.value ?
Est-il plus performant de renseigner une cellule en utilisant le range ou en activant la feuille et en utilisant cells.value ?
Bonjour,
que tu utilises un range simple, un cells(ligne,colonne) ou encore un range(Cells(ligne,colonne),Cells(ligne,colonne)) ... il sera toujours plus rapide de directement les manipuler, plutôt que d'activer les feuilles et les sélectionner
exemple avec un range simple (c'est pareil pour les Cells et les Range incluant des Cells)
Méthode à proscrire
Methode conseillée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Sub PasOptimal() Sheets("Feuil1").Activate Range("A1").Select Selection.Copy Sheets("Feuil2").Activate Range("B4").Select ActiveSheet.Paste End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Sub PlusOptimal() Sheets("Feuil1").Range("A1").Copy Sheets("Feuil2").Range("B4") End Sub
Je pensais davantage à des données provenant de curseur sql.
Je suis désolé, ma boule de cristal ne fonctionne pas très bien, et vu que tu postes dans la catégorie "Excel VBA", je répond stricto sur ce périmètre puisque tu ne précisait pas de contexte particulier
tes données ont déjà été rapatriée sur Excel ? Ta requête SQL est dans une table sur Excel ou ailleurs ? Que souhaites-tu faire de ta sélection ? etc..
il faut encore des précisions sinon on va encore répondre en dehors de ton souhait
Mes données proviennent d'une base de données oracle.
Est-il plus performant de coder
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 With worksheet("mafeuille") .range("A" & i).value = valeur de mon recordset End with
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 worksheet("mafeuille").activate Cells(i,1).value = valeur de mon recordset
Si on reprend ma première explication, c'est ton premier code le plus perfomant : tu n'actives pas de feuille
mais on peut rendre ton second code équivalent au premier, il suffit de rattacher ton Cells à la feuille concernée :
Par ailleurs, le ".value" n'est pas nécessaire, c'est la propriété par défaut... si tu n'indiques aucun propriété ( Range("A1") = Une valeur) alors c'est interprété comme un .Value
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 With worksheet("mafeuille") .Cells(i,1).value = valeur de mon recordset End With
Bonjour, bonjour !
Mieux vaut préciser une propriété car à chaque fois qu'elle est absente l'IA se pose la question vers quoi l'attribuer !
C'est donc souvent une interprétation en Value mais pas toujours, parfois cela peut-être Text …
J'en connais s'en mordant encore les doigts, étant restés bloqués pendant des jours malgré ma recommandation
de la préciser et m'ayant répondu « pas besoin, c'est par défaut ! » alors qu'en fait pas du tout !
C'est assez rare mais l'ayant rencontré quelques fois, à garder à l'esprit dans un coin car un jour, sait-on jamais …
_____________________________________________________________________________________________________
Je suis Charlie - Je suis Bardo
Bonjour le fil, bonjour le forum,
Page très intéressante Gnain ! Mais elle ne répond pas à la question... Il n'y a , je pense, aucune différence entre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 With Worksheet("mafeuille") .Range("A" & i).value = valeur de mon recordset End With
et :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 With Worksheet("mafeuille") .Cells(I, 1).value = valeur de mon recordset End With
Salut Robert !
Un p'tit oubli dans ton code : le "s" des Worksheets car un type d'objet n'est pas l'objet au sein d'une collection :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim Ws As Worksheet Set Ws = Worksheets("Feuil1")
Bonjour, Thautheme et à tous
j'avais bien écrit à titre d'information.
avec ce code, chez moi, c'est Cells qui remporte
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub test_temps_Cells_Range() Dim sngChrono As Single sngChrono = Timer For i = 1 To 65000 With Sheets("feuil1") .Range("A" & i).Value = "toto" End With Next sngChrono = Timer - sngChrono Dim sngChrono2 As Single sngChrono2 = Timer For j = 1 To 65000 With Sheets("feuil1") .Cells(j, 2).Value = "toto" End With Next sngChrono2 = Timer - sngChrono2 MsgBox "Temps Pour Range : " & CStr(sngChrono * 1000) & " ms" & " Temps Pour Cells : " & CStr(sngChrono2 * 1000) & " ms" End Sub
en fait c'est juju05 qui a fait l'erreur dans son exemple
erreur que j'ai repris bêtement ... tout comme Robert
Exact ‼
Désolé Robert …
Dis, tu m'en veux pas ?!
Bonjour,
ce sub compare le temps pour Cells.value, Range.Value, Cells (sans le .Value) et Range (sans le .Value)
Selon moi même si le résultat du Cells (sans le .Value) est que très légèrement plus vite, il est préférable d'utilisé le .Value.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 Sub test_temps_Cells_Range() Dim sngChrono As Single sngChrono = Timer For i = 1 To 65000 With Sheets("feuil1") .Range("A" & i).Value = "toto" End With Next sngChrono = Timer - sngChrono '============================================= Dim sngChrono2 As Single sngChrono2 = Timer For j = 1 To 65000 With Sheets("feuil1") .Cells(j, 2).Value = "toto" End With Next sngChrono2 = Timer - sngChrono2 '============================================= Dim sngChrono3 As Single sngChrono3 = Timer For k = 1 To 65000 With Sheets("feuil1") .Range("C" & k) = "toto" End With Next sngChrono3 = Timer - sngChrono3 '============================================= Dim sngChrono4 As Single sngChrono4 = Timer For m = 1 To 65000 With Sheets("feuil1") .Cells(m, 4) = "toto" End With Next sngChrono4 = Timer - sngChrono4 '============================================= MsgBox "Temps Pour Range.Value : " & CStr(sngChrono * 1000) & " ms" & _ " Temps Pour Cells.Value : " & CStr(sngChrono2 * 1000) & " ms" & _ " Temps Pour Range(Sans le .Value) : " & CStr(sngChrono3 * 1000) & " ms" & _ " Temps Pour Cells(sans le .Value) : " & CStr(sngChrono4 * 1000) & " ms" End Sub
Bonsoir le fil, bonsoir le forum,
Bien vu Gnain ! le résultat est probant...
Quant à toi Marc, oui je t'en veux à mort... Loule (Oui je sais mais à Sète on dit Loule (Louis) et pas Lol) !
Bonjour,
Sans avoir fait une revue exhaustive des expériences des "collègues" voici, comme dirait Guy A. Lepage, "La question qui tue" : Pourquoi activer la feuille ?
Cells et Range sont fondamentalement la même chose, des Objets Range. Les moments où il faut sélectionner ou activer la feuille pour manipuler des objets Range, sont excessivement rares.
Bonjour
Même chose chez-moi (Excel 2010 64 bits).
Mais, ce qui me surprend le plus, c'est qu'en mettant la priorité d'Excel en "RealTime" dans le gestionnaire de tâches, c'est plus rapide de 4 à 5 secondes. Je n'ai pas fait le calcul exact, cela varie un peu de fois en fois, mais l'écart est toujours similaire.
Il faudrait demander à tous les questionneurs qui viennent pour des macros trop lentes, de tester Priorité normale et Priorité maximale.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager