Forums XLPages

Tous les messages (Megaolive)

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

Inscription: 12/07/2007

Messages: 19

Posté le : 29-11-2007 20h02
Je vais noter ici mon presque algo en cours de traitement :p
J'espère aider les gurus à me guider :p


"Scanner" la zone Declencheur
Pour chaque cellule de la zone declencheur
Si la police de la cellule de la zone declencheur scannée est en gras, la ligne correspond à une Conso

Alors a chaque conso trouvée
Inserer une ligne Vide au dessus

"Scanner" la zone Declencheur
Pour chaque cellule de la zone declencheur
Si la police de la cellule de la zone declencheur scannée est en gras, la ligne correspond à une Conso
Alors a chaque conso trouvée
couper la ligne Conso trouvée

Et la coller sur la ligne vide suivante?
(Cette approche me semble plus realiste)+> mais comment avoir cette condition en vba ?
c'est à dire comment definir la valeur de la ligne vide ?
ca ma tout l air d etre deux fonctions differentes ?

je suis bon pour ecrire deux petites procedures

1/ le decoupage
"decouper" sur la meme base que le formattage
un IF de plus dans mon FOR existant
qui fini par inser.entirerow

2/ le deplacement des consos 1 par 1 suite au decoupage
la je commence a sécher
j'ai comme le sentiment que je vais avoir besoin d un compteur et d une boucle ?
voire de deux compteurs et de deux boucles ? :p
je m y perds un peu y il faut ke je commence a syntaxer le début de ce process

Ajouter une ligne sous chaque conso pour commencer



i will be back :p
Edité par Megaolive le 29/11/2007 20:56:29
Hors Ligne
Rapport   Haut 

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

Inscription: 12/07/2007

Messages: 19

Posté le : 29-11-2007 18h04
Bon j'avance a tatton sur mon sujet :

j'ai trouvé la coquille du code précédent,
j'avais remplacé ".Font" par ".format" dans le code précédent tellement j'étais obsédé par le test sur le format :)

CI dessous mon dernier code qui fonctionne pour la mise à jour des trois types de format :(Titre,Conso, Item...

Comme toujours les critiques les plus acerbes sont les bienvenues !


Je m'attaque maintenant à la restructuration des lignes.

Je vois une procédure un peu comme ça :
Si Ligne = Conso (déduit par détection du format)
alors couper les N lignes suivantes jusqu'a la prochaine conso non comprise.
et les coller au dessus de la conso détecté précédement.

encore une fois toutes les pistes sont les bienvenue....:]

'Option Explicit
'
pour forcer la declaration de variable
Option Explicit

'Declaration des varibable en public
'
pour les utiliser dans toutes les sousfonctions

'Variable Worksheet Report
Public Reportsheet As Worksheet

'
Variable Worksheet Format
Public FormatSheet As Worksheet

'Variable Colonne contenant la condition
Public Declencheur As Range

'
Variable qui prendra les valeurs de cellules
'contenant la condition
Public cell As Range

'
Variable Cellule du format dans la feuille format
Public Leformat As Range

Sub Format
()
'définition des trois types de formattage
'
titre
'conso
'
item

'definition valeur de ReportSheet
Set Reportsheet = Worksheets("REPORT")

'
definition valeur de Declencheur
Set Declencheur 
Reportsheet.Range("A1:A50")


    
'Boucle de formattage
    
    For Each cell In Declencheur
    
            '
Format ligne titre
            
If cell.Value "" Then
            
                copytitleformat
                
                cell
.EntireRow.Select
                Range
(SelectionSelection.End(xlToLeft)).Select
                Selection
.PasteSpecial Paste:=xlFormatsOperation:=xlNoneSkipBlanks:= _
                False
Transpose:=False
            End 
If
            
            
'Format ligne conso
            If cell.Value <> "" Then
            
            cell.Select
            If Selection.Font.Bold = True Then
                        
                copyconsoformat
                
                cell.Select
                Range(Selection, Selection.End(xlToRight)).Select
                Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _
                False, Transpose:=False
            End If
            End If
            '
Format ligne Item
           
If cell.Font.Bold False Then
               
               copyItemformat
                
                cell
.Select
                Range
(SelectionSelection.End(xlToRight)).Select
                Selection
.PasteSpecial Paste:=xlFormatsOperation:=xlNoneSkipBlanks:= _
                False
Transpose:=False
            
           End 
If
        
Next
End Sub

Sub copytitleformat
()
                
'definition valeur de FormatSheet
                Set FormatSheet = Worksheets("FORMAT")
                '
definition valeur de Title
                Set Leformat 
FormatSheet.Range("B5")
                
Leformat.Copy
End Sub

Sub copyconsoformat
()
                
'definition valeur de FormatSheet
                Set FormatSheet = Worksheets("FORMAT")
                '
definition valeur de Conso
                Set Leformat 
FormatSheet.Range("B6")
                
Leformat.Copy
End Sub

Sub copyItemformat
()
                
'definition valeur de FormatSheet
                Set FormatSheet = Worksheets("FORMAT")
                '
definition valeur de Item
                Set Leformat 
FormatSheet.Range("B7")
                
Leformat.Copy
End Sub
Pièce jointe:
zip samplefileC.zip   [ Taille: 14.16 Ko - Téléchargements: 688 ]
Hors Ligne
Rapport   Haut 

Formattage VBA sur report Excel
#13
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 29-11-2007 16h13
Bonjour,

Je commence à travailler sur une nouvelle macro de formattage d\'un report extrait d\'une base de donnée...

Vous trouverez en fichier joint l\'exemple sur lequel je cherche à faire fonctionner ma macro.

Il est composé de 2 feuilles :
- 1 feuille \"Report\"
- 2 feuille \"Format\"

A mon avis (d\'après mon analyse de neewbie),
Le déroulement de la macro est à splitter au moins en deux étapes:
1 - Appliquer un formattage des cellules en fonction de conditions
2 - Appliquer une restructuration des lignes en fonctions de conditions

1/Pour le formattage des cellules,
Je pense m\'appuyer sur un paramétrage qui serai laissé à disposition du User sur la feuille format.

La macro doit venir prendre les \"format\" dans la feuille format et les appliquer dans la feuille \"report\" sur les cellules définies.

J\'ai 3 types de lignes à formatter :
- Les entêtes de colonne => Format 1
- Les consolidations => Format 2
- Les lignes de détail => Format 3


2/ Plus difficile, l\'étape 2, consiste à inverser les positions des Consolidations et des lignes de détails.

Etat d\'origine :
1 / Conso
2 / Detailconso1
3 / Detail Conso 2


Etat d\'arivée :
2 / Detailconso1
3 / Detail Conso 2
1 / Conso


Voila pour ce qui est du besoin global. :]

Maintenant voici le code que je commence à générer ...
Comme je suis un noob du VBA (cf post précédent :p),
Je voudrai juste me faire un petit peu orienter pour m\'approprier les fonctionnement propre au VBA et petit à petit devenir moi aussi un guru Excel :p

donc voici ou j\'en suis,
et j\'ai un problème a l\'execution :(
Run time error 438
Object doesn\'t support this method or property

à ce que je comprends, je ne peux pas tester sur le format de la cellule ?
ou pas comme ça ?

Je suis à votre écoute messieurs les gurus excel :p


'Option Explicit
'
pour forcer la declaration de variable
Option Explicit

'Declaration des varibable en public
'
pour les utiliser dans toutes les sousfonctions

'Variable Worksheet Report
Public Reportsheet As Worksheet

'
Variable Worksheet Format
Public FormatSheet As Worksheet

'Variable Colonne contenant la condition
Public Declencheur As Range

'
Variable qui prendra les valeurs de cellules
'contenant la condition
Public cell As Range

