Aide pour simplifier le code et surtout l'accélérer

cs_n0c1f Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 16 février 2011 - 7 avril 2010 à 08:40
cs_n0c1f Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 16 février 2011 - 7 avril 2010 à 20:54
Bonjour,
Je suis débutant, et ne m'y connais pas en VBA, mais je me débrouille avec ce que je trouve sur la toile.
Je ne sais pas si j'ai posté au bon endroit, mais en fait voila ma requête:
Si possible est ce que quelqu'un pourrait m'aider à améliorer la rapidité de mon code, et si possible arriver à y intégrer deux formules que je fais passer pour le moment via la MFC.
Tout d'abord le code:
Sub Macro3()

'Déprotège la feuille
ActiveSheet.Unprotect Password:="test"

'trier par classement
 Range("B3:BF152").Select
    Selection.Sort Key1:=Range("E3"), Order1:=xlDescending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal


' mise en page
    Range("A3:F3,H3:J3,L3:O3,Q3:BF3").Select
    Selection.Style = "40 % - Accent1"
    Range("A4:F4,H4:J4,L4:O4,Q4:BF4").Select
    Selection.Style = "20 % - Accent1"
    Range("A3:BF4").Select
    Selection.Copy
    Range("A5:BF302").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    
    
'colonne en Gras
    Range("Q3:Q302,X3:X302,AE3:AE302,AL3:AL302,AS3:AS302,AZ3:AZ302").Select
    Selection.Font.Bold = True
    
    Range("L3:L302,N3:N302").Select
        With Selection.Font
        .Color = -11489280
        .TintAndShade = 0
        End With
        
    Range("M3:M302,O3:O302").Select
        With Selection.Font
        .ThemeColor = xlThemeColorLight2
        .TintAndShade = -0.249977111117893
        End With
        
    Range("I3:I302").Select
    With Selection.Font
        .Color = -16776961
        .TintAndShade = 0
    End With
    
'Reprotège la feuille
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFormattingCells:=True, Password:="test"

    Range("A3").Select
    
End Sub


les MFC:
formule: =$B3=""
sélection:=$A$3:$F$302;$H$3:$J$302;$L$3:$O$302;$Q$3:$BF$302
mise en forme: aucun fond, aucune bordure, police blanche

formule: =$K3="X"
sélection:=$A$3:$F$302;$H$3:$J$302;$L$3:$O$302;$Q$3:$BF$302
mise en forme: fond rouge clair (rosé), police rouge et en gras


Enfin si quelqu'un pouvait m'aider je lui serais énormément reconnaissant :D

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 avril 2010 à 10:33
Salut
Dans la première partie, puisqu'il n'y a pas de bouclage, difficile de faire plus efficace.
Comme il y a du tri dans ces lignes, cela implique que les cellules vont être recalculées.
La mise en forme/en page ne provoque pas ce genre de ralentissement.
La seule chose qui 'pourrait' accélérer le tout, c'est de demander à Excel de bloquer les recalculs pendant le temps que ta macro s'exécute :
Code récupéré en faisant la manip à la main :
    ' Blocage des recalculs
    With Application
        .Calculation = xlManual
        .MaxChange = 0.001
    End With
    ActiveWorkbook.PrecisionAsDisplayed = False
    
    ' Demande de recalcul (1 fois)
    Calculate
    
    ' Remise en calcul auto
    With Application
        .Calculation = xlAutomatic
        .MaxChange = 0.001
    End With
Tout dépend aussi de quand et combien de fois tu déclenches ta Macro3.

Pour le reste, je ne comprends pas trop :
Qu'appelles-tu MFC ? Microsoft Foundation Class ? quel rapport avec le VBA ?
Tu donnes, semble t-il, les définitions de ce que tu as à faire : Pourquoi n'enregistres-tu pas une macro pendant que tu le fais à la main pour savoir quel code intégrer ?
Je ne comprends pas trop ton problème.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_n0c1f Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 16 février 2011
7 avril 2010 à 16:52
Tout d'abord, merci jack pour ta réponse aussi rapide.
Ensuite pour te réponde j'appelle MFC : Mise en Forme Conditionnelle.
J'ai tenté de les enregistrer en macro, via l'utilitaire d'excel, mais le code qu'il m'enregistre est :
Sub Macro1()
'
' Macro1 Macro
'

'
End Sub

Soit rien..
0
cs_n0c1f Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 16 février 2011
7 avril 2010 à 17:31
Pour accélérer la mise en page j'ai incorporé "colonne en gras" dans "mise en page" ce qui donne:
' mise en page
    Range("A3:F3,H3:J3,L3:O3,Q3:BF3").Select
    Selection.Style = "40 % - Accent1"
    Range("A4:F4,H4:J4,L4:O4,Q4:BF4").Select
    Selection.Style = "20 % - Accent1"
    
    Range("Q3:Q4,X3:X4,AE3:AE4,AL3:AL4,AS3:AS4,AZ3:AZ4").Select
    Selection.Font.Bold = True
    Range("L3:L4,N3:N4").Select
        With Selection.Font
        .Color = -11489280
        .TintAndShade = 0
        End With
    Range("M3:M4,O3:O4").Select
        With Selection.Font
        .ThemeColor = xlThemeColorLight2
        .TintAndShade = -0.249977111117893
        End With
    Range("I3:I4").Select
       With Selection.Font
        .Color = -16776961
        .TintAndShade = 0
        End With
        
    Range("A3:BF4").Select
    Selection.Copy
    Range("A5:BF302").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 avril 2010 à 18:50
MFC : fallait deviner, lol
La mise en forme conditionnelle ne concerne qu'une seule cellule : elle même.
Avec cette méthode, on ne peut pas coloriser une cellule (*) en fonction de l'état d'une autre.
(*) ou d'un groupe de cellules

Chez moi, quand j'enregistre une MFC (lol), ça me donne ça :
    Range("B1:B12").Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:= xlCellValue, Operator:=xlNotEqual, Formula1:="=""X"""
    Selection.FormatConditions(1).Interior.ColorIndex = 38

Si tu dois coloriser toute une colonne, il va falloir le faire par programme, exemple :
(exemple généré grace à l'enregistreur de macro, puis recopiée dans un simple If puis dans une Sub que tu placeras dans un Module)
Public Sub ColoriseColonneSi()
    If Range("B3").Value = "" Then
        Range("$A$3:$F$302;$H$3:$J$302;$L$3:$O$302;$Q$3:$BF$302").Select
        With Selection.Interior
            .ColorIndex = xlNone
        End With
        With Selection.Font
            .FontStyle = "Normal"
        End Select
    ElseIf Range("K3").Value = "X" Then
        Range("$A$3:$F$302;$H$3:$J$302;$L$3:$O$302;$Q$3:$BF$302").Select
        With Selection.Interior
            .ColorIndex = 38
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
        End With
        With Selection.Font
            .FontStyle = "Gras"
        End Select
    End If
End Sub
NB : Bizarre que ta MFC porte sur le même groupe de cellules alors que tu ne testes pas la même cellule (B3 et K3)

Après que tu auras mis au point les réglages (couleur, fonte, ...), il te suffira d'appeler cette Sub à chaque changement de B3 ou de K3 :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address  "B3" Or Target.Address "K3" Then
        Call ColoriseColonneSi
    End If
End Sub
PS : Cette Sub appartient à ta feuille

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_n0c1f Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 16 février 2011
7 avril 2010 à 20:54
Merci jack ;)

En fait je ne teste pas B3 mais $B3.

Exemple pour la ligne 3:
$B3 permet de tester la cellule de la colonne B,
- si le résultat est vrai (=rien dans la cellule)
la sélection("$A$3:$F$3;$H$3:$J$3;$L$3:$O$3;$Q$3:$BF$3") a pour mise en forme : aucun fond, aucune bordure, police blanche
- si le résultat est faux
la sélection("$A$3:$F$3;$H$3:$J$3;$L$3:$O$3;$Q$3:$BF$3") garde sa mise en forme

Cela évite de rentrer 300 fois la mise en forme ;)

Idem pour K3 sur la ligne 3.

Pour info, K3 ne peut pas être rempli si B3 est nul ;)
0
Rejoignez-nous