シート関数の引数にCell オブジェクトを渡す方法

エクステンションの作成、共用ライブラリ
返信する
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

シート関数の引数にCell オブジェクトを渡す方法

投稿記事 by K.Tsunoda »

OOo.Calc にはCell オブジェクトをシート関数に渡す機能が実装されていないので
=UserFunc(A1:D5)
というような[A1:D5]のCell オブジェクトを受け取るユーザー定義関数を作成できません。

結論としては【 セル範囲文字列 】を作成して受け渡すしか方法はありません。
この場合、必須要件として以下の2つが不可欠です。
(1) そのセル範囲内の「値の変化、位置の変化」をトリガーとして
セル範囲を渡すユーザー定義関数に再計算を行なわせる事。
(2) 行/列/セルの挿入/削除/移動や、シートの名前/位置の変更
に連動して【セル範囲文字列】が変化する事。

以下の関数を用意しました(ダウンロードはブログ記事からできます)。
Range4SheetFunc (
TargetRange ; TargetTopRow ; TargetTopColumn ; TargetSheet )

TargetRange セル範囲 e.g. D4:H14
TargetTopRow セル範囲起点の行番号 e.g. ROW(D4)
TargetTopColumn セル範囲起点の列番号 e.g. COLUMN(D4)
TargetSheet セル範囲のシート番号 e.g. SHEET(D4)

(a) TargetRange によって『再計算』の実行が保障されます。
(b) TargetTopRow/TargetTopColumn/TargetSheet から『セル範囲文字列』が
作成されます(範囲はTargetRangeの配列サイズから求めます)。
(c) ユーザー定義関数では下記のようにして Cell オブジェクトに変換します。

コード: 全て選択

  vntSheetRange = Split(argRange, ".")   ' e.g. argRange = "Sheet1.F3:H5"
  oSheet = ThisComponent.Sheets.getByName(vntSheetRange(0))
  oRange = oSheet.getCellRangeByName(vntSheetRange(1))

利用例では以下のように使います。
=UserFunc(Range4SheetFunc ( A1:C10 ; ROW(A1) ; COLUMN(A1) ; SHEET(A1) ) )

もしくは、以下のように分けて記述することも可能です。値変化のみ(即ち、
セルアドレスの変化無し)の場合でも連動して再計算トリガーとして機能します。
[F1] =Range4SheetFunc ( A1:C10 ; ROW(A1) ; COLUMN(A1) ; SHEET(A1) )
=UserFunc( F1 )

『セル範囲オブジェクトを引数で受け取る』
http://blog.livedoor.jp/addinbox/archives/51212216.html


補足:
(起点セル行番号 ; 起点セル列番号 ; 終点セル行番号 ; 終点セル列番号 ; シート番号) という
指定方法も考えられますが、この場合、値変化による再計算トリガーとして働くのは起点/終点の
2セルに対してのみです。範囲内の他のセルの値変化には連動しませんので、この指定方法では駄目です。



AddinBox/VBAユーザーの為のOpenOffice.org 備忘録 『ユーザー定義関数の一覧
http://blog.livedoor.jp/addinbox/archives/51249421.html
返信する

“コードスニペット(便利な汎用コード)”に戻る