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

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(OpenOffice Basic)現在選択しているセルの位置を得る

OpenOffice Basic(3.2)でユーザーが現在選択しているセル(カレントセル)の位置を得る方法です。

Dim oActiveCell As Object

'現在選択中のセルを取得

oActiveCell = ThisComponent.CurrentSelection

MsgBox "シート:" & oActiveCell.CellAddress.Sheet & _

" 列:" & oActiveCell.CellAddress.Column & _

" 行:" & oActiveCell.CellAddress.Row

また、CellAddressオブジェクトで、セルの位置(アドレス)を取得できます。

CellAddressについては、ここが参考になります。

ただし、上記の方法は、セルを一つだけ選択した場合に限ります。

複数のセル選択を取得する場合は、セルを複数選択したか一つだけ選択したかの切り分けが必要です。

その切り分け方法ですが、ThisComponent.CurrentSelection.ImplementationName で判断できるようです。

ImplementationName が ScCellObj の場合は、セル一つの場合、ScCellRangeObj の場合はセルレンジ(複数セルをドラッグ選択したとき)、ScCellRangesObj の場合はセルレンジが複数(Ctrlキーとかでの複数選択)となります。

一応サンプルを下記に載せます。

Dim oSheet as object

oSheet = ThisComponent.Sheets.getByName("Sheet1")

 

Dim oActiveCell As Object

oActiveCell = ThisComponent.CurrentSelection

 

'1セルの場合

If oActiveCell.ImplementationName = "ScCellObj" Then

oActiveCell.setString("セルひとつ")

 

'セルRangeひとつの場合

ElseIf oActiveCell.ImplementationName = "ScCellRangeObj" Then

For i = oActiveCell.RangeAddress.StartRow To oActiveCell.RangeAddress.EndRow

For j = oActiveCell.RangeAddress.StartColumn To oActiveCell.RangeAddress.EndColumn

oSheet.getCellByPosition( j , i ).setString("セルRangeひとつ")

Next j

Next i

 

'セルRangeが複数の場合

ElseIf oActiveCell.ImplementationName = "ScCellRangesObj" Then

For i = 0 To UBound(oActiveCell.RangeAddresses)

For j = oActiveCell.RangeAddresses(i).StartRow To oActiveCell.RangeAddresses(i).EndRow

For k = oActiveCell.RangeAddresses(i).StartColumn To oActiveCell.RangeAddresses(i).EndColumn

oSheet.getCellByPosition( k , j ).setString("セルRange複数")

Next k

Next j

Next i

 

'セル選択されていない時

Else

 

End If

上記は選択しているセルに一つずつアクセスして文字列をセットしている例です。

ScCellRangeObj や ScCellRangesObj オブジェクトのメンバには ScCellObj とほぼ同じようなメンバみたいです。

なので、フォントの設定やセルのプロパティの設定は一括してできます。

下記は選択されているセルの背景色を一気に変える例です。

Dim oSheet as object

oSheet = ThisComponent.Sheets.getByName("Sheet1")

 

Dim oActiveCell As Object

oActiveCell = ThisComponent.CurrentSelection

 

If oActiveCell.ImplementationName = "ScCellObj" Then

'1セルの場合

oActiveCell.CellBackColor = RGB(255,0,0)

ElseIf oActiveCell.ImplementationName = "ScCellRangeObj" Then

'セルRangeひとつの場合

oActiveCell.CellBackColor = RGB(255,0,0)

ElseIf oActiveCell.ImplementationName = "ScCellRangesObj" Then

'セルRangeが複数の場合

oActiveCell.CellBackColor = RGB(255,0,0)

Else

'セル選択されていない時

End If

ただ、セルに値をセットする時に、ScCellRangeObj と ScCellRangesObj は setDataArray 、setFormulaArray で配列で渡してあげないといけないようです。

この方法を使うと、かなり高速にセルに値をセットできます。詳しくは、セルアクセスの高速化として後ほど書きたいと思います。

参考:

選択したセル範囲のアドレスを表示する - OpenOffice.org Basic