OVH Cloud OVH Cloud

Graphique Excel à partir de VBA sous Project

9 réponses
Avatar
Anne
Bonjour,

Je rencontre des probl=E8mes pour g=E9n=E9rer un graphique Excel =E0 partir
d'une macro sous Project.
(J'avais d=E9j=E0 pos=E9 une question =E0 ce sujet, mais la solution n'a
pas =E9t=E9 trouv=E9e, donc je relance, si quelqu'un a une id=E9e).

J'ai ouvert une session Excel =E0 partir de ma macro.

Set xlApp =3D CreateObject("Excel.Application")

Dim NewBook As Excel.Workbook
Set NewBook =3D xlApp.Workbooks.Add

Dim xlShDonnees, xlShGraphes As Excel.Worksheet
Set xlShDonnees =3D NewBook.Worksheets(1)
Set xlShGraphes =3D NewBook.Worksheets(2)

Pour la gestion des cellules (fonctions range, Cells, Columns,...) tout
se passe bien. Mais c'est la cr=E9ation du graphique qui pose probl=E8me.

xlApp.Charts.Add
ActiveChart.charttype =3D 51 'xlColumnClustered
ActiveChart.SetSourceData
Source:=3DxlShDonnees.Range("A4:F4,A6:F6"), _
PlotBy:=3D1 'xlRows

J'ai remplac=E9 par leur num=E9ro les variables xlColumnClustered et
xlRows, qui n'=E9taient pas reconnues.
J'ai une erreur d'ex=E9cution 1004 qui se produit sur la ligne
ActiveChart.SetSourceData ....

Si quelqu'un peut m'aider =E0 trouver une solution! Merci d'avance

Anne

9 réponses

Avatar
Vincent Isoz
Bonjour

Ce serait plus simple et plus rapide en ayant tout le code. Mais je vais
voir ce je peux faire dans le temps que j'ai.

Cordialement

"Anne" wrote:

Bonjour,

Je rencontre des problèmes pour générer un graphique Excel à partir
d'une macro sous Project.
(J'avais déjà posé une question à ce sujet, mais la solution n'a
pas été trouvée, donc je relance, si quelqu'un a une idée).

J'ai ouvert une session Excel à partir de ma macro.

Set xlApp = CreateObject("Excel.Application")

Dim NewBook As Excel.Workbook
Set NewBook = xlApp.Workbooks.Add

Dim xlShDonnees, xlShGraphes As Excel.Worksheet
Set xlShDonnees = NewBook.Worksheets(1)
Set xlShGraphes = NewBook.Worksheets(2)

Pour la gestion des cellules (fonctions range, Cells, Columns,...) tout
se passe bien. Mais c'est la création du graphique qui pose problème.

xlApp.Charts.Add
ActiveChart.charttype = 51 'xlColumnClustered
ActiveChart.SetSourceData
Source:=xlShDonnees.Range("A4:F4,A6:F6"), _
PlotBy:=1 'xlRows

J'ai remplacé par leur numéro les variables xlColumnClustered et
xlRows, qui n'étaient pas reconnues.
J'ai une erreur d'exécution 1004 qui se produit sur la ligne
ActiveChart.SetSourceData ....

Si quelqu'un peut m'aider à trouver une solution! Merci d'avance

Anne




Avatar
Vincent Isoz
Bon ben je me suis pas foulé

Je vous donne finalement l'exercice que je donne pendant mes cours VBA cela
devrait vous donner une base de travail (n'oubliez pas d'aller voir mes PDFs
sur le web tout y est déjà...).

Cette procédure exporte au fait la liste des ressources avec leur travail en
heures et en fait un graphique (un classique quoi...)

Sub Total()

Dim Client As Resource
Dim CT As Double
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim Proj As Project

Set xlApp = New Excel.Application
xlApp.Visible = True
AppActivate "Microsoft Excel"

Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets.Add
xlSheet.Name = ActiveProject.Name

CT = 1
xlSheet.Cells(1, 1) = "RESSOURCES"
xlSheet.Cells(1, 2) = "TRAVAIL"

For Each Client In ActiveProject.Resources
xlSheet.Cells(1 + CT, 1) = Client.Name
xlSheet.Cells(1 + CT, 2) = Client.Work / 60
CT = CT + 1
Next Client

xlApp.Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SeriesCollection.NewSeries
'attention selon la langue de l'interface de MS Excel de remplacer Feuil
par le nom adéquat
plagevaleursx = "=" & ActiveProject.Name & "!R2C1:R" & CT & "C1"
ActiveChart.SeriesCollection(1).XValues = plagevaleursx
plagevaleurs = "=" & ActiveProject.Name & "!R2C2:R" & CT & "C2"
ActiveChart.SeriesCollection(1).Values = plagevaleurs
'Attention à la manière d'écrire cette ligne (sinon cela rajoute une
série vide!)
ActiveChart.SeriesCollection(1).Name = "=""Valeurs"""
ActiveChart.Location Where:=xlLocationAsNewSheet
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Représentation Graphique"
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Temps]"
End With


End Sub


"Vincent Isoz" wrote:

Bonjour

Ce serait plus simple et plus rapide en ayant tout le code. Mais je vais
voir ce je peux faire dans le temps que j'ai.

Cordialement

"Anne" wrote:

Bonjour,

Je rencontre des problèmes pour générer un graphique Excel à partir
d'une macro sous Project.
(J'avais déjà posé une question à ce sujet, mais la solution n'a
pas été trouvée, donc je relance, si quelqu'un a une idée).

J'ai ouvert une session Excel à partir de ma macro.

Set xlApp = CreateObject("Excel.Application")

Dim NewBook As Excel.Workbook
Set NewBook = xlApp.Workbooks.Add

Dim xlShDonnees, xlShGraphes As Excel.Worksheet
Set xlShDonnees = NewBook.Worksheets(1)
Set xlShGraphes = NewBook.Worksheets(2)

Pour la gestion des cellules (fonctions range, Cells, Columns,...) tout
se passe bien. Mais c'est la création du graphique qui pose problème.

xlApp.Charts.Add
ActiveChart.charttype = 51 'xlColumnClustered
ActiveChart.SetSourceData
Source:=xlShDonnees.Range("A4:F4,A6:F6"), _
PlotBy:=1 'xlRows

J'ai remplacé par leur numéro les variables xlColumnClustered et
xlRows, qui n'étaient pas reconnues.
J'ai une erreur d'exécution 1004 qui se produit sur la ligne
ActiveChart.SetSourceData ....

Si quelqu'un peut m'aider à trouver une solution! Merci d'avance

Anne






Avatar
Anne
Le code est assez long et il fait intervenir bcp trop d'éléments qui
n'ont pas de rapport avec la question. Je ne pense pas que ce soit plus
simple de l'envoyer en entier...
Pour plus d'explications : dans la feuille 1 sous Excel, j'entre en
ligne 4 (à partir de la colonne B) des numéros de semaine, puis pour
chaque semaine, une valeur de travail. Je cherche ensuite à créer en
tant qu'objet sur la feuille 2 le graphique du "travail" en fonction du
numéro de semaine.
Merci.
Avatar
Vincent Isoz
Ok mais comme je vous ai finalement donné le code cela ne pose maintenant
plus de problèmes. C'est maintenant trivial.

Cordialement

"Anne" wrote:

Le code est assez long et il fait intervenir bcp trop d'éléments qui
n'ont pas de rapport avec la question. Je ne pense pas que ce soit plus
simple de l'envoyer en entier...
Pour plus d'explications : dans la feuille 1 sous Excel, j'entre en
ligne 4 (à partir de la colonne B) des numéros de semaine, puis pour
chaque semaine, une valeur de travail. Je cherche ensuite à créer en
tant qu'objet sur la feuille 2 le graphique du "travail" en fonction du
numéro de semaine.
Merci.




Avatar
Anne
En effet (nos messages précédents se sont croisés...).
Merci pour ce bout de code. En utilisant les lignes utilisant les
"seriescollection", et en ajoutant des noms à mes feuilles, j'ai enfin
réussi à tracer mon graphique.
En revanche, les variables telles que xlColumnClustered, ou
xlLocationAsNewSheet, ne sont toujours pas reconnues... Je suis passée
par les chiffres correspondants. Je ne comprends pas d'où cela peut
venir.
En tout cas, j'ai réussi à faire ce que je voulais.
Merci encore.
Avatar
Vincent Isoz
C'est normal je sais d'où cela vient. Mais avant de vous dire ce que c'est...
(échange de bons procédés) j'aimerais avoir plus de détails sur le
développement que vous faites (qui peut intéresser la communauté).

Est-ce vous avez créé un code VBA qui exporte le travail par semaine de
chaque ressource ou cela n'a rien à voir ?

Cordialement


En effet (nos messages précédents se sont croisés...).
Merci pour ce bout de code. En utilisant les lignes utilisant les
"seriescollection", et en ajoutant des noms à mes feuilles, j'ai enfin
réussi à tracer mon graphique.
En revanche, les variables telles que xlColumnClustered, ou
xlLocationAsNewSheet, ne sont toujours pas reconnues... Je suis passée
par les chiffres correspondants. Je ne comprends pas d'où cela peut
venir.
En tout cas, j'ai réussi à faire ce que je voulais.
Merci encore.




Avatar
Anne
Pas de problème pour expliquer le développement que j'essaie de
faire. Je n'ai pas le temps de le faire maintenant, mais j'envoie ceci
dès que possible, mardi.
Avatar
Anne
Bonjour,

Voici donc les explications sur le code que je tente d'écrire:
ce n'est pas un export du travail par semaine de chaque ressource, mais
un export du travail par semaine d'un groupe de ressources sur
certaines tâches.
Je vais essayer d'expliquer un peu plus en détails : le groupe de
ressources dont je parle sont des ressources matérielles (un ensemble
de machines), que je déclare en ressources "travail" pour pouvoir
gérer leur utilisation. A ces ressources sont affectées des blocs de
tâches, créés par VBA. Les sous-tâches ont toujours la même
structure, et la tâche récapitulative a un nom "standardisé" (issu
de listes de choix). Le nom contient un paramètre qui m'intéresse,
que j'appelerai la "procédure". Ce que j'exporte sous Excel est le
travail de toutes les ressources du groupe, décomposé selon les
"procédures". Ceci pour établir une prévision du plan de charge par
"procédure".

Voici le code, encore à l'état "brouillon" :

Sub PlanChargeParProcedure()

'======================== ========
'DEFINITION DES VARIABLES LOCALES
'======================== ========

Dim TSV As TimeScaleValues
Dim NbSem, NbPE, NbMois As Long
Dim i, j As Integer
Dim Val As Integer
Dim Asg As Assignment
Dim Tsk As Task
Dim TableCharge() As Variant
Dim ListeToutesPE() As String
Dim C As Range
Dim Col, DerCol As String
Dim ListeRessourcesBancs() As Long 'liste des numéros des bancs
dans les ressources
ReDim ListeRessourcesBancs(0)
Dim R As Resource
Dim DateFin As Date
Dim PourcentAvancement As Single


'Liste des numéros des ressources bancs

'Parcours des ressources
For Each R In ActiveProject.Resources
'Si la ressource est dans le groupe "Banc"
If R.Group = "Banc" Then
'On ajoute son numéro à la liste
ListeRessourcesBancs(UBound(ListeRessourcesBancs)) = R.ID

ReDim Preserve
ListeRessourcesBancs(UBound(ListeRessourcesBancs) + 1)
End If
Next R

ReDim Preserve ListeRessourcesBancs(UBound(ListeRessourcesBancs) -
1)


'Ouverture d'une session excel
Set xlApp = CreateObject("Excel.Application")

'Ouverture du classeur contenant les paramètres essais (en lecture
seule)
xlApp.Workbooks.Open ActiveProject.Path &
"Paramètres_essais.xls", _
ReadOnly:=True


'Liste des procédures d'essais
'copiée dans le presse-papiers
With xlApp.ActiveWorkbook.Worksheets("Organes")
.Range("A4:" & .Range("A4").End(xlDown).Address).Copy
End With

'Fermeture de ce fichier excel
xlApp.ActiveWorkbook.Close
'Ouverture d'un nouveau classeur excel pour établir le plan de
charge
Dim NewBook As Excel.Workbook
Set NewBook = xlApp.Workbooks.Add
'xlApp.Visible = True

Dim xlShDonnees, xlShGraphes As Excel.Worksheet
Set xlShDonnees = NewBook.Worksheets(1)
Set xlShGraphes = NewBook.Worksheets(2)

xlShDonnees.Name = "Données"
xlShGraphes.Name = "Graphiques"

'Colonne A : toutes les procédures d'essais
xlShDonnees.Paste xlShDonnees.Range("A5")

'Nombres de mois à analyser
NbMois = 2


'Nombre de semaines à analyser

NbSem = DateDiff("ww", Date, DateAdd("m", NbMois, Date), vbMonday)
+ 1

'Ligne 4 : numéros des semaines
For i = 1 To NbSem
xlShDonnees.Cells(4, i + 1) = "S" & DatePart("ww", Date + (i -
1) * 7)
Next i

'Activation de la vue Utilisation des ressources dans Project
ViewApply Name:="Utilisation des ressources"


For i = 0 To UBound(ListeRessourcesBancs)

EditGoTo ID:=ListeRessourcesBancs(i)

'CompteurBanc = CompteurBanc + 1
PourcentAvancement = (i + 1) / (UBound(ListeRessourcesBancs) +
1)
Call MaJBarre(PourcentAvancement)



If Not (ActiveCell.Resource.Assignments Is Nothing) Then


'Parcours de toutes les PE existantes
For Each C In xlShDonnees.Range("A5:" &
xlShDonnees.Range("A5").End(xlDown).Address)

'Pour chaque tâche affectée au banc
For Each Asg In ActiveCell.Resource.Assignments

'Si la tâche est rattachée à un essai
correspondant à la PE considérée
If Asg.TaskSummaryName Like "*" & C & "*" Then

'On évalue le travail du banc sur cette
tâche, semaine par semaine,
'sur la plage de dates choisie
Set TSV = Asg.TimeScaleData(Date, DateAdd("m",
NbMois, Date), _
Type:=pjAssignmentTimescaledWork,
TimescaleUnit:=pjTimescaleWeeks)

'Pour chaque semaine
For j = 1 To TSV.Count

'Lettre correspondant à la colonne de la
semaine considérée
Col = Left$(xlShDonnees.Cells(1, j +
1).Address(0, 0), _
(xlShDonnees.Cells(1, j + 1).Column < 27) +
2)

'Si le travail est non nul sur cette
semaine
If Not TSV(j).Value = "" Then
'on l'ajoute dans la case
correspondante du tableau excel
'(i.e. ligne correspondant à la PE
considérée, et colonne
'correspondant à la semaine
considérée)
xlShDonnees.Range(Col & C.Row) = _
xlShDonnees.Range(Col & C.Row) +
TSV(j).Value / 60 / 7 / 7
End If
Next j
End If


