Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA Optimisation Remplacement valeur si ...

4 réponses
Avatar
Domi
bonsoir à tous,

Petite question pour optimiser un code...

Range("A3", Range("A65000").End(xlUp)).Replace What:="Prévis.",
Replacement:="", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False

Est-il possible d'utiliser une syntaxe similaire et surtout aussi rapide qui
permettent de remplacer par "" tout ce qui est <> de "Prévis."

Merci
Domi

4 réponses

Avatar
Jean-François Aubert
Salut Domi,

remplacer par "" tout ce qui est <> de "Prévis."


J'ai testé 3 manières différentes (RienQuePrévis1-2-3),
à tester 1 fois après avoir exécuté Sub peu()
et 1 fois après avoir exécuté Sub beaucoup()

Qui dit mieux, en partant des 2 sub de préparations (Sub peu()
et Sub beaucoup() ?


'*********************************
Sub RienQuePrévis1()
' si dans la plage A20:A6500
'10 blocs de 10 cellules sont à remplacer par "" : 7 secondes
'sub peu

' si toutes les valeurs de A20:A6500
'sauf 10 blocs de 10 cellules sont à remplacer par "" : 1 secondes
'sub beaucoup

td = Time
Set Rng = Range("A3:A65536")
Do
début:
On Error GoTo fin
r = Application.Match("Prévis.", Rng, 0)
If r = 1 Then GoTo saute
If Rng(r - 1) = "Prévis." Then Set Rng = _
Range(Rng(r + 1).Address & ":A65536"): GoTo début
If IsError(r) = False Then Range(Rng(r - 1).Address _
& ":" & Rng(r - (r - 1)).Address).ClearContents
saute:
Set Rng = Range(Rng(r + 1).Address & ":A65536")
Loop While IsError(r) = False
fin:
Rng.ClearContents
Set Rng = Nothing
tf = Time
MsgBox "effectué en : " & CDate(tf - td)
End Sub
'.............................................................................
Sub RienQuePrévis2()
' si dans la plage A20:A6500
'10 blocs de 10 cellules sont à remplacer par "" : 2 secondes
'sub peu

' si toutes les valeurs de A20:A6500
'sauf 10 blocs de 10 cellules sont à remplacer par "" : 18 secondes
'sub beaucoup

td = Time
Set Rng = Range("A3:A65536")
For Each c In Rng
If c <> "Prévis." Then c.ClearContents
Next
Set Rng = Nothing
tf = Time
MsgBox "effectué en : " & CDate(tf - td)
End Sub
'.......................................................................
Sub RienQuePrévis3()
' si dans la plage A20:A6500
'10 blocs de 10 cellules sont à remplacer par "" : 8 secondes
'sub peu

' si toutes les valeurs de A20:A6500
'sauf 10 blocs de 10 cellules sont à remplacer par "" : 4 secondes
'sub beaucoup

td = Time
Set Rng = Range("A3", Range("A65000"))
Rng.Replace What:="Prévis.", _
Replacement:=1, LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:úlse
Rng.Replace What:="", _
Replacement:=0, LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:úlse
Range("A2").AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="<>1", Operator:=xlAnd, _
Criteria2:="<>0"
Rng.SpecialCells(xlCellTypeVisible).Replace What:="*", _
Replacement:="", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:úlse
Selection.AutoFilter
Rng.Replace What:="1", _
Replacement:="Prévis.", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:úlse
Rng.Replace What:="0", _
Replacement:="", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:úlse
Set Rng = Nothing
[a1].Select
tf = Time
MsgBox "effectué en : " & CDate(tf - td)
End Sub
'........................................................................................
Sub peu()
'prépare une feuille pour test
[a2] = "titre"
[a20:a65000] = "Prévis."
[a30:a40] = "test"
[a60:a70] = "test"
[a90:a100] = "test"
[a110:a120] = "test"
[a130:a140] = "test"
[a150:a160] = "test"
[a170:a180] = "test"
[a190:a200] = "test"
[a210:a220] = "test"
[a230:a240] = "test"
[a3:a19] = ""
[a3] = "Prévis."
[a8] = "Prévis."
[a10] = "Prévis."
[a11] = "Prévis."
[a16] = "Prévis."
[a17] = "Prévis."
[a18] = "Prévis."
End Sub

'..........................................................................
Sub beaucoup()
'prépare une feuille pour test
[a2] = "titre"
[a20:a65000] = "test."
[a30:a40] = "Prévis."
[a60:a70] = "Prévis."
[a90:a100] = "Prévis."
[a110:a120] = "Prévis."
[a130:a140] = "Prévis."
[a150:a160] = "Prévis."
[a170:a180] = "Prévis."
[a190:a200] = "Prévis."
[a210:a220] = "Prévis."
[a230:a240] = "Prévis."
[a3:a19] = ""
[a3] = "Prévis."
[a8] = "Prévis."
[a10] = "Prévis."
[a11] = "Prévis."
[a16] = "Prévis."
[a17] = "Prévis."
[a18] = "Prévis."
End Sub


'*********************************
--
Amicalement

Jean-François Aubert
{Vaudois de la Côte Lémanique}


"Domi" a écrit dans le message de news:
bonsoir à tous,

Petite question pour optimiser un code...

Range("A3", Range("A65000").End(xlUp)).Replace What:="Prévis.",
Replacement:="", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:úlse

Est-il possible d'utiliser une syntaxe similaire et surtout aussi rapide qui
permettent de remplacer par "" tout ce qui est <> de "Prévis."

Merci
Domi




Avatar
AV
En adaptant la plage :

Sub zzzzz()
Application.ScreenUpdating = False
Range("A1", [A65536].End(3)).AutoFilter Field:=1, Criteria1:="<>*Prévis.*"
Range("A2", [A65536].End(3)).SpecialCells(xlCellTypeVisible) = ""
[A1].AutoFilter
End Sub

J'ai pas fait de tests comparatifs mais ça devrait "pédaler"
AV
Avatar
Jean-François Aubert
Salut Alain,

Non seulement ça "pédale", mais ça "pédale dopé".
(< 1 seconde dans tous les cas de figure)

Bonjour à tous,

Je suis très mal parti avec ma Sub RienQuePrévis3()
qui utilise un filtre.En effet j'avais installé le filtre en ayant que
A3 de sélectionné, une grave erreur qui m'a aiguillé sur une façon
de faire longue, sinueuse et maladroite.

Mes 3 procs sont donc à classer dans les exemples à ne pas faire.


--
Amicalement

Jean-François Aubert
{Vaudois de la Côte Lémanique}



"AV" a écrit dans le message de
news:bo1t7l$q5u$
En adaptant la plage :

Sub zzzzz()
Application.ScreenUpdating = False
Range("A1", [A65536].End(3)).AutoFilter Field:=1, Criteria1:="<>*Prévis.*"
Range("A2", [A65536].End(3)).SpecialCells(xlCellTypeVisible) = ""
[A1].AutoFilter
End Sub

J'ai pas fait de tests comparatifs mais ça devrait "pédaler"
AV




Avatar
Domi
Effectivement, ça pédale...mais ça pédale vite ! chez moi pour 18000 lignes
c'est presque instantané..
Merci
Domi

"AV" a écrit dans le message de news:
bo1t7l$q5u$
En adaptant la plage :

Sub zzzzz()
Application.ScreenUpdating = False
Range("A1", [A65536].End(3)).AutoFilter Field:=1, Criteria1:="<>*Prévis.*"
Range("A2", [A65536].End(3)).SpecialCells(xlCellTypeVisible) = ""
[A1].AutoFilter
End Sub

J'ai pas fait de tests comparatifs mais ça devrait "pédaler"
AV