VBAのEvaluate()関数でInStr()を処理したい方法は?

このQ&Aのポイント
  • VBAのEvaluate()関数を使用して、テキスト化された数式を処理するプログラムを作成しています。しかし、Mid()やLen()関数では正しく処理結果が得られる一方、InStr()関数では-2146826259というエラーコードが返されます。この問題を解決する方法について教えてください。
  • InStr()関数をEvaluate()関数で使うことはできませんが、同様の処理を実現する方法があります。InStr()関数に代わる処理方法について教えてください。
  • テキスト化されたVBAの数式をInStr()関数で処理するためには、Evaluate()関数ではなく別の手法を使用する必要があります。具体的な方法について教えてください。
回答を見る
  • ベストアンサー

Evaluate()でInStr()を処理したい

  Evaluate()関数を使ってテキスト化されたVBAの数式を処理するプログラムをVB.NETで作成しているのですが、Mid()関数やLen()関数では正しく処理結果が得られるのですが、InStr()関数では-2146826259が返されてうまく処理させることができませんがどうしてなのでしょうか。 もし、InStr()関数がEvaluate()関数で使えないのであれば、Evaluate()関数を使ってInStr()関数と同じような処理をさせたいのですが何かよい方法がありましたら教えてください。できましたらワークシート関数ではなくVBA関数でお願いします。 なお、term02の部分は外部のテキストファイルから読み込んでいますので、プログラム作成時には数式の内容は未定です。よろしくお願いします。 Dim term01 As String Dim term02 As String term02 = "Mid(""ABCDE"",1,2)" term01 = xlApp.Evaluate(term02) MsgBox(term01) 'OK! AB term02 = "InStr(1,""ABCDE"",""D"")" term01 = xlApp.Evaluate(term02) MsgBox(term01) 'NG! -2146826259 term02 = "Application.WorksheetFunction.Find(""D"",""ABCDE"")" term01 = xlApp.Evaluate(term02) MsgBox(term01) 'NG! -2146826259  

質問者が選んだベストアンサー

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

Evaluateが使えるのはワークシート関数だけのようです。 Findはワークシート関数ですが、Application.WorksheetFunction.を付けるとVBA関数になってしまいます。 term02 = "Find(""D"",""ABCDE"")" でうまくいきませんか?

yam2012
質問者

お礼

いろいろ勘違いしていましたがうまくいきました。 ありがとうございました。 【追記】 おそらくこの質問を見られた方が、 Mid()には付いていないのになぜFind()にだけわざわざ Application.WorksheetFunction.を付けて確認されたのだろうと 疑問に思われるように感じましたので 今回教えていただいてわかったことをまとめて補足しておきます。 ・Evaluate()関数はワークシート関数は使えるがVBA関数は使えない。 ・VBA関数のMid()関数やLen()関数がEvaluate()関数で  正しく処理できていたのは、  ワークシート関数にもMid()関数やLen()関数があり、  ワークシート関数のMid()関数やLen()関数として  処理されていたためである。 ・VBA関数のInStr()関数がEvaluate()関数で正しく処理されなかったのは  ワークシート関数にはInStr()関数がないため  VBA関数として処理しようとしたためである。 ・InStr()関数とよく似た関数として  ワークシート関数のFind()関数があったので  Find()関数をEvaluate()関数で処理しようとしたところエラーが出た。 (今から考えると何らかの記述ミスをしていた可能性があり   正しく記述していればこのとき正しく処理されていたと思われる) それて、この原因を調べていたら、  VBAからワークシート関数を呼び出す時には  頭にApplication.WorksheetFunction.を付ける必要があることを  思い出して付けてみたが解決しなかった。 ・この原因は、ワークシート関数であるFind()関数に  Application.WorksheetFunction.を付けるとVBA関数になるので、  Evaluate()関数で正しく処理されなくなっていた。

関連するQ&A

  • Evaluate()に数式を代入した変数を渡すには

      VB.NETでEvaluate()関数を使って、プログラム実行中に決まる数式を評価させたいのですが、(1)のように数式をリテラルのまま渡せば正しく評価されるのですが、(2)のように数式を変数に代入して渡すとうまくいきません。数式の構造自体がプログラムの実行中に決まるので、数式を代入した変数を引数として渡す必要がありますが、このような場合、どのようにすればよいのでしょうか。 (1) 引き渡す数式がリテラルの場合 Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim x As Integer   x = 1   MsgBox(xlApp.Evaluate(x = 1)) '期待 True  実際 True  結果 OK   MsgBox(xlApp.Evaluate(x <> 1)) '期待 False  実際 False  結果 OK  End Sub End Module (2) 引き渡す数式が代入された変数の場合 Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim x As Integer   Dim term1 As String   Dim term2 As String   x = 1   term1 = "x = 1"   term2 = "x <> 1"   MsgBox(xlApp.Evaluate(term1)) '期待 True  実際 -2146826259 結果 NG   MsgBox(xlApp.Evaluate(term2)) '期待 False  実際 -2146826259 結果 NG  End Sub End Module よろしくお願いします(WindowsXP,VS2010)

  • Evaluate()に文字列の形式の数式を渡すには

    VB.NETでEvaluate()関数を使って、プログラム実行中に決まる数式を評価させたいのですが、下記の(A)のように数式を" "で囲まない形で渡せば正しく評価されるのですが、(B)のように数式が文字列の形になっていると、このまま、文字列を渡してもうまくいきません。(B)のような形になってしまっている数式をEvaluate()関数で評価させるためには、(B)から(A)の形に持っていきたいのですが、どのようにすればよいのかがよく分かりません。 数式の構造自体がプログラムの実行中に文字列の形で処理させて生成されるのですが、このように文字列の形になっている数式を、Evaluate()関数で評価させるためには、どのようにすればよいのでしょうか。 ---------------------------------------- Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim i1 As Integer   Dim i2 As Integer   Dim term_i As String   Dim ans_i As Integer   i1 = 2   i2 = 3   term_i = i1 + i2 + 5 ' (A)   term_i = "i1 + i2 + 5" ' (B)   ans_i = xlApp.Evaluate(term_i)   MsgBox(ans_i)  End Sub End Module ---------------------------------------- よろしくお願いします。(WindowsXP,VB2010)

  • VB.NETでExcelの数式バーの処理をさせたい

    Excelのセルにいろいろな数式が入っていて、 この数式を書き出したテキストファイルを読み込ませて、 VB.NETで処理をしたいのですが、 VB.NETで、Excelの文字列関数を含んだ式を処理するには どのように記述すればよいでしょうか。 単なる計算式であれば  Dim xlApp As New Excel.Application  Dim str1 As String  Dim x As Integer  a = "3600 / 60 + 5000"  x = xlApp.Evaluate(a) でできるのですが文字列だとうまくいきません。 例えば、ExcelのシートのA1セルを選択して 数式バーに =MID("ABCDE",2,3) と入力すると その結果のBCDがA1セルに得られますが VB.NETで、 =MID("ABCDE",2,3) から BCD を得るにはどのようにすればよいでしょうか。 なお、=MID("ABCDE",2,3) の式は一例であって、 以下のように、この式をVB.NETで記述する 仕方を知りたいのではありません。  Dim str1, str2 As String  str1 = "ABCDE"  str2 = str1.Substring(2, 3) よろしくお願いします。 (VisualStudio2010 , Excel2003 , WindowsXP SP3)

  • VBA Evaluate関数 型が一致しません

    Excel2003 VBAのEvaluateで以下の数式を実行すると エラー「型が一致しません」となってしまいます。 類似の質問を検索していろいろ参考にしてみたのですが 解決できなかったので質問させてください。 Sub test() Dim aa, bb, cc As String Dim y As Byte y = 1 With Sheets("Sheet1") aa = ".Cells(y, 1) > 0" bb = Left(aa, InStr(aa, "y") - 1) cc = Mid(aa, InStr(aa, "y") + 1) If Evaluate(bb & y & cc) Then ←ここでエラーになります。 y = 2 End If End With End Sub .Cells(1, 1)には10が入力されています。 宜しくお願い致します。

  • InStr関数を使う際は

    エクセルvbaなのですが、InStr関数を使う際は、どの比較モードを使えばいいのでしょうか? Sub あ() Dim myStr As String myStr = "あいうえお" Debug.Print InStr(1, myStr, "い", vbBinaryCompare) Debug.Print InStr(1, myStr, "い", vbTextCompare) Debug.Print InStr(1, myStr, "い", vbUseCompareOption) 'エラーになる Debug.Print InStr(1, myStr, "い", vbDatabaseCompare) 'エラーになる End Sub vbBinaryCompareとvbTextCompareならエラーになりませんが この二つの違いが判りません。

  • vbaの繰り返し処理について

    vbaです。 Sub Test1() Dim Str As String Dim Pnt1 As Long Dim Pnt2 As Long Str = Range("A1") Pnt1 = InStr(Str, "重 http://") If Pnt1 <= 0 Then Exit Sub Pnt2 = InStr(Pnt1, Str, "要") If Pnt2 <= 0 Then Range("B1") = Mid(Str, Pnt1 + 2) Else Range("B1") = Mid(Str, Pnt1 + 2, Pnt2 - (Pnt1 + 2)) End If End Sub という式でA1からA2.A3と下にURLが入っており空欄になるまで同じ処理をしたいのですがどのように変更すれば作動しますでしょうか?

  • 数式 VBA

    VBA勉強中のものです。 以下のコードを表示したいのですが「型が一致しません」と出てしまいます。 Sub TEST() Dim 列 As String, 列2 As String 列 = "B" 列2 = 列 & ":" & 列 MsgBox Evaluate("COUNTIF(列2,2)") 数式の表示の仕方がわかりません。 ややこくしてすいません。 よろしくお願い致します。

  • Evaluateを[ ]で代用するときの範囲指定

    質問を見ていただき、ありがとうございます。 VBAで、Evaluateを[ ]で代用して計算を行っています。 たとえばA1からA3のセルに数値が入っているとき、 A1からA3までの合計をメッセージボックスに出したければ ワークシート関数を利用して、以下のように書けます。 Sub Sum1() Dim Ans Ans = [SUM(A1:A3)] Call MsgBox(Ans) End Sub このとき、もし範囲を変数で指定したいならば どのように書けばよいのかが解らず、困っております。 たとえば、[ ]を使わずにEvaluateを使うのであれば 以下のようにできるのですが、あまり美しくない気がします。 Sub Sum2() Dim Ans, R R = "A1:A3" Ans = Evaluate("sum(" & R & ")") Call MsgBox(Ans) End Sub どなたか、ぜひ良い方法をご教授ください。

  • VBAのEvaluate()をVBで記述するには

    ExcelVBAで書かれているプログラムをVB(VisualBasic)に書き直していますが、 VBAのコードの中で、別ファイルから任意の数式(例えば「=3600/60+5000」など)を読み込んで、Evaluate()という関数でこの演算結果を取得している部分があるのですが、VBAのEvaluate()の部分をVBで記述することは可能でしょうか。 よろしくお願いします。

  • VBA InStrがうまくできない

    ソースを見ると <div class="hd"> と言うタグは有るのに VBAで Sub test() Dim objIE As Object Dim myObj As Object Dim str電話番号 As String Dim strHTML As Variant Dim intstart As Variant str電話番号 = "03-58**-58**" Set objIE = CreateObject("MSXML2.XMLHTTP") objIE.Open "GET", "http://search.loco.yahoo.co.jp/search?p=" & str電話番号, False objIE.send strHTML = objIE.responseText intstart = InStr(1, strHTML, "<div class=""hd"">") End Sub とした時にintstartは0が返ります。 なぜソース上は<div class="hd">は存在するのに 0が返るのでしょうか?