'
Variable Cellule du format des titres dans la feuille format
Public Leformat As Range

Sub Format
()
'1 formattage de la ligne de titre
'
2 formattage des lignes de conso
'3 formattage des lignes de conso

'
definition valeur de ReportSheet
Set Reportsheet 
Worksheets("REPORT")

'definition valeur de Declencheur
Set Declencheur = Reportsheet.Range("A1:A500")


    '
Boucle de formattage
    
    
For Each cell In Declencheur
    
            
'Format ligne titre
            If cell.Value = "" Then
            
                copytitleformat
                
                cell.Rows.Select
                Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _
                False, Transpose:=False

            '
Format ligne conso [b]ICI LE PLANTAGE[/b]
            
' j'essaye de tester si format de cellule gras alors appliquer le format  conso
            
ElseIf cell.Format.Bold True Then
               
                copyconsoformat
                
                cell
.Rows.Select
                Selection
.PasteSpecial Paste:=xlFormatsOperation:=xlNoneSkipBlanks:= _
                False
Transpose:=False

            
'Format ligne Item
            ElseIf cell.Format.Bold = False Then
               
                copyItemformat
                
                cell.Rows.Select
                Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _
                False, Transpose:=False


            End If
    Next
        
End Sub

Sub copytitleformat()
                '
definition valeur de FormatSheet
                Set FormatSheet 
Worksheets("FORMAT")
                
'definition valeur de Title
                Set Leformat = FormatSheet.Range("B5")
                Leformat.Copy
End Sub

Sub copyconsoformat()
                '
definition valeur de FormatSheet
                Set FormatSheet 
Worksheets("FORMAT")
                
'definition valeur de Conso
                Set Leformat = FormatSheet.Range("B6")
                Leformat.Copy
End Sub

Sub copyItemformat()
                '
definition valeur de FormatSheet
                Set FormatSheet 
Worksheets("FORMAT")
                
'definition valeur de Item
                Set Leformat = FormatSheet.Range("B7")
                Leformat.Copy
End Sub
Pièce jointe:
zip samplefile.zip   [ Taille: 11.75 Ko - Téléchargements: 667 ]
Hors Ligne
Rapport   Haut 

Re: Traitement de données automatisé
#14
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 29-11-2007 11h51
Quelques mois après la bataille ,)

Résolu flagué ;)
Hors Ligne
Rapport   Haut 

Re: Traitement de données automatisé
#15
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 17-07-2007 15h41
Rebonjour à vous,

Désolé de te décevoir, mais je suis de Toulouse et non pas du pays des tabernacles, nom d'un cassoulet !! :p

j'ai bien relu la proposition précédente et j'étais arrivé de par ailleur à un code un peu modifié qui prend en compte certaines des remarques formulées :

J'avais eu de par ailleurs le conseil sur l'"option explicit".
Cependant la proposition m'apporte des éléments complémentaires telles que l'utilisation des "bytes" comme type de constante.

J'ai également décomposé mon module en fonctions qui sont appelés dans la Sub Main()

Voila mon code final.
Je reste bien sur preneur de toute remarques que vous auriez sur le code suivant :


Option Explicit


'Declaration des variables publiques utilisées dans plusieurs sousfonctions
Public f_dest As Worksheet
Public CommentClean As Range
Public CommentArea As Range

Deroulement général et appel des sous fonctions
Sub Main
()

Clean

Generate

SortComments

FilterComments

End Sub

' Nettoyage et suppression des filtres de la zone de synthèse
Sub Clean()
    Set f_dest = Worksheets("FTE=> Delta Target & Overrun")
    Set CommentClean = f_dest.Range("C37:E91")


        f_dest.ShowAllData
        CommentClean.ClearContents
End Sub
Tri sur le mois de la zone de synthèse
Sub SortComments
()
    
Set f_dest Worksheets("FTE=> Delta Target & Overrun")
    
Set CommentArea f_dest.Range("C36:E91")
           
        
CommentArea.Sort Key1:=Range("D37"), Order1:=xlAscendingHeader:=xlGuess_
        OrderCustom
:=5MatchCase:=TrueOrientation:=xlTopToBottom
        
            Application
.Run "TM1RECALC"
            
On Error GoTo Error
            
Exit Sub
Error
:
            
MsgBox ("Please connect To Fera Server")

            
Resume Next

 End Sub
' Filtre sur les mois compris entre sélection start et end Month
Sub FilterComments()
    Set f_dest = Worksheets("FTE=> Delta Target & Overrun")
    Set CommentArea = f_dest.Range("C36:E91")
        
        CommentArea.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Sheets("Comments Mngt").Range("G5:G17"), Unique:=False
 End Sub
 
'
Definition de la plage Source
'Definition de la plage Cible
'
Generation de la liste de commentaires synthétiquesur trois colonnes AnnéemoisSite+Centre+Comment
Sub Generate
()

    
'Init des variables Feuille & Range source et destination
    Dim f_comm As Worksheet
    Dim cell As Range
    Dim r_dest As Integer

    '
Initialisation de la Variable Ligne d'arrivée
    r_dest = 37

    '
Initialisation des cellules sources
    
Const r_peri 12
    
Const r_pays 13
    
Const c_dept 3
    
Const r_Year 5
    
Const c_Year 4

    
'Affectation de valeurs aux variables "définition des feuilles"
    Set f_comm = Worksheets("DELTA Comments")
    Set f_dest = Worksheets("FTE=> Delta Target & Overrun")

        Application.Run "TM1RECALC"

          '
Test sur cellule de la zone source
        
For Each cell In f_comm.Range("D14:BW30")
             If 
cell.Text <> "" Then

                
' Definition de la valeur à reporter sur la feuille destination en fonction des références de la zone source
                 f_dest.Cells(r_dest, 3).Value = f_comm.Cells(r_Year, c_Year).Text
                                        
                 f_dest.Cells(r_dest, 4).Value = f_comm.Cells(r_peri, cell.Column).Text

                 f_dest.Cells(r_dest, 5).Value = f_comm.Cells(r_pays, cell.Column).Text & " - " & _
                                f_comm.Cells(cell.Row, c_dept).Text & " - " & _
                                        cell.Text
                                        
            '
Ligne de destination 1 pour décaler vers le bas au fur et à mesure des recopie Ca c'est génial :p)
             r_dest = r_dest + 1
 
            '
Fin de SI
             End 
If
 
        
'Redemarrage en haut de boucle
        Next
   
  
End Sub
Hors Ligne
Rapport   Haut 

Re: Traitement de données automatisé
#16
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 13-07-2007 12h36
Ci dessous le code finalement édité, un peu différent de l'approche proposé mais qui fonctionne tout aussi bien.

Si vous remarquez des choses qui peuvent ou doivent être faites autrement,
N'hésitez pas à critiquer ce code.

Merci encore pour votre aide !


[Code]
Sub TestComment()

'Init des variables Feuille & Range source et destination
Dim f_comm As Worksheet
Dim r_peri As Integer
Dim r_pays As Integer
Dim c_dept As Integer

Dim f_dest As Worksheet
Dim r_dest As Integer


'Affectation de valeurs aux variables "définition des feuilles"
Set f_comm = Worksheets("Commentsource" )
Set f_dest = Worksheets("sheet1" )

'Initialisation des variables Colonne Periode, Pays, et ligne Departement
'( Celle la m'a bien fait batailler alors que c'est une évidence)
r_peri = 14
r_pays = 13
c_dept = 28


'Initialisation de la variable Ligne d'arrivée
r_dest = 1


'Test sur cellule de la zone source
For Each cell In f_comm.Range("AB15:AG31" )
If cell.Value <> "" Then



