Excel VBA 【.Evaluate() => 型が一致しません 】実行時エラー 13


こちら
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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/12/18 16:45:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:mattn No.1

回答回数104ベストアンサー獲得回数23

ポイント60pt

Application.EvalutateはExcelの「=XXX()」で指定出来る関数の形式になります。

Excelのバージョンによっては、ここにユーザ定義関数が指定出来ますが、手元にある2003とかでは機能しない様です。

id:nannde

そうでしたか...

私の環境は Excel 2002 でした(TT)

ご指摘ありがとうございます!

2009/12/11 19:44:01
  • id:kn1967
    そのままのコードで動きますし、
    その事は既に前回質問時のコメントで書いておられますよね?

    本当は違うコードで書いてるのでしょ?
    あるいは、前回とは違う環境で試してみたところ動かないという事?

    状況を書かないと正確な原因はつかめないと思うよ。
  • id:SALINGER
    例えば、ユーザー定義関数名に既にあるワークシート関数名(sumとか)を使うとエラーが出ることがあります。
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 17:14:19
    いや、私の環境では同様のエラーで動作しないです。XL2007
  • id:SALINGER
    変ですね。私は2003と2007で動作しますが。
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 17:19:50
    解決しました。
    SALINGER さんの言う通り、同じ名前のファンクションが別の標準モジュールにありました。
  • id:nannde
    実際には自分のコードに応用して確認してました。

    当初、動いているように思い込んでいたのですが、思い通りにならなくなり、
    コピーして試してみたらエラー発生していた、というわけです。

    Application.Evaluate
    は補完もされるし、エラーも出ないし、動いてないとは思いもしませんでした。

    Booleanで利用していたせいもあって、早合点していたようです。
    すみません。

    皆さん、テストしていただいたようで、ありがとうございますm(_ _)m

    Excel 2002 ではユーザ関数名、動的指定はできないんですね。
    残念です(TT)



  • id:kn1967
    2002は使える環境がないのですが、mattn さんの回答は「?」ですね。

    SALINGER さんからも2003と2007での動作確認はいただいてますし、
    試しに古い2000(参照設定特にいじらず)で行ってみても、正常動作しましたから、
    2002が出来ないってのは・・・?


    >実際には自分のコードに応用して確認してました。

    そのコードを抜き出して書き込んでみては?
  • id:nannde
    できてます!!

    kn1967さまの2000で成功 (検証ありがとうございますm(_ _)m
    の一報を受けて、Excel再起動してマッサラ状態で実行してみました。

    完璧できてます!
    何が原因で、成功したりエラーになったりするのやら???

    >そのコードを抜き出して書き込んでみては?
    再現できるかわかりませんが、何かわかったら書き込みます。

    引き続きありがとうございます!
  • id:kn1967
    ということは・・・、
    これまた id:SALINGERさんが先にコメントしておられる事の繰り返しになりますが、
    「他のオブジェクトと名前が重複してしまってる」って可能性が高そうなので、
    関数名をまったく別のものに変えて試してみると良いかもしれません。
  • id:nannde
    ありがとうございます m(_ _)m

    現状をご報告いたします。

    新規ファイル => 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
  • id:SALINGER
    ブックを開く順番が関係するのかと一瞬思ったけど違いますね。
    これってアクティブなブックの方の関数を読みに行ってるからだと思われます。
    たぶん、MY.xlsには Sub test() とかの同名の関数がどっかにあって
    MY.xlsが後から開いてアクティブだとそちらの関数を読みに行ってエラーを起こす。
    ありきたりな名前にしたことが混乱させたもとだったようです。
  • id:nannde
    >ブックを開く順番が関係するのかと一瞬思ったけど違いますね。
    >これってアクティブなブックの方の関数を読みに行ってるからだと思われます。
    素晴らしいご賢察!!!

    確かに前面ブックをBook1.xlsにした状態では成功します!

    ところが、
    Function test2140(s As String) As String
    test2140 = s
    End Function

    Sub doTest2140()
    MsgBox Application.Evaluate("test2140(""abc"")")
    End Sub
    型が一致しませんエラー発生です。

    でも解決に近づいてる感じがします(^^;
    もう少し検証してみます。
  • id:SALINGER
    これは、私も知らなかったことでしたが、ちょっと興味深いです。
    複数のブックが開いていて、同じ関数が複数のブックにある場合、普通に
    MsgBox test("abc")
    ならば同じモジュールの関数を読みに行くのですが、
    MsgBox Application.Evaluate("test(""abc"")")
    にすると、アクティブな方のブックの関数を読みに行くのですね。
  • id:SALINGER
    Evaluateの動作なのですが、これはVBAでワークシートのように数式を評価する関数です。
    それでアクティブな方のブックで数式を処理するために、ユーザー定義関数を指定すると
    アクティブなブックのユーザー定義関数を呼び出すようですね。
    更にここで不思議なことに、test関数にMsgboxを入れてみるとわかるのですが、2回呼び出しているようです。
  • id:nannde
    SALINGERさま
    色々と教えていただきありがとうございますm(_ _)m
    不思議な動作があると困りますね(^^;
    結局、エラーの原因つかめず、.Evaluate()の使用は断念しました。
    皆さんありがとうございました。
    Excel VBA 難しいですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません