Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/12/2011, 15h48   #1
Invité de passage
 
Dubuis
Inscription : août 2009
Messages : 9
Détails du profil
Informations personnelles :
Nom : Dubuis

Informations forums :
Inscription : août 2009
Messages : 9
Points : 1
Points : 1
Par défaut Sélection de lignes en fonction de critères définis

Bonjour,

J’ai un tableau comportant un nombre de ligne variable, généralement de 40 à 60 lignes. Toutes ces lignes comportent des tâches à accomplir qui peuvent être classée en fonction de divers critères dans les phases d’action 1, 2 ou 3. En fonction de ces phases, je crée dans la feuille « Etape 1 » la liste des actions a effectué selon la priorité 1 et ainsi de suite pour les 3 phases d’actions. Toutefois, comme je le fait avec des formules, j’ai beaucoup de ligne vide.
Par exemple pour l’étape 1 seul les lignes 3 ; 7 ; 13 ; 14 ; 26 contiennent du texte et les autres sont vide. Afin d’obtenir un tableau présentable je masque les lignes inutiles avec la macro suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
Sub masque_ligne()
' masque_ligne Macro
 
Range("A8:A177").Select
For Each o In Selection
    If o.Value = "-" Then
    o.EntireRow.Hidden = True
    End If
Next
 
End Sub

J’imagine qu’avec une macro il y aurait une manière bien plus élégante de le faire. Déjà en créant automatiquement les feuilles d’étape avec un truc du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub CommandButton2_Click()
 
' Macro Creation_tableaux
 
' Creation des feuilles d'étape
 
' Etape 1
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Etape 4"
 
' Etape 2
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Etape 5"
 
' Etape 3
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Etape 6"

Là où j’ai un problème, c’est pour reprendre les lignes correspondants à chaque étape afin de recrée mes tableaux.

J’imaginais que cela pourrait fonctionner avec la macro suivante mais je ne trouve aucunes solutions.

Code :
1
2
3
4
5
6
7
8
9
10
‘Boucle de sélection des lignes pour l'étape 1
    Sheets("Synthese des economies 2").Select
    Range("T3:T62").Select
    For Each o In Selection
    If o.Value = "1" Then
    o.EntireRow.Copy = True
    Sheets("Etape 4").Select
    Range("A1").Select
    Selection.End(xlDown).Offset(1, 0).Select
    ActiveSheet.Paste

Pouvez-vous m’aider ?

D’avance merci pour votre aide

Stéph
Fichiers attachés
Type de fichier : xlsx Exemple.xlsx (32,3 Ko, 4 affichages)
Potemkine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 16h13   #2
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut SUPPRESSION

Bonjour potemkine,

Bienvenu au Forum!

Tu peux tout simplement remplacer les cellules informées "-" par des cellules vides, puis supprimer celles-ci globalement.

(à adapter)

Code :
1
2
3
4
5
6
Public Sub Essai()
With Sheets(1).Range("A1:A177")
    .Replace what:="-", Replacement:="", lookat:=xlWhole
    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
End Sub
ou bien si tu souhaites les masquer

Code :
1
2
3
4
5
6
Public Sub Essai()
With Sheets(1).Range("A1:A177")
    .Replace what:="-", replacement:="", lookat:=xlWhole
    .SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
End With
End Sub

Reprends ce bout de code mot par mot et reviens si nécessaire.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 17h51   #3
Invité de passage
 
Dubuis
Inscription : août 2009
Messages : 9
Détails du profil
Informations personnelles :
Nom : Dubuis

Informations forums :
Inscription : août 2009
Messages : 9
Points : 1
Points : 1
Hello !

Merci ! Merci et presque Merci

Merci pour la réponse

Merci pour la rapidité

Je n’ai pas trop de soucis pour masquer ou supprimé les lignes vides.

D’ailleurs,

Code :
1
2
3
4
5
6
7
8
9
10
11
Sub masque_ligne()
' masque_ligne Macro
 
Range("A8:A177").Select
For Each o In Selection
    If o.Value = "-" Then
    o.EntireRow.Hidden = True
    End If
Next
 
End Sub
fonctionne plutôt bien.

Bien sûr, je vais essayer ta solution et surtout tenter de la comprendre car je suis loin d’être un expert et mes macro ressemblent assez à des collages de bout de macro diverses.

Cependant, je souhaite surtout me concentrer sur la dernière partie de mon mail. Mon problème c’est que je ne parviens pas à récupérer les lignes de la feuille « Synthèse des économies 2 » en fonction des valeurs saisies en T3:T62. Si les lignes T3:T62 de la feuilles « Synthèse des économies 2 » contiennent un 1 je souhaite les copier et les coller dans la feuille « Etape1 » qui aura été crée. Si les lignes T3:T62 de la feuilles « Synthèse des économies 2 » contiennent un «2 » je souhaite les copier et les coller dans la feuille « Etape2 ». Ainsi de suite pour chaque étape…

Un exemple a été annexé au premier message.


Merci

Stéph
Potemkine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 07h46   #4
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
Salut Potemkine, MarcelG,

Potemkine le nombre d'étapes est-il toujours le même (3 dans ton fichier exemple) ou bien peut-il varier ?

Je ne peux pas me permettre de te donner le code, je suis loin de maîtriser VBA, en revanche je peux te conseiller ceci :

- Dans ta feuille "Synthese_finale", tu dois créer une liste sans doublons de ta colonne T (tu la crées temporairement dans une colonne vide, la colonne Y par exemple, tu la videras quand tu n'en auras plus besoin).
- Tu filtres ton tableau en fonction des valeurs de ta liste sans doublon.
- Tu crées une nouvelle feuille pour chaque valeur de ta liste sans doublon.
Ca peut donner quelque chose comme :
Code :
1
2
3
4
5
6
7
8
9
Dim CellEtape
Dim NvlFeuille
 
Thisworkbook.Worksheets("Synthese_finale").activate
For each CellEtape in .Range("Y2", .cekks(.rows.count, "Y").end(xlUp)
    NvlFeuille= Worksheets.Add(After:=Worksheets(Worksheets.count)) 'chaque feuille créée est placée en dernier
    NvlFeuille.Name=CellEtape
    'suite du traitement
Next CellEtape
- Là où j'ai écrit "suite du traitement", tu retournes sur la feuille "Synthese_finale", tu filtres le tableau en fonction des valeurs de ta liste sans doublon et pour chaque valeur X filtrante (ce qui affichera donc toutes les lignes concernant l'étape X), tu copies le tableau puis tu le colles dans la feuille qui porte le nom de ta valeur X.

J'espère que ce raisonnement pourra t'aider dans ton codage.
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 11h25   #5
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut Variables Tableaux

Bonjour potempkine, Kaera, Bonjour le Forum,

Avant toute chose, Potemkine, je te conseille une configuration de tes feuilles "Etape" identique à celle de ta feuille "Synthèse" (mêmes nombres de lignes et colonnes, mêmes entêtes). Cela évitera les erreurs. Au demeurant, le mode plan et les colonnes masquées peuvent être envisagées.

Pour ce genre d'action, 2 méthodes peuvent être considérées : les filtres et les variables VBA tableaux.

Pour plusieurs raisons, notamment de performance, je préfère les tableaux.

Le principe ici est d'alimenter 1 tableau par valeur d'étape puis d'en informer chaque feuille étape correspondante.

Pour plus de clarté, je n'ai considéré que l'étape 1

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Public Sub Crée_Etapes()
 
Dim I As Integer
Dim plage As Range
 
Dim Tableau1() As Variant
 
'Définition de la plage à balayer pour chaque étape
With Sheets("Synthese_finale")
        derlign = .Cells(.Rows.Count, 20).End(xlUp).Row
        Set plage = .Range("T2:T" & derlign)
End With
 
n1 = 0
 
'Balayage de la plge
For Each c In plage
    Select Case c.Value
            'Si Etape1, alors alimentation Tableau1
            Case 1
                    n1 = n1 + 1
                    ReDim Preserve Tableau1(1 To 23, 1 To n1)
                    'Toutes les cellules de la ligne alimentent le tableau
                    For I = 1 To 20
                            Tableau1(I, n1) = c.Offset(0, I - 20)
                    Next I
      End Select
Next c
 
'Dimensions du Tableau
nbcol1 = UBound(Tableau1, 1)
nblign1 = UBound(Tableau1, 2)
 
With Sheets("Etape1")
         .Range("A3", .Range("A3").Offset(nblign1 - 1, nbcol1 - 1)).Value = WorksheetFunction.Transpose(Tableau1)
End With
 
'Réinitialisation des variables
Erase Tableau1
Set plage = Nothing
 
End Sub
Reprends-bien ce code ligne par ligne, mot par mot, et reviens si nécessaire.

Bonne journée à tous.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 13h45   #6
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 696
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 696
Points : 1 448
Points : 1 448
Bonjour à tous,

Si la structure de tes feuilles est figée (seul le nombre de lignes est variable) et que le nombre d’opérations de copie est limité (60 lignes, 8 colonnes, 3 feuilles « Etape »), tu peux aussi envisager une copie directe de tes cellules.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Option Explicit
Sub CopieEtape()
Dim WsS As Worksheet 'Feuille source (Synthese_finale)
Dim WsC As Worksheet 'Feuille cible (Etape x)
Dim DerLigWsS As Long 'Dernière ligne renseignée
Dim MaPlageWsS As Range, MaPlageWsC As Range, cel As Range 'Plage concernée
Dim Lig As Byte, NumeroEtape As Byte
For NumeroEtape = 1 To 3
    Set WsS = Worksheets("Synthese_finale")
    Set WsC = Worksheets("Etape " & NumeroEtape)
    'Recherche de la dernière ligne renseignée dans la colonne A de la feuille "Synthese_finale"
    DerLigWsS = WsS.Range("A" & WsS.Rows.Count).End(xlUp).Row
    Set MaPlageWsS = WsS.Range("A3:A" & DerLigWsS)
    Set MaPlageWsC = WsC.Range("A3:H62")
    'Effacement des anciennes données de la feuille Etape
    MaPlageWsC = ""
    Lig = 3 'Première ligne pour l'ajout dans la feuille Etape
    For Each cel In MaPlageWsS
        'Si le numéro d'étape correspond à celui recherché
        If cel.Offset(0, 19) = NumeroEtape Then
            'On copie les données de la feuille source dans la feuille cible
            WsC.Cells(Lig, "A") = WsS.Cells(cel.Row, "A") 'M
            WsC.Cells(Lig, "B") = WsS.Cells(cel.Row, "B") 'Description
            WsC.Cells(Lig, "C") = WsS.Cells(cel.Row, "C") 'Eco Kwh/an
            WsC.Cells(Lig, "D") = WsS.Cells(cel.Row, "H") 'Eco CHF/an
            WsC.Cells(Lig, "E") = WsS.Cells(cel.Row, "M") 'Eco CO2
            WsC.Cells(Lig, "F") = WsS.Cells(cel.Row, "R") 'Investissement
            WsC.Cells(Lig, "G") = WsS.Cells(cel.Row, "S") 'ROI
            WsC.Cells(Lig, "H") = WsS.Cells(cel.Row, "U") 'Vecteur
            'Incrémentation ligne
            Lig = Lig + 1
        End If
    Next cel
Next NumeroEtape
End Sub
Cordialement.
Fichiers attachés
Type de fichier : xls Copie de Exemple.xls (120,0 Ko, 3 affichages)
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h00   #7
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut balayage

Bonjour gFTZ82,

Certes ton code est efficace.

Au demeurant, je trouve plus performant d'alimenter une variable tableau différente pour chaque valeur d'étape constatée que de procéder à plusieurs balayages.

Autrement dit,

Dans la méthode Tableaux, chaque valeur alimente un tableau différent.(Ici, je n'en ai indiqué qu'un pour la clarté de l'exposé)

Dans la métode Etape - Cellule, le balayage s'effectue autant de fois qu'il y a d'étapes (2 fois For Next).

C'est une question de choix.
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 15h04   #8
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 696
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 696
Points : 1 448
Points : 1 448
Bonjour MarcelG,

J’en conviens, ton code est plus académique et il présente l’intérêt de montrer l’utilisation des variables tableaux.
Par contre, je ne suis pas persuadé qu’il soit mieux adapté à ce cas précis.
La variable tableau est alimentée avec l’ensemble des valeurs de la feuille «Synthese_finale » et il reste à effectuer un tri pour obtenir le résultat attendu dans la feuille « Etape ». Cela risque d’alourdir le traitement.
Dans mon code, dans un souci d’optimisation, on pourrait effectivement éviter les 2 boucles mais je craindrais que cela nuise à la clarté du code.
Et comme tu le dis si bien, tout cela reste une question de choix .

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 15h28   #9
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Citation:
Par contre, je ne suis pas persuadé qu’il soit mieux adapté à ce cas précis.
La variable tableau est alimentée avec l’ensemble des valeurs de la feuille «Synthese_finale » et il reste à effectuer un tri pour obtenir le résultat attendu dans la feuille « Etape ». Cela risque d’alourdir le traitement.
Pas d'accord.

Comme je l'ai indiqué, le code a été simplifié par souci de clarté. Je n'ai considéré que la valeur 1. Il reste à l'adapter.
Dans le code complet, chaque occurence, prise une à une, et une seule fois, alimente un tableau par la méthode Select Case (Case 1 => Tableau1, Case 2 ==> Tableau 2, etc...).
Au final, chaque feuille Etape est alimentée par le Tableau correspondant.

Cette méthode n'alourdit en rien le traitement. Bien au contraire, il l'allège.

En conséquence, il reste tout à fait
Citation:
adapté à ce cas précis
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 15h44   #10
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 696
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 696
Points : 1 448
Points : 1 448
Re,

Je n’ai pas été assez précis.
La variable tableau est alimentée avec les valeurs de 20 colonnes de la feuille «Synthese_finale ».
Le résultat attendu dans la feuille « Etape » tient sur 9 colonnes.
Il y a bien un moment où il va falloir tailler dans la masse (ce qui va constituer un allègement, j’en conviens ).

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 15h57   #11
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut tableaux

J'ai conseillé à notre ami d'avoir la même structure dans les feuilles Etape et la feuille Synthèse, ce qui n'empêche nullement un mode plan ou des cellules masquées, comme je l'ai indiqué.
Il n'y aurait donc pas lieu de
Citation:
tailler dans la masse
D'autre part, si l'on choisit d'alimenter les tableaux avec une sélection de valeurs, alors il suffirait de gérer les objets Range renvoyés par la méthode Offset plutôt que de boucler sur toutes les valeurs, ce qui éviterait là encore de
Citation:
tailler dans la masse
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 17h20   #12
Invité de passage
 
Dubuis
Inscription : août 2009
Messages : 9
Détails du profil
Informations personnelles :
Nom : Dubuis

Informations forums :
Inscription : août 2009
Messages : 9
Points : 1
Points : 1
Hello !

Merci pour tous vos conseils. Je ne m’attendais pas à recevoir autant d’aide. Du coup, j’avançais tranquillement de mon côté.

Comme vous pouvez le voir rien d’élégant et je vais m’empresser d’étudier vos solutions.

Pour l’instant voilà ce que j’ai bidouillé de mon côté avec mes maigres connaissances.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
 
Private Sub CommandButton1_Click()
 
 
 
' Macro Creation_tableaux
 
' Creation des feuilles d'étape
 
' Etape 1
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Etape 1"
 
' Etape 2
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Etape 2"
 
' Etape 3
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Etape 3"
 
' Copie des entêtes de colonne
    Sheets("Synthese des economies").Select
    ActiveSheet.Range("A1:AD2").Select
    Selection.Copy
    Sheets("Etape 1").Select
    ActiveSheet.Paste
    ActiveSheet.Range("A3").Select
    Sheets("Etape 2").Select
    ActiveSheet.Paste
    ActiveSheet.Range("A3").Select
    Sheets("Etape 3").Select
    ActiveSheet.Paste
    ActiveSheet.Range("A3").Select
    Application.CutCopyMode = False
 
' Etape 1 sélection des lignes et copie du tableau
    Sheets("Synthese des economies").Select
    Range("A3:AC62").Select
    ActiveWorkbook.Worksheets("Synthese des economies").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Synthese des economies").Sort.SortFields.Add Key _
        :=Range("AA3:AA62"), SortOn:=xlSortOnValues, Order:=xlDescending, _
        DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Synthese des economies").Sort
        .SetRange Range("A3:AC62")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
    Columns("AA:AA").Select
    Selection.SpecialCells(xlCellTypeFormulas, 4).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Etape 1").Select
    Sheets("Etape 1").Activate
    ActiveSheet.Range("A3").Select
    ActiveSheet.Paste
 
' Etape 2 sélection des lignes et copie du tableau
    Sheets("Synthese des economies").Select
    Range("A3:AC62").Select
    ActiveWorkbook.Worksheets("Synthese des economies").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Synthese des economies").Sort.SortFields.Add Key _
        :=Range("AB3:AB62"), SortOn:=xlSortOnValues, Order:=xlDescending, _
        DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Synthese des economies").Sort
        .SetRange Range("A3:AC62")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
    Columns("AB:AB").Select
    Selection.SpecialCells(xlCellTypeFormulas, 4).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Etape 2").Select
    ActiveSheet.Range("A3").Select
    ActiveSheet.Paste
 
' Etape 3 sélection des lignes et copie du tableau
    Sheets("Synthese des economies").Select
    Range("A3:AC62").Select
    ActiveWorkbook.Worksheets("Synthese des economies").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Synthese des economies").Sort.SortFields.Add Key _
        :=Range("AC3:AC62"), SortOn:=xlSortOnValues, Order:=xlDescending, _
        DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Synthese des economies").Sort
        .SetRange Range("A3:AC62")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
    Columns("AC:AC").Select
    Selection.SpecialCells(xlCellTypeFormulas, 4).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Etape 3").Select
    ActiveSheet.Range("A3").Select
    ActiveSheet.Paste
 
'Mise en page étape 1
    Sheets("Etape 1").Select
    ActiveSheet.Columns("D:G").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("E:H").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("F:I").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("H:H").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("I:V").Select
    Selection.Delete Shift:=xlToLeft
    Sheets("Etape 1.1").Select
    ActiveSheet.Range("A65:H66").Select
    Selection.Copy
    Sheets("Etape 1").Select
    ActiveSheet.Range("A1:B1").Select
    Selection.End(xlDown).Offset(1, 0).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
 
'Mise en page étape 2
    Sheets("Etape 2").Select
    ActiveSheet.Columns("D:G").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("E:H").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("F:I").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("H:H").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("I:V").Select
    Selection.Delete Shift:=xlToLeft
    Sheets("Etape 2.1").Select
    ActiveSheet.Range("A65:H66").Select
    Selection.Copy
    Sheets("Etape 2").Select
    ActiveSheet.Range("A1:B1").End(xlDown).Offset(1, 0).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
 
'Mise en page étape 3
    Sheets("Etape 3").Select
    ActiveSheet.Columns("D:G").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("E:H").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("F:I").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("H:H").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("I:V").Select
    Selection.Delete Shift:=xlToLeft
    Sheets("Etape 3.1").Select
    ActiveSheet.Range("A65:H66").Select
    Selection.Copy
    Sheets("Etape 3").Select
    ActiveSheet.Range("A1:B1").End(xlDown).Offset(1, 0).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Sheets("Synthese des economies").Select
    Range("A1:B1").Select
 
'Création récap des recommandations
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Récap des recommandations"
    Sheets("Synthese des economies").Select
    ActiveSheet.Columns("A:W").Select
    Selection.Copy
    Sheets("Récap des recommandations").Select
    ActiveSheet.Cells.Select
    ActiveSheet.Paste
 
    With Sheets("Récap des recommandations").Range("A3:A62")
    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End With
 
    Sheets("Récap des recommandations").Select
    ActiveSheet.Columns("D:G").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("E:H").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("F:I").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("H:H").Select
    Selection.Delete Shift:=xlToLeft
    ActiveSheet.Columns("I:J").Select
    Selection.Delete Shift:=xlToLeft
    Sheets("Synthese des economies").Select
    Range("A1:B1").Select
 
End Sub
Toutefois, il me reste plusieurs problèmes…

1. Je ne parviens pas à faire les sommes dans les feuilles d’étape car le nbr de ligne peut varier d’un cas à l’autre.

2. Le tableau de base "Synthèse des économies" doit être alimenté par d’autres fichiers. Chaque ligne correspond en fait à un fichier enregistré sous un répertoire défini. L’arborescence des dossiers est toujours la même et le lay-out des outils de calcul pour chaque mesure d’économie est le même. Toutefois, je ne connais pas les noms des fichiers à l’avance. Il peut y avoir de 10 à 60 fichiers de calcul différents. Existe-il une routine qui ouvre tous les fichiers d’un dossier défini pour en récupérer les chiffres souhaité ?

Bon, en attendant je vais bucher vos solutions et je vous souhaite d’ores et déjà d’excellente fêtes.


Merci
Fichiers attachés
Type de fichier : xlsx Synthese_finale _modele_en_devellopement .xlsx (74,7 Ko, 1 affichages)
Potemkine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 14h53   #13
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut copie avec occurences

Bonjour potemkine, Bonjour le Forum.

Houlala !

Nous allons procéder par ordre.

L'un des principes de base de VBA est qu'un objet peut être actionné sans être sélectionné. Autrement dit, les "Select" n'ajoutent rien au code; bien au contraire, ils l'alourdissent et le rendent illisible.

D'autre part, en utilisant une simple boucle et les fonctionnalités de chaque méthode (Copy) indiquées en premier lieu dans l'aide en ligne de VBA, tu peux diviser la longueur de ton code par au moins 4.

Dans le code suivant, les feuilles sont créées et chaque occuence de ta feuille de synthèse alimentent la feuille correspondante.

Dernière remarque, c'est la condition supplémentaire "Vrai" qui entraîne le balayage (Personnellement, j'évite). Utiliser la méthode "Find" serait plus approprié mais plus compliqué.

Teste d'abord ce code et reprends-le ligne par ligne, mot par mot.
Ensuite nous aborderons, une par une, le reste des actions que tu souhaites réaliser.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Option Compare Text
 
Private Sub Création()
 
 Dim f_synth As Worksheet
 Dim col_recherche As Range, c As Range
 
 Set f_synth = Sheets("Synthese des economies")
 
 'Désignation du champ de recherche de la feuille synthèse
 With f_synth
    Set col_recherche = .Range("T3", .Cells(.Rows.Count, 20).End(xlUp))
 End With
 
 'Boucle sur chaque occurence, création de la feuille, copie des entêtes et des données
 For i = 1 To 3
    Sheets.Add After:=Sheets(Sheets.Count)
    f_synth.Range("A1:AD2").Copy
    With ActiveSheet
                .Paste Destination:=.Range("A3")
                .Name = "Etape " & i
    End With
 
 Application.CutCopyMode = False
 
 'Balayage du champ de recherche et copie des cellules dans la feuille correspondante
    For Each c In col_recherche
        With c
            If .Value = i And .Offset(0, 6 + i).Value = "Vrai" Then _
                    f_synth.Range(.Offset(0, -19), .Offset(0, 1)).Copy Destination:=Sheets("Etape " & i).Range("A3").End(xlDown).Offset(1, 0)
        End With
    Next c
 
Next i
 
Application.CutCopyMode = False
 
Set f_synth = Nothing
Set col_recherche = Nothing
 
End Sub
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h28.


 
 
 
 
Partenaires

Hébergement Web