Sub draw_data()
Dim N As Long, i As Long
Dim x As Double, dx As Double
N = 100
x = 0
dx = 3.14 * 2 / N
' データ作成部
ThisComponent.addActionLock()
' グラフが存在する場合、ロックをかけないとセル記入が遅くなる
If ThisComponent.Sheets(0).Charts.hasByName("datagraph") = True Then
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.LockControllers
End If
For i = 0 To N - 1
ThisComponent.Sheets(0).getCellByPosition(0, i).Value = x
ThisComponent.Sheets(0).getCellByPosition(1, i).Value = Sin(x)
ThisComponent.Sheets(0).getCellByPosition(2, i).Value = Cos(x)
x = x + dx
Next i
If ThisComponent.Sheets(0).Charts.hasByName("datagraph") = True Then
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.LockControllers
End If
ThisComponent.removeActionLock()
Dim Rect As New com.sun.star.awt.Rectangle
Dim RangeAddress(0) As New com.sun.star.table.CellRangeAddress
' グラフが存在しなければ描画する
If ThisComponent.Sheets(0).Charts.hasByName("datagraph") = False Then
' グラフ位置
Rect.X = 8000
Rect.Y = 1000
' グラフサイズ
Rect.Width = 10000
Rect.Height = 7000
' シートの範囲(配列の要素数を増やしてそれぞれ設定すると、離れた列のグラフが描ける)
RangeAddress(0).Sheet = 0
RangeAddress(0).StartColumn = 0
RangeAddress(0).StartRow = 0
RangeAddress(0).EndColumn = 2
RangeAddress(0).EndRow = N - 1
' 一つ目の False を True にすると、一行目を各系列名とするようになる。
' 二つ目の False を True にすると一列目が各系列名となるらしい
ThisComponent.Sheets(0).Charts.addNewByName("datagraph", Rect, RangeAddress(), False, False)
' ここでグラフをロックしておくと後の処理が高速
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.LockControllers
' 各系列の名前(凡例に用いられる)
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject().Data.setColumnDescriptions(Array("x","sin(x)","cos(x)")
' 散布図を選択
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram _
= ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.createInstance("com.sun.star.chart.XYDiagram")
' データポイントなし
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.SymbolType =-3 ' no points
' 一本目の系列(sin(x))を青にして太く
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.getDataRowProperties(1).LineColor = RGB(0,0,255)
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.getDataRowProperties(1).LineWidth = 50
' 二本目の系列(cos(x))を赤にして太く
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.getDataRowProperties(2).LineColor = RGB(255,0,0)
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.getDataRowProperties(2).LineWidth = 50
' x 軸のスケール設定
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.AutoMin = False
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.Min = 0
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.AutoMax = False
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.Max = 6.28
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.AutoStepMain = False
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.StepMain = 1.57
' x 軸のラベル設定
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.HasXAxisTitle = True
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxisTitle.String ="x"
' y 軸のラベル設定
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.HasYAxisTitle = True
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.YAxisTitle.String ="y"
' グラフタイトル設定
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.HasMainTitle = True
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Title.String ="y=sin(x) と y=cos(x) のグラフ"
' 凡例を下に
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.HasLegend = True
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Legend.Alignment = com.sun.star.chart.ChartLegendPosition.BOTTOM
' ロック解除
ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.UnLockControllers
End If
End Sub
|