こちら
http://q.hatena.ne.jp/1260457053
で回答いただいたのですが、
実行すると、実行時エラー '13'
型が一致しません。
どこが間違っているのでしょうか?
Function test(s As String) As String
test = s
End Function
Sub test2()
MsgBox Application.Evaluate("test(""abc"")")
End Sub
Application.EvalutateはExcelの「=XXX()」で指定出来る関数の形式になります。
Excelのバージョンによっては、ここにユーザ定義関数が指定出来ますが、手元にある2003とかでは機能しない様です。
その事は既に前回質問時のコメントで書いておられますよね?
本当は違うコードで書いてるのでしょ?
あるいは、前回とは違う環境で試してみたところ動かないという事?
状況を書かないと正確な原因はつかめないと思うよ。
SALINGER さんの言う通り、同じ名前のファンクションが別の標準モジュールにありました。
当初、動いているように思い込んでいたのですが、思い通りにならなくなり、
コピーして試してみたらエラー発生していた、というわけです。
Application.Evaluate
は補完もされるし、エラーも出ないし、動いてないとは思いもしませんでした。
Booleanで利用していたせいもあって、早合点していたようです。
すみません。
皆さん、テストしていただいたようで、ありがとうございますm(_ _)m
Excel 2002 ではユーザ関数名、動的指定はできないんですね。
残念です(TT)
SALINGER さんからも2003と2007での動作確認はいただいてますし、
試しに古い2000(参照設定特にいじらず)で行ってみても、正常動作しましたから、
2002が出来ないってのは・・・?
>実際には自分のコードに応用して確認してました。
そのコードを抜き出して書き込んでみては?
kn1967さまの2000で成功 (検証ありがとうございますm(_ _)m
の一報を受けて、Excel再起動してマッサラ状態で実行してみました。
完璧できてます!
何が原因で、成功したりエラーになったりするのやら???
>そのコードを抜き出して書き込んでみては?
再現できるかわかりませんが、何かわかったら書き込みます。
引き続きありがとうございます!
これまた id:SALINGERさんが先にコメントしておられる事の繰り返しになりますが、
「他のオブジェクトと名前が重複してしまってる」って可能性が高そうなので、
関数名をまったく別のものに変えて試してみると良いかもしれません。
現状をご報告いたします。
新規ファイル => Book1.xls
自分の作業中ファイル => MY.xls
1. Excel起動
2. VBE開く
3. 標準モジュールを新規挿入し、質問にあるテストコードを貼り付け
4. test2()実行 => 成功(abc)
5. MY.xlsを開く
6. #4のtest2()再実行 => "型が一致しません"エラー
自分の作業中ファイルMY.xlsが問題と思ったのですが...
7. Excel終了、最初のファイル(Book1.xls)を保存( test2()が貼り付けられている )
8. Excel起動
9. MY.xlsを先に開く
10. Book1.xls を開く
11. test2() (#4, #6と同じプロシージャ) 実行 => 成功
MY.xlsが無い状態 => 成功
MY.xlsを後から開いた状態 => エラー発生
MY.xls先に開いておいた状態 => 成功
なぜ...orz
これってアクティブなブックの方の関数を読みに行ってるからだと思われます。
たぶん、MY.xlsには Sub test() とかの同名の関数がどっかにあって
MY.xlsが後から開いてアクティブだとそちらの関数を読みに行ってエラーを起こす。
ありきたりな名前にしたことが混乱させたもとだったようです。
>これってアクティブなブックの方の関数を読みに行ってるからだと思われます。
素晴らしいご賢察!!!
確かに前面ブックをBook1.xlsにした状態では成功します!
ところが、
Function test2140(s As String) As String
test2140 = s
End Function
Sub doTest2140()
MsgBox Application.Evaluate("test2140(""abc"")")
End Sub
型が一致しませんエラー発生です。
でも解決に近づいてる感じがします(^^;
もう少し検証してみます。
複数のブックが開いていて、同じ関数が複数のブックにある場合、普通に
MsgBox test("abc")
ならば同じモジュールの関数を読みに行くのですが、
MsgBox Application.Evaluate("test(""abc"")")
にすると、アクティブな方のブックの関数を読みに行くのですね。
それでアクティブな方のブックで数式を処理するために、ユーザー定義関数を指定すると
アクティブなブックのユーザー定義関数を呼び出すようですね。
更にここで不思議なことに、test関数にMsgboxを入れてみるとわかるのですが、2回呼び出しているようです。
色々と教えていただきありがとうございますm(_ _)m
不思議な動作があると困りますね(^^;
結局、エラーの原因つかめず、.Evaluate()の使用は断念しました。
皆さんありがとうございました。
Excel VBA 難しいですね。