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
| Option Explicit 'voir unpeu plus bas dans les commentaires au niveau des déclarations de variables
Sub Macro3()
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim xlcell As Excel.Range
Dim debut As Integer
Dim Fin As Integer
'Par habitude il est (je trouve) pratique de tout déclarer en début de code
Dim j As Integer
Dim u As Integer
'Il est bien de mettre le texte "Option explicit" au debut de ton module, ca force VBA a t'imposer de declarer toutes tes variables, ca evite bien des erreurs
Dim PlageX As Range
Dim PlageY As Range
Dim Graph As Chart
'je me positionne sur la vue de MSProject souhaité et copie mes 3 colonnes
ViewApply Name:="7 courbe d'avancement"
SelectTaskColumn Column:="Fin", Additional:=2
EditCopy
'ouvrir un classeur excel
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
'Pourquoi t'etre arrété la?
Set xlSheet = xlBook.Sheets("Feuil1")
xlApp.Application.ReferenceStyle = xlA1
' collage des colonnes dans excel
With xlSheet 'xlSheet etant defini comme la feuil1 du classeur xlBook de xlApp, il n'est plus utile de represiser la totalité du chemin
.Range("C9").Paste
.Range("C8").Value = "Date de Fin"
.Range("D8").Value = "point de pondération"
.Range("E8").Value = "avt %"
' calcul de la dernière ligne non nulle , utile pour dimensionner les échelles du graphe
Fin = .Range("C20").End(xlDown).Row
debut = .Range("C20").End(xlUp).Row + 1
.Range("A1").Value = Fin
.Range("A2").Value = debut
'format des cellules
'xlApp.Columns("D:D").Select 'Bizarre j'avoue ne pas trop savoir ce que l'on manipule avec l'objet Columns de l'objet Application Excel
'J'aurais plutot vu comme ca, mais bon je peux faire erreur
.Columns("D:D").NumberFormat = "General"
.Columns("C:C").NumberFormat = "m/d/yyyy"
.Columns("E:E").NumberFormat = "0.00%"
' somme des points de pondération
.Range("D1").Value = "Total points de pondération"
.Range("D2").FormulaR1C1 = "=SUM(R9C4:R2002C4)" 'c'est une affaire de choix, mais je trouve plus lisible .Range("D2").Formula = "=SUM(D9:D2002)"
' trier les dates par ancienneté
With .Range("C9:C" & Fin).Sort
.SortFields.Clear
.SortFields.Clear
.SortFields.Add Key:=Range("C9:C" & Fin), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("C9:C" & Fin)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
'calcul %avt réel
.Range("F8").Value = "% avt pondéré"
For j = 9 To Fin
.Range("F" & j).Value = .Range("E" & j) * .Range("D" & j) / .Range("D2")
'tu peux aussi utilisé l'objet Cells
.Cells(j, "F") = .Cells(j, "E") * .Cells(j, "D") / .Range("D2") 'je trouve ca plus lisible, mais ca reste personnel
Next j
' calcul avt cumulé
.Range("G8").Value = "% avt cumulé"
.Range("G9").FormulaR1C1 = "=R9C6" 'Ou Formule = "=F9"
For u = 10 To Fin
.Range("G" & u).Value = .Range("G" & u - 1) + .Range("F" & u)
Next u
'% achevé réel final pour vérifier = 100%
.Range("F1").Value = "% avt réel total"
.Range("F2").FormulaR1C1 = "=SUM(R9C6:R2002C6)"
'afficher calcul en %
.Columns("F:G").NumberFormat = "0.00%"
'redimensionnement auto des cellules
.Columns("C:G").AutoFit
'insertion du Graph
'Definit les abscisses (colonne A)
Set PlageX = .Range("C9:C" & Fin)
'Definit les ordonnées (colonne G)
Set PlageY = .Range("G9:G" & Fin)
Set Graph = xlApp.Charts.Add
'icij'aurais plutot utiliser la collection chart du classeur xlBook
Set Graph = xlBook.Charts.Add
With Graph
.SetSourceData PlageY, xlColumns
.SeriesCollection(1).XValues = PlageX 'Abscisses
.ChartArea.Interior.Color = vbWhite
.HasDataTable = False 'Table des données visibles
.HasTitle = True 'Titre visible
.ChartTitle.Characters.Text = " % avancement dans le temps"
'Pourquoi ne plus utiliser ton objet Graph??
'xlApp.ActiveChart.ChartType = xlXYScatterSmooth
'xlApp.ActiveChart.SeriesCollection(1).Name = "=""avancement %"""
.ChartType = xlXYScatterSmooth
.SeriesCollection(1).Name = "=""avancement %"""
End With
'rendre visible le classeur ecxel
xlApp.Visible = True
End Sub |
Partager