Rapport de message :*
 

Re: Formattage VBA sur report Excel

Titre du sujet : Re: Formattage VBA sur report Excel
par myDearFriend! le 30/11/2007 21:11:03

Re Megaolive,

Comme promis, me revoici

J'ai brièvement analysé ton code et ta façon de procéder. Je vais te faire quelques remarques que je souhaite [I]constructives[/I], et qu'il convient de prendre NON PAS [I]à la lettre[/I] (je n'ai évidemment pas le monopole du savoir et de la vérité), mais tout simplement comme conseils ou suggestions. A toi d'en retenir ce que tu penses être intéressant...

[LIST][*]Tout d'abord, un bon point : l'utilisation d'[I]Option Explicit [/I](pour forcer la déclaration des variables) est une excellente chose.
[*]Par contre, la déclaration systématique de tes variables en tête de module n'est pas conseillée. Il convient de le faire plutôt en tête de chaque procédure (Sub / End sub). Pourquoi ?
Les déclarations en tête de module sont réservées aux variables dont la valeur doit être conservée et être réutilisée par plusieurs procédures (en ajoutant le mot clé [I]Public [/I]comme tu l'as fait, tu permets même de les réutiliser dans d'autres modules). On s'aperçoit que ce n'était pas ton intention de faire, car par exemple, tu déclares une fois [I]FormatSheet[/I] en tête de module, mais tu lui réaffectes sa valeur dans chaque procédure [I]Sub copy???format()[/I] par la ligne [I]Set FormatSheet = Worksheets("FORMAT")[/I]. D'une manière générale, puisque leur valeur est conservée par Excel, les variables déclarées en tête de module sont plus consommatrices de ressources que celles internes aux procédures, c'est pourquoi il convient de les utiliser avec parcimonie... Les variables déclarées à l'intérieur des procédures libèrent la mémoire qui leur est allouée dès que l'instruction [I]End Sub[/I] est rencontrée.
[*]Ensuite, j'ai vu que tu utilisais souvent la sélection des cellules (par l'instruction [I]Select[/I]) avant leur traitement. Sache qu'en VBA, c'est le plus souvent inutile. C'est même source d'erreur parfois, pas franchement agréable pour l'oeil de l'utilisateur et c'est aussi un facteur de lenteur pour application car ça ralentie considérablement les traitements. Certaines instructions vont créer d'office des sélections, c'est le cas par exemple de la méthode [I]Paste[/I], mais ça tu n'y peux rien. Par contre, si tu peux l'éviter, alors il faut le faire.
[*]Et pour finir, un autre bon point : la présentation de ton code est assez claire et bien structurée. Et les commentaires sont bien pratiques [/LIST]

Voilà c'est, j'espère, l'analyse que tu attendais...

Pour finir, voici le code issu de ma propre conception des choses. J'ai notamment pris le parti de parcourrir le tableau "à l'envers". Cette façon de faire me semble plus adaptée et en particulier pour permettre l'insertion de lignes dans le tableau sans être gêné dans les boucles... Si tu dois un jour procéder à des suppressions de lignes en boucle, je te conseille de retenir également ce même principe.

Voici le code que j'ai utilisé dans ton exemple ci-joint modifié :

Option Explicit
'myDearFriend!

Sub Traitement()
Dim FormTitre As Range, FormConso As Range, FormDetail As Range
Dim L As Long, Lmax As Long, Lfin As Long
    
    '
Mémorise les formats prédéterminés à disposition
    With Sheets
("Format")
        
Set FormTitre = .Range("B5")
        
Set FormConso = .Range("B6")
        
Set FormDetail = .Range("B7")
    
End With
    
    
'TRAITEMENT
    With Sheets("Report")
    
        '
Détermine la dernière ligne du tableau
        Lmax 
= .Range("A65536").End(xlUp).Row
        Lfin 
Lmax 1
        
        
'On part de la fin et on remonte dans le tableau
        For L = Lmax To 5 Step -1
        
            '
Si la ligne n'est pas vide
            If Application.CountA(.Rows(L)) > 0 Then
                '
Si la cellule en colonne A est vide zone de Titres
                
If .Cells(L1) = "" Then
                    MAJformat L
FormTitre
                
Else
                    
'Si la cellule en colonne A est en Gras = zone Conso
                    If .Cells(L, 1).Font.Bold = True Then
                        '
on applique le format
                        MAJformat L
FormConso
                        
'on déplace la ligne à la fin de rubrique conso
                        DEPLACEconso L, Lfin
                        Lfin = L
                    '
Sinon il s'agit d'une ligne de détail conso
                    
Else
                        
MAJformat LFormDetail
                    End 
If
                
End If
            
End If
            
        
Next L
        
    End With
    
End Sub

Private Sub MAJformat(As LongForm As Range)
    
Form.Copy
    With Sheets
("Report")
        .
Range(.Cells(L1), .Cells(L6)).PasteSpecial Paste:=xlPasteFormats
    End With
End Sub

Private Sub DEPLACEconso(Lsource As LongLcible As Long)
    
With Sheets("Report")
        
'Déplace la ligne en fin de rubrique Conso
        .Rows(Lsource).Cut Destination:=.Rows(Lcible)
        '
Insère une ligne vide supplémentaire juste en dessous
        
.Rows(Lcible 1).Insert Shift:=xlDown
    End With
End Sub



Cordialement,