' Definition de la valeur à reporter sur la feuille destination en fonction des références de la zone source
f_dest.Cells(r_dest, 1).Value = Cells(r_peri, cell.Column).Text & " - " & _
Cells(r_pays, cell.Column).Text & " - " & _
Cells(cell.Row, c_dept).Text & " - " & _
cell.Text

' Ligne de destination + 1 pour décaler vers le bas au fur et à mesure des recopie ( Ca c'est génial :p)
r_dest = r_dest + 1

'Fin de SI
End If

'Redemarrage en haut de boucle
Next

End Sub
[/Code]
Hors Ligne
Rapport   Haut 

Re: Traitement de données automatisé
#17
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 13-07-2007 10h09
Bonjour à tous,


Je pense qu'effectivement vous avez tout à fait compris mon besoin...

Cependant je dois encore analyser correctement vos réponse pour bien comprendre
la syntaxe obtenue.

Je posterai ici, le code finalement édité.

Merci pour votre aide et réactivité !!!

MegaOlive
Hors Ligne
Rapport   Haut 

Re: Traitement de données automatisé
#18
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 12-07-2007 17h29
Merci pour le lien !!!

Je rôde par la voir... :p
Hors Ligne
Rapport   Haut 

Traitement de données automatisé
#19
Débutant XLPages

Inscription: 12/07/2007

Messages: 19

Posté le : 12-07-2007 16h34
Bonjour à tous,

Je connais bien Excel mais hélas, j'ai beaucoup de mal à me plonger dans la logique propre au code VBA pour écrire des macros "propres".

Souhaitant combler mes lacunes petit à petit,
je souhaite réaliser un traitement simple mais qui (il me semble) permet d'approcher quelques concepts propres à la rédaction de macro.
( constantes, variables, fonctions...)



Je dispose d'un classeur qui a 2 feuilles :
WS1 = Data
WS2= Synthesis

Sur WS1, voici une représentation de la table affichée "gestion de commentaires":

Année(s'applique à toute la table)

.................Mois1.................Mois1 ......................MoisN...
.................Pays1.................Pays2
Service1...."Commentaire"....."Commentaire"

Service2...."Commentaire"....."Commentaire"

Service N ...

La table a un périmètre défini et figé.
( Une utopie mais simplifions, simplifions pour bien comprendre ,))


Sur WS2, j'ai une page blanche.

Mon Objectif est de "scanner" les différent commentaires saisis dans la table source dans WS1 et de recopier chacun de ses commentaires dans une cellule de la WS2.
Une subtilité est que je souhaite "sauter" les cellulles qui ne contiennent pas de commentaires.

L'ambition de ma macro est de générer une liste synthétique des commentaires en appliquant un formattage particulier.

Voici ce que j'ai réussi à produire pour l'instant :

Option Explicit

Sub Comment
()

'declaration de variable "c" est une cellule
Dim c As Range

'
declaration de fonctionpour chaque Cellule du range AB15:AG31 
For Each c In Sheets("WS1").Range("AB15:AG31")

'Condition 1 Si valeur de "c" différent de vide alors
If UCase(c.Value) <> "" Then

'
Copier "c" dans le range A1:F16
c
.Copy Destination:=Sheets("WS2").Range("A1:F16")


'Fin de Si
End If

Valeur de "C" suivante
Next

' Fin de fonction
End Sub



Ce qui fonctionne : La tableau est bien scanné du début à la fin

Ce qui ne fonctionne pas : Seule la dernière cellule commentaire renseignée est recopiée sur ma feuille destination dans toute la zone destination définie...


Je ne cherche pas du code pré maché mais bel et bien à comprendre la logique de fond de création d'une macro "propre"
N'hésitez pas à corriger mes commentaires si ma lecture de mon code n'est pas la bonne.
Tout exemple proche serait très apprécié.

Merci d'avance pour vos conseils.
Hors Ligne
Rapport   Haut 

« 1 2