OpenOffice.org BasicとVisual Basicの文法はほぼ同じですが、OpenOffice.org BasicとVBAで使われるオブジェクト名はかなり異なります。

すべてのオブジェクトは Dbg_Properties と Dbg_Methods という2つのプロパティを持っています。Dbg_Properties プロパティには、そのオブジェクトが持つプロパティの一覧が文字列で格納されています。Dbg_Methods プロパティは、そのオブジェクトが持つメソッドの一覧が文字列で格納されています。

OpenOffice.org Calc で使用できるオブジェクトを次に示します。

シート・オブジェクト

ひとつの表(テーブルシート)はScTableSheetObjオブジェクトで表される。次の構文で特定のScTableSheetObjオブジェクトへの参照を得ることができる。

DocumentObject.CurrentController.ActiveSheet
DocumentObject.Sheets.getByIndex(シート番号)
DocumentObject.Sheets.getByName("シート名")
DocumentObject.Sheets(シート番号)

DocumentObject.CurrentController.ActiveSheetは、現在アクティブなシートのオブジェクトを表します。

DocumentObject.Sheets.getByIndex()DocumentObject.Sheets() は番号で指定したシートのオブジェクトを表します。ただし、VBAとは以下の点で異なります。

DocumentObject .Sheets.getByName() は名前で指定したシートのオブジェクトを表します。

シート・オブジェクトをObject型の変数に代入する例を次に示します。

Dim oDoc As Object
Dim oSheet As Object

oDoc = ThisComponent
oSheet = oDoc.Sheets(0)

上記の例では、各オブジェクトを変数に代入しましたが、オブジェクトをいちいち変数に代入しなくても構いません。

Dim oSheet As Object

oSheet = ThisComponent.Sheets(0)

セル・オブジェクト

単一のセルを表すセル・オブジェクトは次の構文で表されます。

SheetObject.getCellRangeByName("セル名")
SheetObject.getCellByPosition(列番号 ,行番号)

SheetObject .getCellRangeByName() は、名前("A1"など)で指定したセルのオブジェクトを表します。

SheetObject .getCellByPosition() は、列番号と行番号で指定したセルのオブジェクトを表します。ただし、VBAとは以下の点で異なります。

A1、A2のように、表計算ソフトでは列番号は1から始まるのが自然です。ちょっとした違いですが、OpenOffice.org BasicのマクロがVBAより分かりづらくなる原因のひとつです。

セル・オブジェクトをObject型の変数に代入する例を次に示します。

Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object

oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oCell = oSheet.getCellByPosition(0, 0)

セルの値を参照するには、セル・オブジェクトの Value プロパティを使用します。

CellObject .Value

セルに値を代入するには、次に示す2種類の方法があります。

OpenOffice.org Basicでセルに値を代入する例を次に示します。

Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object

oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oCell = oSheet.getCellByPosition(0, 0)
oCell.Value = 123

上記の例では、各オブジェクトを変数に代入しましたが、オブジェクトをいちいち変数に代入しなくても構いません。

ThisComponent.Sheets(0).getCellByPosition(0, 0).Value = 123

セル・オブジェクトの Value プロパティに代入できるのは値だけです。たとえば、123という数値を代入したい場合は、次のようになります。

oCell.Value = 123

また、値を文字列で表現したものを String プロパティに代入することによって、値を代入することもできます。

oCell.String = "123"

数式を設定するには、セル・オブジェクトのFormulaプロパティに設定します。

セルの値の読み書きを高速化する

OpenOffice.org BasicからOpenOffice.org Calcのセルの値を読み書きする速度は遅く、Microsoft Excel + VBA と比較しても明らかに劣っている。これを高速化するために、複数のセルから配列に値を読み込んだり、配列から複数のセルに値を書き込むことができる。

複数のセルから配列に値を読み込むにはScCellRangeObjオブジェクトのgetDataArrayメソッドを使用する。配列から複数のセルに値を書き込むにはScCellRangeObjオブジェクトの setDataArrayメソッドを使用する。

セル・オブジェクトのメソッドはScCellObj参照。

Rangeオブジェクト

複数のセルをひとまとめにして表すRangeオブジェクトは、次の構文で表されます。

SheetObject.getCellRangeByName("Range名")
SheetObject.getCellRangePositon(起点列番号, 起点行番号, 終点列番号, 終点行番号)

Selectionオブジェクト

現在選択されている範囲を表すSelectionオブジェクトは、次の構文で表されます。

ThisComponent.CurrentSelection

Selection オブジェクトの使用例を次に示します。

Dim oSelect As Object

oSelect = ThisComponent.CurrentSelection

マクロでグラフを作成する

マクロでグラフを作成する例を次に示します。

Dim Sheet As Object
Dim Rect As New com.sun.star.awt.Rectangle
Dim RangeAddress(0) As New com.sun.star.table.CellRangeAddress

Sheet = ThisComponent.Sheets.getByName("表1")

Rect.X = 8000
Rect.Y = 1000
Rect.Width = 10000
Rect.Height = 7000

RangeAddress(0).Sheet = Sheet.RangeAddress.Sheet
RangeAddress(0).StartColumn = 0
RangeAddress(0).StartRow = 0
RangeAddress(0).EndColumn = 5
RangeAddress(0).EndRow = 11

Sheet.Charts.addNewByName("MyChart", Rect, RangeAddress(), True, True)

com.sun.star.awt.Rectangleは、矩形領域を表すオブジェクトです。com.sun.star.awt.Rectangleオブジェクトを使って、グラフを描画する領域の位置とサイズを指定します。

RangeAddressオブジェクトはグラフの元となるデータ範囲を表します。

RangeAddressオブジェクトのプロパティ
名前 種類 意味
Sheet Integer シート番号(0〜)
StartColumn Long 開始列番号(0〜)
StartRow Long 開始行番号(0〜)
EndColumn Long 終了列番号
EndRow Long 終了行番号

グラフの元となるデータ列がすべて連続している場合は、RengeAddress配列の要素数は1となります。グラフの元となるデータ列が連続していない場合は、RengeAddress配列の要素数を増やします。

たとえば、グラフの元となるデータ列が列番号0と列番号2〜4の場合は、次のようにします。

Dim RangeAddress(1) As New com.sun.star.table.CellRangeAddress

RangeAddress(0).Sheet = 0
RangeAddress(0).StartColumn = 0
RangeAddress(0).StartRow = 0
RangeAddress(0).EndColumn = 0
RangeAddress(0).EndRow = 100

RangeAddress(1).Sheet = 0
RangeAddress(1).StartColumn = 2
RangeAddress(1).StartRow = 0
RangeAddress(1).EndColumn = 4
RangeAddress(1).EndRow = 100

新たにグラフを追加するには、ScChartsObjaddNewByNameメソッドを使用します。

Chartオブジェクトのメソッドやプロパティについては com.sun.star.comp.chart2.ChartModel 参照。

グラフを作成すると、デフォルトで棒グラフになります。グラフの種類を変更するには、createInstanceメソッドを使用する。グラフの種類を次に示します。

列(棒グラフ)には標準、積み上げ、積み上げパーセントなどの種類があります。

棒グラフ

扇には標準、分解円グラフ、ドーナツ、分解ドーナツグラフなどの種類があります。

扇

データ系列の並び順に反時計回りに配置される。

Microsoft ExcelやIBM Lotus Symphonyの円グラフでは、データ系列の並び順に時計回りに配置される。

表面には標準、積み上げ、積み上げパーセントなどの種類があります。

表面

線には点のみ、点および線、線のみ、3Dの線などの種類があります。

線

散布図には点のみ、点および線、線のみ、3Dの線などの種類があります。

散布図

レーダー網には点のみ、点および線、線のみなどの種類があります。

レーダー網

グラフの作成を早くするには、描画の更新を一時停止させます。lockControllersメソッドで一時停止、unlockControllersメソッドで再開する。

マクロで株価チャートを作成する

OpenOffice.org Calcの株価チャートには次の4種類があります。

株価チャートの種類
グラフの種類 説明
株価チャート1 バーチャート
株価チャート2 ローソク足
株価チャート3 バーチャートと出来高
株価チャート4 ローソク足と出来高

それぞれの株価チャートのイメージを次に示します。

株価チャート

バーチャートは高値・安値・終値の3つの値からなる株価チャートで、おもに欧米で使用されている。

ローソク足は始値・高値・安値・終値の4つの値からなる株価チャートで、おもに日本で使用されている。

また、これらに加えて出来高(取引数量)を表示させることもできる。出来高は棒グラフで表示される。

データ系列の並びに注意してください。普通、株価の4本値を表す場合は、一般的に「(始値、)高値、安値、終値」という並びになります。しかし、OpenOffice.org Calcで株価チャートを作成するには、データ系列の並びを「(始値、)安値、高値、終値」にしなければなりません。

Microsoft Excelの株価チャートの場合、データ系列の並びは(始値、)高値、安値、終値となっています。

株価チャートはデフォルトで株価チャート1になっています。他の種類に変更するには、Chart.DiagramオブジェクトのVolumeプロパティおよびUpDownプロパティを設定します。

株価チャートの種類とプロパティの設定、データ系列の関係をまとめると、次のようになります。

種類 プロパティ データ系列
Volume UpDown 列1 列2 列3 列4 列5
株価チャート1 False False 安値 高値 終値
株価チャート2 False True 始値 安値 高値 終値
株価チャート3 True False 出来高 安値 高値 終値
株価チャート4 True True 出来高 始値 安値 高値 終値

ただし、最初の列を項目名に引用する場合、データ系列1は項目名(日付や銘柄)になります。この場合、上記のデータ系列はひとつづつずれます。

出来高が含まれる株価チャートの場合、第1Y軸 (Chart.Diagram.YAxis) が出来高、第2Y軸 (Chart.Diagram.SecondaryYAxis) が4本値になります。

Microsoft Excelの株価チャートの場合、取引高を棒グラフではなく折れ線グラフなどに変更することができます。しかし、OpenOffice.org Calcの場合は変更できないようです。折れ線グラフに変更できれば、取引高の代わりに移動平均線を表示できて便利なのですが…。

ローソク足の上ヒゲおよび下ヒゲはデフォルトの色(例えば、データ系列1ならば青)で表示される。色を変えたい場合は変更する。

株価チャートを作成する例を次に示す。

Chart = Charts.getByName("MyChart").embeddedObject
' 株価チャートの作成
Chart.Diagram = Chart.createInstance("com.sun.star.chart.StockDiagram")
' ローソク足
Chart.Diagram.UpDown = True
' 出来高を表示しない
Chart.Diagram.Volume = False
' 陰線の周囲の色を黒に変える
Chart.Diagram.DownBar.LineColor = RGB(0, 0, 0)
' ヒゲの色を黒に変える
Chart.Diagram.MinMaxLine.LineColor = RGB(0, 0, 0)
このエントリーをはてなブックマークに追加