Top > OOobbs2 > 93

OOobbs2/93 Edit

  • サマリ: functionのパラメータ個数を可変にしたい
  • 環境: Calc
  • 状態: 未解決
  • 投稿者: K-ichi?
  • 投稿日: 2008-02-17 (日) 14:02:53

質問 Edit

function のパラメータ個数を可変にできますか?
たとえば、与えられた「いくつかの」文字列パラメータをつなげて返す場合はどうすればいいんでしょう。

function test(t0 as string,t1 as string) as string
test = t0+t1
end function

これではパラメータを2つしか渡すことができません。
またセルに =test() などとすると、「引数はオプションでない」というエラーになります。function 内部で、 if isnull(t0) とかも試しましたが効果ありません。空なら空の文字列を返したいですよね。
function 行でパラメータの個数を固定しない書き方、 function 本体内でパラメータが与えられているかどうかの判定の方法、の2点について教えてください。


optional と ismissing の確認ができました。
ちょっと変に思ったのは、挙げられた作例を使って、表中で =test() としたときの挙動です。 optional ではない t0 まで省略されたわけですから、エラーになるはずですがなりません。 if ismissing 〜文を削って単純に test=t0 と返すとエラーは出ます。こちらが本来の動作かと思いますが。変ですよね?

また説明によれば、たとえば10個までのパラメータに対応するには、10個分の変数の記述が必要なようです。これら大量の変数を、省略されているかどうかなど確認するには、 for 〜 next などを使って処理したくなります。となると初めから配列にしておきたいのですが、パラメータに t(0) などは書けないようです。
パラメータに配列を使うことはできないんでしょうか。


遅くなりました。

当方のバージョン([ヘルプ]-[OpenOffice.org情報])は2.0とだけあります。
=test() では何も起こらず空欄のままです。後継バージョンでは直されたんでしょうね。
また、 if ismissing 文を省き単に test=t1&t2 としても、 t2 が省略された場合は t2="" 扱いになるようで、エラーは出ませんでした。

配列でパラメータを受けるのは別用途であって、希望する機能はないようですね。
配列に入れなおしたい場合は冗長なプログラムになるけど、仕方ないですね。

dim t(任意)

if ismissing(t0) then
  t(0)=空の時の処理
else
  t(0)=t0
end if
if ismissing(t1) then
  t(1)=空の時の処理
else
  t(1)=t1
  :
  :

cint(ismissing(変数)) で true=-1 、 false=0 になるようなので、そのへんを代入式に組み込める場合には、多少見通しは良くなる気もしました。

回答 Edit

  • Optional を利用します。

次のようにすると t1 は可変になります。

function test(t0 as string,Optional t1 as string) as string
  If IsMissing(t1) Then
    test = t0
  Else
    test = t0 & t1
  End If
end function

このとき次のように利用できます。

test("A")
test("A", "B")

しかし、宣言しない引数は利用できないので利用時に引数を自由に個数を変更するのは無理です。

また、Optional 宣言されている引数が与えられたかどうかは IsMissing 関数を使用します。

  • はにゃ?? 2008-02-17 (日) 16:51:55
  • >表中で

Calc のシート関数として利用するわけですか。

test を私の環境 WinXP, OOo 2.3.1 で =test() とすると「引数はオプションではありません」というエラーが正しく出ました。

>パラメータに配列を

セル範囲を引数として受け取ることはできますが、配列の指定は・・・できましたっけ?

範囲指定 "A1:B3" などが引数に指定されたときにはインデックスが 1 から始まる二次元配列を受け取ることになります。

  • はにゃ?? 2008-02-20 (水) 03:58:51

感想,コメント,メモ Edit



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