Microsoft 365 Effacer sous condition

Claudy

XLDnaute Accro
Bonjour à tous,
Comment faire un Range("A1:F60").ClearContents, mais ne pas effacer si une cellule contient le mot "OUT" ?

Merci d'avance,
Claudy
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
ou mieux :
VB:
Sub ClearContentsSpecialClaudy(Plage, Chaine)
    Set MaPlage = Range(Plage)
     With MaPlage
        For Each c In MaPlage
            If c.Value <> Chaine Then c.Value = ""
        Next c
    End With
End Sub

Sub EssaiPourTest()
    ClearContentsSpecialClaudy "A1:F60", "OUT"
End Sub
De cette façon la macro est universelle, et vous pourrez la réutiliser sans modification.
Pour l'executer il faut lancer EssaiPourTest avec deux paramètres : la plage et la chaine à exclure.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Le temps n'était pas dans les specs de départ :)
Il faut figer l'écran pendant l'effacement. ca accélère beaucoup l'éxécution.
Code:
Sub ClearContentsSpecialClaudy(Plage, Chaine)
    Application.ScreenUpdating = False
    Set MaPlage = Range(Plage)
     With MaPlage
        For Each c In MaPlage
            If c.Value <> Chaine Then c.Value = ""
        Next c
    End With
    Application.ScreenUpdating = True
End Sub

Sub EssaiPourTest()
    ClearContentsSpecialClaudy "A1:F60", "OUT"
End Sub
 

Claudy

XLDnaute Accro
Sur mon PC je passe de 0.531s à 0.109s avec la dernière version.
Avez vous beaucoup de calculs dans votre fichier ?
Si oui, rajouter au début : Application.Calculation=xlManual
et à la fin : Application.Calculation=xlautomatic.
( çapasse le mode de recalcul en manuel )
Re bonjour et merci
Dans ce classeur test je n'ai rien comme calculs.
Mais ouvert un autre classeur avec des centaines de formules (normales ou matricielles)
Et aucun lien avec fichier test.
Est ce que ça peut influencer?
A+
Claudy
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Surement s'ils sont dans la même session.
Dans ce cas ajouter les deux lignes Application.Calculation=xlManual , ça devrait résoudre le problème.
Voici la dernière version, j'ai intégré :
VB:
Sub ClearContentsSpecialClaudy(Plage, Chaine)
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Set MaPlage = Range(Plage)
     With MaPlage
        For Each c In MaPlage
            If c.Value <> Chaine Then c.Value = ""
        Next c
    End With
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
Sub EssaiPourTest()
t0 = Timer
    ClearContentsSpecialClaudy "A1:F60", "OUT"
MsgBox Timer - t0
End Sub
Dans le test j'ai introduit la mesure du temps d'éxecution.
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Claudy, sylvanu

Une autre façon (pour le cas ou la cellule contient strictement OUT)
VB:
Sub Effacer()
t0 = Timer
Range("A1:F60").Replace What:="OUT", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
MsgBox Timer - t0
End Sub
 

laurent950

XLDnaute Accro
Bonsoir sylvanus,

Toutes les cellules de la plages sont à effacer sauf pour celle qui contiennent "OUT"
En passant par une variable tableau le résultat est instantané.
l'objet range est bien plus lourd est donc moins rapide.
VB:
Sub Effacer()
Dim TabR() As Variant
TabR = Range("A1:F60")
t0 = Timer
For i = LBound(TabR, 1) To UBound(TabR, 1)
    For j = LBound(TabR, 2) To UBound(TabR, 2)
        If TabR(i, j) <> "OUT" Then
            TabR(i, j) = ""
        End If
    Next j
Next i
Range("A1").Resize(UBound(TabR, 1), UBound(TabR, 2)) = TabR
MsgBox Timer - t0
End Sub
 
Dernière édition:

Discussions similaires

Réponses
16
Affichages
648
Réponses
3
Affichages
255

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16