スプレッドシートのセル内から呼び出されるカスタム関数があり、場合によっては何も返さないようにします。つまり、関数を含むセルを空のセルとまったく同じように処理する必要があります(関数が値を返さない場合)。
これを行うのに最も近いのは、空の文字列""
を返すことです。残念ながら、長さがゼロの文字列を持つセルは、COUNTA
またはCOUNTBLANK
によって空として扱われず、数式(1 + "" = #VALUE
など)を壊します。
何も返さないようにしようとすると、ほとんどの場合0が返されますが、これはユーザーによってまったく異なる方法で解釈されます。
私は何をすべきか?
これまでに試しました:
Returns 0:
result = null
result = VbEmpty
result = Range("SomeCellKnownToBeEmpty")
Returns error:
result = Nothing
回答:これは不可能であると合理的に確信しています。実行できる最善の方法は、これを回避することです。
オプションの回避策:
"-blank-"
を返し、VBAマクロで"-blank-"
のセルの内容を削除します。奇妙なアプローチですが、私のニーズに合っています。これは、ワークブックを公開する準備をする手順の1つとして行っています。""
を空白として扱います。あなたが抱えている問題は、UDFが常に値を提供することです。そのため、数式を含むセルがある場合、それを空白にすることはできません。またはあなたが望むものである空。
他の数式でゼロまたは空の文字列を処理するか、より大きなプロセスを完全にVBAに変換する必要があると思います。
詳細については、以下を参照してください。 http://Excel.tips.net/T002814_Returning_a_Blank_Value.html
編集:重複の可能性: Excelの数式から空のセルを返す
私が得ることができる最も近いものは、戻り値をVariantに設定し、nullを返すことです。
Function Blah() As Variant
Blah = Null
End Function
Sub Test()
Range("A1").Value = Blah()
End Sub
個人的には、これに反対することをお勧めします。これは非常に珍しいことであり、さらに問題を引き起こす可能性があります。
COUNT…関数ではありませんが、グラフ/グラフ/プロットのExcelで「ペンを持ち上げる」には、UDFがCVErr(xlErrNull)を返すようにします。
セル式がNA()を返すと、Excelが「ペンを持ち上げる」ので、これはかなり奇妙です。ただし、CVErr(xlErrNA)を返すUDFは、同じことを行いません。幸い、CVErr(xlErrNull)は機能します。
私も同じ問題を抱えていました。だから私がしたのは、ダミー変数を作成し、それを関数と等しく設定することでした。
いくつかの変数を取得してメッセージボックスに表示した関数で、値を返したくなかったので、次のようにしました。
x = myfunction(a、b)
それは完璧に機能しました。
次のようなエラーを返す必要があります。
Function retError()
' This function returns an error.
retError = CVErr(vbValue)
End Function
セル内では、#VALUE!
として表示されます。これには、スプレッドシート内の数式を伝播するという利点があります(ユーザーがエラーがあることを確認してください)が、COUNT
などの一部の関数ではカウントされません。 COUNTA
は引き続きこれらのセルをカウントすることに注意してください。