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 objectoSheet = 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 objectoSheet = 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 で配列で渡してあげないといけないようです。
この方法を使うと、かなり高速にセルに値をセットできます。詳しくは、セルアクセスの高速化として後ほど書きたいと思います。
参考: