Optimisation

maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008 - 29 juin 2008 à 15:10
maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008 - 6 juil. 2008 à 12:24
Voici une macro que j'ai fait avec la fonction "enregistrer une macro" est-il possible de l'optimiser?


Application.ScreenUpdating = False
With Range("A1").Select
ActiveSheet.Select
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"$A1:$D1000").CreatePivotTable TableDestination:="", TableName:="Tableau croisé dynamique7", DefaultVersion:=xlPivotTableVersion10
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique7").PivotFields("TK")
.Orientation = xlPageField
.Position = 1
ActiveSheet.PivotTables("Tableau croisé dynamique7").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique7").PivotFields("Défaut"), _
"Nombre de Défaut", xlCount
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique7").PivotFields("Défaut")
.Orientation = xlColumnField
.Position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique7").PivotFields("Défaut")
.Orientation = xlRowField
.Position = 1

End With
With ActiveSheet.Next.Select
Range("O1").Select
Selection.Copy
ActiveSheet.Previous.Select
Range("D1").Select
ActiveSheet.Paste
End With
With ActiveSheet.Select
ActiveSheet.Name = Range("$D1")
ActiveSheet.Select
Sheets("Liste des défauts").Select
Sheets.Add
End With
With ActiveSheet.Next.Select
Range("J1").Select
Selection.Copy
ActiveSheet.Previous.Select
Range("D1").Select
ActiveSheet.Paste
Range("A3").Select
End With
With ActiveSheet.Select
ActiveSheet.Name = Range("D1")
Charts.Add
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=Sheets("R01").Range("$A1:$B100")
ActiveChart.Location Where:=xlLocationAsObject, Name:= _
"Graphiques défauts TK"
End With
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Nombre de défauts TK1"
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
ActiveChart.ChartArea.Select
ActiveChart.HasPivotFields = False
ActiveChart.Legend.Select
Selection.Delete
ActiveChart.SeriesCollection(1).Select
ActiveChart.ChartArea.Select
ActiveChart.ApplyDataLabels AutoText:=True, LegendKey:=False, _
HasLeaderLines:=False, ShowSeriesName:=False, ShowCategoryName:=False, _
ShowValue:=True, ShowPercentage:=False, ShowBubbleSize:=False
ActiveSheet.Shapes("Graphique 1").IncrementLeft -226.5
ActiveSheet.Shapes("Graphique 1").IncrementTop -89.25


End With

End Sub

11 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 juin 2008 à 17:33
Bonjour,


Comme toutes macros construit avec l'enregistreur de macro... la réponse est oui !


Au boulot, et bon courage...

Amicalement,
Us.
0
maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008
29 juin 2008 à 18:30
par "est-il possible de l'optimiser", je supposait "pouvez-vous me conseiller", car je me doute que c'est possible, seulement, etant debutant, je ne sait pas comment faire.:D
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 juin 2008 à 19:15
Forcément... mais si tout le monde balance leur macro commande à optimiser, on va plus en finir, nan ?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>



 




Enfin, pour ma part je ne donnerai que quelques conseils de bon sens... Le reste sera à vous de faire...



 




Partons, pour une petite série de conseils...



 




1) Avant tout, avant même l'enregistrement de la macro, faire toute les manipulations à blanc afin de repérer les menus à utiliser et d'éviter toutes les manipulations inutiles.



 




2) Bien méditer le conseil 1 !!! Je sais cela fait un peu blague... mais pourtant c'est un conseil crucial ! Pourquoi ? Il suffit de regarder ce que donne l'enregistreur de macro, lorsqu'on fait des choses inutiles, tout simplement... voir il suffit de s'exercer à regarder les codes inutiles pour trouver du premier coup d'oeil... Exemple, pour être clair :


- Imaginons, qu'on veut inscrire dans A1 la formule 100+4... Mais qu'on s'y reprend à plusieurs reprises... voici ce que cela peut donner :



 






   
Range("A1").Select








    ActiveCell.FormulaR1C1 = "=1"








    Range("A1").Select








    ActiveCell.FormulaR1C1 = "=100"








    Range("A1").Select








    ActiveCell.FormulaR1C1 = "=100+4"








   
Range("A2").Select





 




Et encore je ne force pas, car on aurait pu faire une sélection de plage, mettre un truc dans une autre cellule, puis supprimer, changer de feuille puis revenir, etc... le résultat final aurait été le même, mais plus moyen de se retrouver ensuite... sans compter le nb de ligne qui aurait explosée...



 




Bien sur le plus court aurait été de directement d'inscrire la formule... ainsi le code serait :



 






   
Range("A1").Select








    ActiveCell.FormulaR1C1 = "=100+4"








   
Range("A2").Select





 




3) L'optimisation !



 




Grande partie de plaisir que j'adore... Déjà, il y a plusieurs possibilités d'optimisation... éh, oui... Si on se contente d'optimiser que les macros commande, c'est à dire, ne pas changer la nature du code produit…



 




Traduisons, la 1er ligne … Range("A1").Select


Veut dire qu’on sélectionne la cellule A1



 




Puis la seconde : ActiveCell.FormulaR1C1 = "=100+4"


Veut dire : Dans la cellule active on rentre la formule (avec référence absolu R1C1, qui ici n’a pas d’importance)  «  = 100+4 »



 




Bon, et bien une façon d’optimiser, c’est de contracter ces 2 instructions en une seule…


En effet, RANGE possède directement la propriété FormulaR1C1… Pour le voir, il suffit de taper dans vbe : Range(« A1 »). (point) là une liste déroulante des propriétés applicables s’affiche… Où on peut choisir ForumlaR1C1… Au final donne :



 





Range("A1").FormulaR1C1 = "=100+4"



 




En quoi cela est optimisé ? Tout simplement, dans le premier cas tu impose à Excel d’exécuter la sélection d’une cellule (le curseur se déplace réellement sur la cellule), dans le second tu applique directement la formule dans la cellule sans passer par le déplacement du curseur de sélection… Conclusion : Gain de rapidité ! Ainsi suite…



 




La dernière ligne : Range("A2").Select


N’a à priori aucun intérêt, et donc peut être supprimée…



 




En définitive, mon exemple se résume à 1 ligne…



 




=



 




Dans ta macro, à toi de voir les lignes inutiles… En effet, tu fais des manipulations sur des tableaux croisés dynamique, puis de copier/coller .. Comment veux-tu qu’on sache si ces copier/coller sont utiles ou pas… Ensuite tu en fais des graphiques… Bon, bref, à part les 2 dernières lignes qui sont des déplacements du graphique donc probablement sans intérêt… je ne peux pas faire une optimisation à ta place…



 




Bon courage,



 




Amicalement,


Us.
0
maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008
29 juin 2008 à 20:10
ok, merci pour ce petit conseil

je ne demande pas non plus qu'on fasse la macro a ma place, sinon je ne progresserais jamais et ce n'est pas le but, ce que je demande c'est exactement ce que tu viens de faire.

je m'en vais méditer sur ma macro

a+
0

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

Posez votre question
maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008
29 juin 2008 à 20:17
pour les graphique que je copie colle c que lorsque je met une destination, ca ne marche pas alors je le fait sur la meme page et je le deplace apres, je sait ca fait clochard mais quand je l'ai fait, j'ai pas trouvé d'infos et apres non plus dailleurs et depuis, je suis passer a autre chose
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
30 juin 2008 à 11:47
salut,

pour ton graphique, vire tous tes
    ActiveSheet.Shapes("Graphique 1").IncrementLeft -226.5

    ActiveSheet.Shapes("Graphique 1").IncrementTop -89.25

Utilise plutôt .Left et .Top pour lui donner directement les bonnes coordonnées.

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008
30 juin 2008 à 17:34
ok pour les graphiques je vais essayer, merci du conseil

Bonjour tt le monde,

Sub FusionLignes()
Dim i As Integer, j As Integer, Lig As Integer, Tablo
With Sheets("Feuil1")
Lig = .Range("A65536").End(xlUp).Row
Tablo = .Range("A2:E" & Lig)
For i = 1 To Lig - 2
If Tablo(i, 1) <> "" Then
For j = i + 1 To Lig - 1
If Tablo(j, 1) <> "" Then
If Tablo(j, 4) Tablo(i, 4) And Tablo(j, 5) Tablo(i, 5) Then
Tablo(i, 2) = Tablo(i, 2) + Tablo(j, 2)
Tablo(j, 1) "": Tablo(j, 2) "": Tablo(j, 3) = "": Tablo(j, 4) = "": Tablo(j, 5) = ""
End If
End If
Next j
End If
Next i
.Range("A2:E" & Lig) = Tablo
.Range("A2:E" & Lig).Sort Key1:=Range("A2"), Order1:=xlAscending
End With
End Sub

voici une petite question : cette macro est pour fusionner les lignes d'une liste entre elle a la condition que la cellule de la colonne D et E soit identique.
(elle aditionne aussi des durée mais ça c'est bon).
ex:

A.....................B...................c.....................D..................E

1.....................a..................25...................aaa..............aaa
2.....................c..................27...................aaa..............aaa

2.....................a..................25................... .................aaa
6.....................g..................35................... .................aaa

3.....................a..................25...................aaa..............aaa

3.....................o..................42................... ...................
4.....................a..................25................... ...................

il va fusionner la 1ere ligne et la deuxieme. mais il va aussi fusionner la 3eme ligne avec la 4eme et la 5 avec la 6.

Je voudrais qu'il ne compte pas les cellule vides comme doublons, quelle est le code à rajouter
0
maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008
2 juil. 2008 à 21:28
Bonjour tout le monde


  Voila, j'ai bien bosser en suivant vos conseils, mais la, apres avoir supprimé ou modifié pas mal de chose, je butte un peu.
si vous pouvez me conseillez concernant ce morceau?
Sheets("TK2").Select
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
    "$A1:$D1000").CreatePivotTable TableDestination:="", TableName:="Tableau croisé dynamique7", DefaultVersion:=xlPivotTableVersion10
        With ActiveSheet.PivotTables("Tableau croisé dynamique7").PivotFields("TK")
    .Orientation = xlPageField
    .Position = 1
    ActiveSheet.PivotTables("Tableau croisé dynamique7").AddDataField ActiveSheet. _
        PivotTables("Tableau croisé dynamique7").PivotFields("Défaut"), _
        "Nombre de Défaut", xlCount
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique7").PivotFields("Défaut")
        .Orientation = xlColumnField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique7").PivotFields("Défaut")
        .Orientation = xlRowField
        .Position = 1
            End With
    ActiveSheet.Name = "R02"
    
    Charts.Add
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SetSourceData Source:=Sheets("R02").Range("$A1:$B100")
    ActiveChart.Location Where:=xlLocationAsObject, Name:= _
    "Graphiques défauts TK"


    With ActiveChart
        .HasTitle = True
        .ChartTitle.Characters.Text = "Nombre de défauts TK2"
        .Axes(xlCategory, xlPrimary).HasTitle = False
        .Axes(xlValue, xlPrimary).HasTitle = False
            ActiveChart.ChartArea.Select
     ActiveChart.HasPivotFields = False
     ActiveChart.Legend.Select
    Selection.Delete
     ActiveChart.SeriesCollection(1).Select
    ActiveChart.ChartArea.Select
    ActiveChart.ApplyDataLabels AutoText:=True, LegendKey:=False, _
        HasLeaderLines:=False, ShowSeriesName:=False, ShowCategoryName:=False, _
        ShowValue:=True, ShowPercentage:=False, ShowBubbleSize:=False
    ActiveSheet.Shapes("Graphique 2").IncrementLeft -226.5
    ActiveSheet.Shapes("Graphique 2").IncrementTop -89.25
    End With
       
    ActiveChart.PlotArea.Select
    With Selection.Border
        .ColorIndex = 2
        .Weight = xlThin
        .LineStyle = xlContinuous
    End With
    With Selection.Interior
        .ColorIndex = 2
        .PatternColorIndex = 1
        .Pattern = xlSolid
    End With
    ActiveChart.Axes(xlValue).Select
    With ActiveChart.Axes(xlValue)
        .MinimumScaleIsAuto = True
        .MaximumScale = 120
        .MinorUnitIsAuto = True
        .MajorUnit = 20
        .Crosses = xlAutomatic
        .ReversePlotOrder = False
        .ScaleType = xlLinear
        .DisplayUnit = xlNone
    End With
        
        
    With ActiveSheet.Shapes("Graphique 2")
    .Left = Range("a27").Left
    .Top = Range("A27").Top



merci pour vos réponse
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
2 juil. 2008 à 21:42
Bonsoir,

=

  With ActiveSheet.Shapes("Graphique 2")
    .Left = Range("a27").Left
    .Top = Range("A27").Top
End with

=

Par contre, on va tous avoir du mal à te répondre car tu ne pose déjà pas de question... Tu butte, soit, mais sur quoi ?

De plus, ton code est totalement hors contexte. On ne sait pas ce que tu fais vraiment...

Petit conseil, supplémentaire pour l'utilisation du Forum : Si la nature du problème du problème change, faire un autre Post... et pas allimenter indéfiniment le premier, sinon déjà par expérience en général, on évite de répondre, car la conséquence c'est faire une confusion des propos et de la situation... Bref, c'est le bor--- .

Amicalement,
Us.

PS : avec [CODE] ... en terme de présentation, il faudrait deux sauts de ligne...
0
maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008
2 juil. 2008 à 22:50
et bien, je bute sur la forme, dans les termes, par exemple, j'ai deja supprimé tout les select, changer les copier coller( mettre "range() =range()" au lieu de select range(); copy.....paste.) voila, car j'ai tout fait au début avec l'enregistreur.
la on peut voir que je cré un tableau dynamique puis un graphique, ce que je veut savoir c quelle "phrase" longue, je peut raccourcir.
0
maguetlolo Messages postés 18 Date d'inscription jeudi 14 décembre 2000 Statut Membre Dernière intervention 14 juillet 2008
6 juil. 2008 à 12:24
bonjour, 

  Résolu a moitié mais je passe a autre chose, je verrais cela au fur et a mesure de mes progres

merci de vous y etre interessé

a+
0
Rejoignez-nous