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
Nom : Capture.PNG
Affichages : 274
Taille : 78,1 Ko

Merci pour votre aide et Joyeux Noël !