Next Asg

Next C
End If

Next i


xlApp.Visible = True

'lettre correspondant à la dernière colonne
DerCol = Left$(xlShDonnees.Cells(1, NbSem + 1).Address(0, 0), _
(xlShDonnees.Cells(1, NbSem + 1).Column < 27) + 2)


xlShDonnees.Columns("A:" & DerCol).NumberFormat = "0.00"
xlShDonnees.Columns("A:" & DerCol).EntireColumn.AutoFit


'For Each C In xlShDonnees.Range("A5:" &
Feuille.Range("A5").End(xlDown).Address)
'Next C

xlApp.Charts.Add
'xlApp.ActiveChart.ChartType = xlColumnClustered
xlApp.ActiveChart.ChartType = 51

xlApp.ActiveChart.SeriesCollection.newseries
xlApp.ActiveChart.SeriesCollection(1).XValues =
"=Données!R4C2:R4C10"
xlApp.ActiveChart.SeriesCollection(1).Values =
"=Données!R5C2:R5C10"
xlApp.ActiveChart.SeriesCollection(1).Name = "=Données!R5C1"
xlApp.ActiveChart.Location Where:=2, Name:="Graphiques"


End Sub
Avatar
Anne
Vincent,

Avez-vous toujours une idée d'où peut venir mon problème?
J'ai toujours des erreurs de variables non reconnues dans les lignes de
code concernant les graphiques... Et je ne trouve pas la solution.

Merci d'avance.