Re: Formattage VBA sur report Excel
#11
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 30-11-2007 18h24
Youpi !
J'ai enfin trouvé un bout de code qui fonctionne pour mon test et insertion de ligne.

Il me reste maintenant à faire fonctionner ensemble le formattage et les insertions de ligne qui fonctionnent pour l'instant mais l'un après l'autre.

A suivre ;)


Sub Insertion()

Application.ScreenUpdating False
On Error Resume Next

'Ici debut du FOR et une reference a la zone de critere
For AdrCel = 8 To 65536 Step 1

'
Ici Le test sur le format de cellule
If Cells(AdrCel1).Font.Bold <> Cells(AdrCel1).Offset(-10).Font.Bold Then

'Ici définition du num de ligne pour l'insertion
AdrLig 
Cells(AdrCel1).Rows.Row

'l'insertion de la ligne vide
Rows
(AdrLig).Insert Shift:=xlDown

'Incrémentation de la reference ligne de cellule active de 1
AdrCel = AdrCel + 1
End If

'
Arret du traitement sur détection de cellule vide
If Cells(AdrCel1).Offset(10).Value "" Then

'Sortie de boucle
Exit For


End If

'
Passage de la boucle sur la ligne suivante
Next AdrCel

Application
.ScreenUpdating True

End Sub
Hors Ligne
Rapport   Haut 

Re: Formattage VBA sur report Excel
#12
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 30-11-2007 18h36
Bonjour Megaolive, le Forum,

Je ne t'oublie pas, je regarde ce soir ce que je peux te proposer...

Cordialement,

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Formattage VBA sur report Excel
#13
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 30-11-2007 21h11
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,
Pièce jointe:
zip mDF_samplefile.zip   [ Taille: 11.79 Ko - Téléchargements: 585 ]

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Formattage VBA sur report Excel
#14
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 30-11-2007 23h13
J'en ai révé Mdf l'a fais :p
On peut tester en remontant :p

Tout d'abord merci pour les critiques !!!
je pensais avoir fais preuve d'une bonne initiative pour les variables publique en début de code :p
mais je comprend tout a fais ta correction !!!!

Mon problème quand à la "selectomania" c'est que j'ai approché Excel par l'interface utilisateur avant tout...
Heureusement tes commentaires m'ouvrent beaucoup de nouvelles portes...Et dans ta solution je vois déja des mines d'astuces !!!
Merci pour ton aide éclairée !

Je viens de lire et relire le code que tu as édité...
J'ai un soucis de compréhension (avant de me relancer sur l'éditeur)

Dans la dernière sub

C est sur Lfin que je butte :p
A la lecture, j'ai l'impression qu'il va copier les lignes de conso en bas de tableau les une a la suite des autres :p
Edité par Megaolive le 30/11/2007 23:54:44
Hors Ligne
Rapport   Haut 

Re: Formattage VBA sur report Excel
#15
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 01-12-2007 01h18
Re,

Avant d'éditer ton post (d'ailleurs, si tu pouvais éviter de trop le faire ça serait bien lol, car ce n'est pas toujours évident à suivre...), tu demandais un remède à la "selectomania"... en voici un :

Image redimensionnée




Citation :

Megaolive a écrit:

Je viens de lire et relire le code que tu as édité...
J'ai un soucis de compréhension (avant de me relancer sur l'éditeur)

Dans la dernière sub

C est sur Lfin que je butte :p
A la lecture, j'ai l'impression qu'il va copier les lignes de conso en bas de tableau les une a la suite des autres :p

Humm, pas facile d'expliquer la démarche adoptée...

La variable Lfin marque la fin d'un bloc Conso.
Comme je vais en remontant, au départ Lfin est équivalent à la fin du tableau.
Dans la boucle, toujours en remontant, lorsque je rencontre un élément Conso (en gras), je coupe la ligne correspondante et la copie sur la ligne repérée Lfin . Immédiatement après, je redéfinie Lfin qui marquera ainsi la fin du bloc suivant, et ainsi de suite...
Le couper-coller est assuré par une procédure indépendante (DEPLACEconso) par souci de clarté. Je lui passe en argument la ligne en cours (celle que je vais couper) et la ligne "cible" (celle qui va recevoir le coller). Cette ligne "cible" est justement définie par Lfin.

J'espère que ces explications pourront t'aider à comprendre ce code...

Cordialement,

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Formattage VBA sur report Excel
#16
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 01-12-2007 10h27
Cher Guru, :]

'on déplace la ligne à la fin de rubrique conso
                        DEPLACEconso L, Lfin
                        Lfin = L



ça y est, j'ai relu de bon matin :p
LFin = L après avoir déplacer la conso permet de décaler la prochaine cible ....

Je vais travailler un peu mon code voir à quoi j'arrive.
Merci encore !
Hors Ligne
Rapport   Haut 

Re: Formattage VBA sur report Excel
#17
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 01-12-2007 14h45
Bonjour Megaolive, le Forum,

Merci de préfixer ce fil en [résolu] lorsque tu estimeras que c'est le cas.

Cordialement,

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Formattage VBA sur report Excel
#18
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 01-12-2007 19h05
Je le flague tout de suite

par contre de mon coté,
je dois continuer de travailler un peu mon code avant de le soumettre :p

Olivier
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes