3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(OpenOffice Basic)Calcでセルの取得と値の取得・設定

まず、セルを取得(アクセス)する方法です。

VBAだと下記のようになります。

'単一セルをセル名にて指定するにはこうなります。

Dim oCell As Object

Cell = ThisComponent.Sheets("Sheet1").getCellRangeByName("C1")

 

'複数セルをセル名で指定するにはこうなります。

Dim oRange0 As Object

oRange0 = ThisComponent.Sheets(0).getCellRangeByName("A3:C5")

 

'セルレンジ(セル範囲)をインデックスにて選択する場合はこうなります。(0からの絶対値になります)

Dim oRange1 As Object

oRange1 = ThisComponent.Sheets(0).getCellRangeByPosition(0,2,2,4) 'A3:C5を選択

'↑で取得したセル範囲にアクセスするには下記のようにします。

MsgBox oRange1.getCellByPosition(0,0).getString 'A3のセル値を表示

MsgBox oRange1.getCellByPosition(1,0).getString 'B3のセル値を表示

MsgBox oRange1.getCellByPosition(2,0).getString 'C3のセル値を表示

MsgBox oRange1.getCellByPosition(0,1).getString 'A4のセル値を表示

MsgBox oRange1.getCellByPosition(1,1).getString 'B4のセル値を表示

MsgBox oRange1.getCellByPosition(2,1).getString 'C4のセル値を表示

MsgBox oRange1.getCellByPosition(0,2).getString 'A5のセル値を表示

MsgBox oRange1.getCellByPosition(1,2).getString 'B5のセル値を表示

MsgBox oRange1.getCellByPosition(2,2).getString 'C5のセル値を表示

参考:

取得した範囲内のセルにアクセスする - OpenOffice.org Basic

OOoBasic/Calc/cell

また、セル範囲の一行を配列として取得するには、ScCellRangeObjオブジェクトのgetDataArrayメソッドを使えばいいようです。

こんな感じです。

Dim Sheet As Object

Dim DataArray()

Dim RowDataArray()

 

Sheet = ThisComponent.Sheets(0)

DataArray() = Sheet.getCellRangeByPosition(0, 0, 1, 1).getDataArray()

 

RowDataArray() = DataArray(0)

' RowDataArray(0) = Sheet.getCellByPosition(0, 0).Value(1行1列目)

' RowDataArray(1) = Sheet.getCellByPosition(1, 0).Value(1行2列目)

 

RowDataArray() = DataArray(1)

' RowDataArray(0) = Sheet.getCellByPosition(0, 1).Value(2行1列目)

' RowDataArray(1) = Sheet.getCellByPosition(1, 1).Value(2行2列目)

参考:

ScCellRangeObj - OpenOffice.org リファレンス ScCellRangeObj.getDataArray メソッドの解説。

ちなみに、セルの値、文字列、数式を取得するには、下記のメソッドを使えます。

ScCellObj.getValue 値(DOUBLE型)を取得

ScCellObj.getString 表示文字列(String型)を取得

ScCellObj.getFormula 数式(String型)を取得

セルに値、文字列、数式をセットするには、setValue , setString , setFormula が使えます。

参考:

セルにデータを入力する - OpenOffice.org Basic

追記:------------------------------------

複数のセルを選択して、それらに一気に値を入れるには setDataArray メソッドを使います。((OpenOffice Basic)Calcでセルアクセスの高速化でもちょこっと書いてます)

例えば、A1:B3 の範囲で以下のような値を入れようとするには、以下のコードのようにします。

| A |

1|100|

2|101|

3|102|

Dim oSheet As Object

'シート選択

oSheet = ThisComponent.Sheets(1)

 

'データを入れるための配列作成

Dim aryData(2)

Dim i As Integer

For i = 0 To Ubound( aryData )

aryData(i) = Array( 100 + i )

Next i

'セル範囲に配列化されたデータ挿入。

oSheet.getCellRangeByName("A1:A3").setDataArray(aryData)

例えば、A1:B3 の範囲で以下のような値を入れようとするには、以下のコードのようにします。

入れたい値:

| A | B |

1|100|200|

2|101|201|

3|102|202|

Dim oSheet As Object

'シート選択

oSheet = ThisComponent.Sheets(1)

 

'データを入れるための配列作成

Dim aryData(2)

Dim i As Integer

For i = 0 To Ubound( aryData )

aryData(i) = Array( 100 + i , 200 + i)

Next i

'セル範囲に配列化されたデータ挿入。

oSheet.getCellRangeByName("A1:B3").setDataArray(aryData)

コードを見てわかるように、挿入するデータのは行単位と、列単位にそれぞれ配列(ジャグ配列つまり配列の配列)が必要になるということですね。

セル範囲の行列数と、配列の要素数が異なると、「BASICランタイムエラー 例外が発生しました。Type: com.sun,star.uno.RuntimeException Message:。」というエラーになります。

このあたりは注意が必要ですね。

また、セルの値や書式を削除するには、clearContents メソッドを使います。

引数に、クリアする内容をフラグで指定します。フラグに意味は以下のような感じ。

値 :フラグ :説明

1 :VALUE :日付や時刻として書式設定されていない数値

2 :DATETIME :日付や時刻として書式設定されている数値

4 :STRING :文字列

8 :ANNOTATION :セルに付けられたコメント

16 :FORMULA :計算式

32 :HARDATTR :セルに直接指定された書式

64 :STYLES :間接的に指定された書式

128:OBJECT :セルに配置された描画オブジェクト

256:EDITATTR :セル内の一部のテキストに対してのみ指定された書式

例えば、数値と文字列、計算式を削除するには以下のようにします。

Dim oCell As Object

'シート選択

oSheet = ThisComponent.Sheets(1)

'数値と文字列、計算式削除

oSheet.getCellRangeByName("A1:B2").clearContents(1+2+4+16)

すべての内容をクリアするにはフラグの値を全て加算した 511 を指定します。

参考:

ScCellRangeObj - OpenOffice.org リファレンス