とりあえず、途中経過の報告です。
ユーザー定義関数「eval」は、他の人が作成したコードのため
記述内容や動作結果がよくわかりませんでした。
とりあえず、2つ目の引数を削除するか、2つ目の引数に「Optinal」を
追記することで正しく計算されるようになりました。
///////////////////////////////////////////////////////////////////////////////////////////
ユーザー定義関数「eval」
///////////////////////////////////////////////////////////////////////////////////////////
Function eval(cl, n%)
Dim e$, eq$, i%, ro%, co%, c$
eval = ""
e = cl.Text
If Len(e$) < 1 Then Exit Function
eq = ""
For i = 1 To Len(e$)
c = Mid$(e, i, 1)
Select Case c
Case "+": c = "+"
Case "−": c = "-"
Case "×": c = "*"
Case "÷": c = "/"
Case "π": c = "pi()"
Case "√": c = "sqrt"
Case "Σ": c = "sum"
Case "(": c = "("
Case ")": c = ")"
Case "{": c = "("
Case "}": c = ")"
Case "{": c = "("
Case "}": c = ")"
Case "m": c = ""
Case "k": c = ""
Case "g": c = ""
End Select
If LenB(StrConv(c, vbFromUnicode)) = 2 Then
c = ""
End If
eq = eq & c
Next i
eval = Application.WorksheetFunction.Round(Evaluate(eq$), n%)
End Function
///////////////////////////////////////////////////////////////////////////////////////////
ユーザー定義関数「eval」には引数が2つ必要ですが、コード内では2つ目の引数について
なんら処理はされていません。
とりあえず、Excelファイル「B.xlsm」側で、標準モジュールで「eval」の2つ目の引数を
削除したところ計算されるようになりました。
すると、Excelファイル「A.xlsm」側でユーザー定義関数「eval」の計算結果が「#VALUE!」と
表示されるようになりました。
ユーザー定義関数「eval」の2つ目の引数に「Optional」を付けて省略可能にすると
正しく計算されるようになりました。
///////////////////////////////////////////////////////////////////////////////////////////
作業結果から、質問の内容を以下にまとめました。
後学のためにご教示頂けないでしょうか。
Q1 今までExcelファイル「A.xlsm」側ではユーザー定義関数「eval」に対して
2つ目の引数を入力しなくてもエラーになりませんでした。
引数を省略可能にするには「Optional」を記述する必要があると思いますが、
なぜ「A.xlsm」ではエラーにならず、「B.xlsm」ではエラーになるのでしょうか。
Q2 「B.xlsm」の標準モジュールで2つ目の引数を削除すると「A.xlsm」側で
ユーザー定義関数「eval」がエラーにかわるのはなぜでしょうか。
「A.xlsm」の標準モジュールでは2つ目の引数はそのままなのでエラーに
あるのが正しいのですが、今までエラーにならなかったのに突然エラーに
なる理由が分かりません。
Q3 ユーザー定義関数「eval」は他人が作成したので記述ルールや仕様が
よく分かりません。
引数「n%」や変数「e$」、「eq$」、「i%」、「ro%」、「co%」、「c$」など、
「%」や「$」は何を意味しているのでしょうか。
Q4 Q3に関係しますが、変数の宣言時に「$」を付けるのに、コード内では
省略できるのはなぜでしょうか。