- ベストアンサー
vba 自作関数
Function zei(myRng As Range) As Double Dim c As Range Dim goukei As Double 'Volatileについて 'シート内のどこかのセルを参照しているものとする 'シートのどこかに変更があったらそのセルが自動的に再計算される Application.Volatile goukei = Application.WorksheetFunction.Sum(myRng) zei = Int(goukei * 5 / 100) End Function これを標準モジュールに貼り付けてワークシート上で関数を呼び出し、 100を入れると#VALUE!が返るのですがどうしてでしょうか? 違う値を入れても必ず#VALUE!が返ります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
myRng を As Range と セル宣言していますね 例えば =zei(A1:A7) のようにセルを指定します 実数を用いるなら Function zei(myRng As Double) As Double zei = Int(myRng * 5 / 100) End Function
その他の回答 (4)
- chayamati
- ベストアンサー率41% (260/624)
関数はモジュールに定義します [開発]→[Visual Basixc]→[挿入]→[標準モジュール]→[Module1]
お礼
ありがとうございます。
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 最初に、一般的には、その内容では、「Volatile」は必要ないと思います。 Volatileを入れると、Calculateイベントが、局所的に走ればよいのですが、ワークシート全体に走ってしまいますので、ワークシートに関数が多くなると、それがうっとうしくなります。本来、ユーザー定義関数は、その中の引数だけを変えれば、「Volatile」をいれなくても、値は変わります。 >違う値を入れても必ず#VALUE!が返ります。 ご質問の#VALUEは、引数のデータ型が違うので、エラーが発生します。既に述べられているように、引数の部分は、Double型か、Variant型にすべきです。金額のように整数しか扱わないのなら、はじめから、Long型にしてもよいのですが、小数値が入ると、Long型で丸めが発生してしまいます。 実際には、出力が数値型の組み込み関数のほとんどは、引数はVariant型にし、出力もVariant型にしてあります。内部でエラー処理がなされています。 ちなみに、定数は、Constで、型の宣言と同じようにしてやりますし、消費税のような正負のある数値を入れる場合のInt関数は、絶対値にするというのが一般的です。ここにも切り捨てではなく、丸めが発生してしまいます。 以下のApplication.Sumとするのは、WorksheetFunction型ですと、エラー値を吐き出さないで、VBA自体を止めて(Halt)してしまうからです。なお、このユーザー定義関数は、エラー処理をする本格的な書き方にはなっていません。 '// Function Fzei(arg1 As Double) As Double Dim goukei As Double Dim sn As Integer Const TAX As Integer = 5 '消費税 goukei = Application.Sum(arg1) sn = Sgn(goukei) Fzei = sn * Int(Abs(goukei) * TAX / 100) End Function
お礼
ありがとうございます。
- bin-chan
- ベストアンサー率33% (1403/4213)
Application.Volatile 行にカーソル置いて、F9押下でブレークポイントを設定。 あとはF8押下で一行ずつ実行するので、変数にカーソル当ててデバッグですね。 先に単純な式だけのテストモジュール作ったほうが簡単かも。 Function myFunc(myRng As Range) As Double ''''Dim c As Range ’何のために宣言? myFunc = myRng End Function とか。
お礼
ありがとうございます。
- keithin
- ベストアンサー率66% (5278/7941)
>Function zei(myRng As Range) As Double 引数myRngにはセルを与えることにしているからです。 100はセル(オブジェクト)ではありません。 生数字「も」引数として与えたいなら function zei(myRng as variant) as double のようにして、何でも受け取れるように細工します。 #実際には function zei(myRng as double) as double のようにしてみると、生数字は当然受け取りますが、セル番地を与えても暗黙の返還でセルの値を読んで計算を続行してくれます。
お礼
ありがとうございます。
お礼
ありがとうございます。