Top > OOobbs > 27

OOobbs/27

  • サマリ: ユーザー定義関数への引数としてセル(セルオブジェクト?)を渡すには?
  • 環境: Calc
  • 状態: 未解決
  • 投稿者: beat?
  • 投稿日: 2004-06-23 (水) 16:40:31

質問

ユーザー定義関数の引数へ、数値や文字列を渡す方法はわかりましたが、セル(セルオブジェクト?)を渡す方法がわかりません。

例えば、

Function Vol(L1, L2, L3)
  Dim iVol as Long
  iVol=L1*L2*L3
  Vol=iVol
End Function

の関数(helpより抜粋)をセルから =Vol(1;2;3) として、6が得られる事はわかりましたが、

=Vol(A1;A2;A3) のようにセルを渡して、関数内で

iVol=L1.Value*L2.Value*L3.Value

の様な感じで処理したいのです。

excelのvbaなら、

Function CellColor(セル)
  CellColor = セル.Interior.ColorIndex
End Function

こんな感じでセルの色番号が返ってくるのです。 #当面やりたいのはこちらの方です(^^;

当方、OOoはもとよりbasic自体初心者で、根本的な部分を見落としてる気がするのですが、どなたか教えてください。 よろしくお願いします。

回答

suouです。はにゃさんによく教えてもらっています。さて、セルL12,M13,N14にそれぞれ2,3,4を入力し、次のようなプログラムを書いて実行させたところ、"24"とMsgboxに正しく表示しました。これをもとにいろいろ試されたらいかがでしょうか。

Sub test()
   dim oSheet as object
   dim oA, oB, oC as object
   oSheet = StarDesktop.CurrentComponent.CurrentController.ActiveSheet
   oA=oSheet.getCellByPosition(11,11)
   oB=oSheet.getCellByPosition(12,12)
   oC=oSheet.getCellByPosition(13,13)
   a=Vol(oA,oB,oC)
   msgbox a
End Sub
Function Vol(ByVal L1 as object, ByVal L2 as object, ByVal L3 as object)
 Dim iVol as Long
 iVol=L1.Value*L2.Value*L3.Value
 Vol=iVol
End Function

はにゃ先生、こんな回答で理解のきっかけをつくれるでしょうか?

呼び出し側の問題なのかなぁ?

suouさん回答ありがとうございます。とりあえず、suouさんの方法を試すと
「おっいけてる」
では、セルから=Vol(L12;L13;L14)してみると
「BASICランタイムエラーオブジェクト変数は設定できていません」
となります。
デバッガの呼び出し(スタック?)をみると
0:Vol(L1=2,L2=3,L3=4)
となっていて、値が渡されているようです。とすると、セルに関数を書く時にもっと明示的にオブジェクトを渡しているような記述にしないといけないのでしょうか?

suouさんの教えで、関数には問題なさそうな事がわかりました。SUM(A1:A5)見たいな関数ってどういう実装になってるんでしょうね?(いや、basicでは無いとは思いますが・・・)

引き続き、情報募集中です。(^^; よろしくお願いします。

  • セルに関数を入力するとうまくいかないですね。

セルに入力するときのフォーマットを変更する必要がでてきますが,

Function eeVol(L1 As String, L2 As String, L3 As String) As Long
  Dim oL1 As Object, oL2 As Object, oL3 As Object
  Dim oDoc As Object, oSheet As Object
  Dim iVol as Long
    oDoc = ThisComponent
    oSheet = oDoc.CurrentController.ActiveSheet
    oL1 = oSheet.getCellRangeByName(CStr(L1))
    oL2 = oSheet.getCellRangeByName(L2)
    oL3 = oSheet.getCellRangeByName(L3)
    iVol = oL1.Value * oL2.Value * oL3.Value
    eeVol=iVol
End Function

としてみました。この関数を使うときには,次のような形式でセルに入力します。

=EEVOL("L12";"M12";"N12")

ここで,L12 などは "" でくくることで,文字列として渡されます。

定義した関数の中で,指定したセル範囲をオブジェクトとして取得してから処理に用います。

SUM(A1:A5)見たいな関数ってどういう実装になってるんでしょうね?

については,Calc のヘルプに載っていますが,「OpenOffice.org 用アドインをプログラミングする」のページです。Basic では使えそうにありません。

  • はにゃ?? 2004-06-24 (木) 01:38:20
  • はにゃ?さん回答ありがとうございます。 教えて頂いた方法は、理解できましたし実際そう言う動作になりました。あと、残された方法のアドインに挑戦か?と思いましたが、ヘルプに「インストール時に選択したらサンプルがインストールされるよ」みたいに記されているのに、インストールされませんでした。(;_;)
    なかなか思うように行きませんが、少しずつ精進しようと思います。
  • beat? 2004-06-24 (木) 11:10:47


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes