Pourqoi eviter les .select

Bonjour le Forum

dans une réponse à un post eric écrit

Et j'aurai tendance à demander pourquoi tu veux faire un .Select qu'on cherche normalement à éviter le plus possible ?

voilà plusieurs fois que je tombe sur cette recommandation sans comprendre

alors je pose la question

sil te plait Eric ou un membre du forum

pourquoi éviter le select?

Merci et A plus sur le forum

Bonjour,

ça ne sert à rien et ça ne fait que ralentir (énormément) tes macros.

Il n'y a pas que les select qu'il faut bannir :

Tous les ActiveQuelqueChose et Selection sont à proscrire

Personnellement je met dans le même sac les Offset...

Car tout cela donne un codage flou :

Une fois que tu as écris

ActiveWorkbook.ActiveSheet.ActiveCell.Select
Selection.Offset(6, -4).Select

... T'es bien avancé : Tu ne sais même pas d’où tu es parti ni ou tu atterris !

Et pour peu que tu rajoutes un Resize là tu as tout gagné : T'es complètement paumé !

A+

merci galopin

je m'en souviendrais

A plus sur le forum

Bonjour,

Non seulement ça sert à rien, ça ralentit, mais c'est une des principales sources de soit-disant "dysfonctionnement" des macros, alors qu'il s'agit en réalité de négligence.

Et ces codes mal écrits polluent des forums d'entraide !

merci Patrice

c'est d’ailleurs bien pour s’améliorer qu'on pose des questions

A plus sur le forum (en évitant bien sur les .select )

Bonjour,

un exemple qui t'aidera à bien t'en rappeler :

Sub test()
    Dim t As Single, i As Double, a
    Application.ScreenUpdating = False
    t = Timer
    For i = 1 To 10000
        Cells(i, 1).Select
        a = Selection.Value
    Next i
    Debug.Print Timer - t ' 2 s
    t = Timer
    For i = 1 To 10000
        a = Cells(i, 1).Value
    Next i
    Debug.Print Timer - t ' 0.078 s
End Sub

soit 25 fois plus rapide chez moi...

Et si pour une raison x tu ne mets pas Application.ScreenUpdating = False, là c'est 150 fois plus rapide.

eric

Bonjour,

Un autre bonne raison, c'est que d'autres macros peuvent interférer avec celle qui utilise .select et semer la pagaille.

Par exemple :

16fautpasdeselect.zip (13.76 Ko)

Avec ce code :

Dim temps
Sub test()
Dim t1 As Single, t2 As Single, i As Double, n As Long, m As String
Dim v1 As Variant, a1 As String, v2 As Variant, a2 As String
    n = 2000
    Worksheets("Feuil1").Select
    Range("A1").Select
    debTemps
    ' Avec .select
    t1 = Timer
    For i = n To 1 Step -1
        Cells(i, Selection.Column).Select
        v1 = Selection.Value
        a1 = Selection.Address(False, False)
        DoEvents
    Next i
    t1 = Timer - t1
    ' Sans .Select
    t2 = Timer
    For i = n To 1 Step -1
        v2 = Worksheets(1).Cells(i, 1).Value
        a2 = Worksheets(1).Cells(i, 1).Address(False, False)
        DoEvents
    Next i
    t2 = Timer - t2
    ' Résultat
    finTemps
    m = "Avec Select : " & Format(t1, "0.000") & " s, fin en " & a1 & " = " & v1 & vbLf & _
        "Sans Select : " & Format(t2, "0.000") & " s, fin en " & a2 & " = " & v2 & vbLf & _
        vbLf & "Et sans Select c'est " & Format(t1 / t2, "0.0") & " fois plus rapide" & vbLf
    MsgBox m
End Sub
Sub debTemps()
  temps = Now + TimeValue("00:00:01")
  Application.OnTime temps, "majTemps"
End Sub
Sub majTemps()
  temps = Now + TimeValue("00:00:01")
  Application.OnTime temps, "majTemps"
  ActiveCell.Offset(0, 1).Activate
End Sub
Sub finTemps()
 On Error Resume Next
 Application.OnTime temps, Procedure:="majTemps", Schedule:=False
End Sub

Bonjour

c'est édifiant

mais il est vrai que quand on est novice comme moi on a plutôt tendance à mettre des select par crainte de ne pas écrire au bon endroit

et merci à tous on apprends beaucoup en suivant vos réponses aux nombreuses questions qui circulent sur le forum

Rechercher des sujets similaires à "pourqoi eviter select"