Bonjour,
Je cherche un moyen de rajouter des formes à un graphique, c'est à dire en utilisant les coordonnées locales du graphique.
Le bout de code suivant rajoute une "forme" (servant de support à des graphiques ou autres formes telles que des rectangles) à une feuille de position et de taille aléatoire, afin de ne pas biaiser le test.
Dans cette même forme, je rajoute une courbe (simple line XY de dimension aléatoire) afin de faire varier les échelles de axes.
Ensuite, je rajoute une forme (un simple carré) qui est censé recouvrir toute la zone du graphique. C'est le cas, mais j'ai systématiquement un décalage. Avez-vous une explication à ce décalage ? Est-ce possible de directement dessiner une forme en utilisant des coordonnées locale du graphique sans calculer des valeurs absolues avec les .InsideLeft,... ?
Bien sûr, je ne souhaite pas me limiter à un rectangle recouvrant l'ensemble de la PlotArea... Il ne me semble pas que le décalage est constant suivant les échelles des axes (je ne suis pas sûr que mon programme ci-dessous permet de faire varier le décalage, mais c'est le cas avec mon programme complet).
Ps : j'ai essayé de changer la position des TickMark (xlNone, xlInside), mais cela ne change rien au décalage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Option Explicit Sub test() Dim ws As Worksheet: Set ws = ActiveSheet Dim sh As Shape: For Each sh In ws.Shapes sh.Delete Next sh Dim left As Double, top As Double, width As Double, height As Double With ws.Shapes With .AddChart 'random chart position and size .left = Rnd() * Application.UsableWidth .top = Rnd() * Application.UsableHeight .width = Rnd() * (Application.UsableWidth - .left) .height = Rnd() * (Application.UsableHeight - .top) 'set shape relative position (the shape dimension will be set based on the plotArea size) left = .left top = .top width = 0 height = 0 With .Chart .ChartType = xlXYScatterLinesNoMarkers 'random series (will set the axes) With .SeriesCollection.NewSeries .XValues = Array(1000 * Rnd(), 1000 * Rnd()) .Values = Array(1000 * Rnd(), 1000 * Rnd()) End With 'compute shape absolute position based on shape and chart positions and sizes With .PlotArea left = left + .InsideLeft top = top + .InsideTop width = width + .InsideWidth height = height + .InsideHeight End With End With End With '-------------------------------------- With .AddShape(msoShapeRectangle, left, top, width, height) .Fill.Transparency = 0.5 End With End With End Sub
Merci pour votre aide et Joyeux Noël !
Partager