VB.NETのEvaluate()関数で変数に数式を代入する方法

このQ&Aのポイント
  • VB.NETでEvaluate()関数を使って数式をリテラルで渡す場合は正しく評価されますが、変数に数式を代入して渡すと評価されません。
  • 数式の構造が実行中に決まる場合、変数に数式を代入して引数として渡す方法が不明です。
  • WindowsXPおよびVS2010環境での評価結果の取得方法も教えてください。
回答を見る
  • ベストアンサー

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)

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

Evaluateに文字列で「x」と渡しても理解できません。次のように変えてみて下さい > term1 = "x = 1" > MsgBox(xlApp.Evaluate(term1)) '期待 True  実際 -2146826259 結果 NG ↓ term1 = x & " = 1" MsgBox(xlApp.Evaluate(term1)) ちなみに、 > x = 1 > MsgBox(xlApp.Evaluate(x = 1)) '期待 True  実際 True  結果 OK ↑これは、↓これと同じことをやっているに過ぎず、計算式を渡している訳ではありません。 MsgBox(xlApp.Evaluate(TRUE))  当然、TRUEが返ります。

yam2012
質問者

お礼

term1 = x & " = 1" で できました。 また、 MsgBox(xlApp.Evaluate(x = 1)) は MsgBox(xlApp.Evaluate(x & "= 1")) としなければならないことも分かりました。 正しく動作しなかった方だけでなく、正しく動作していたと思われた方も 間違っていたわけですね。 質問してよかったです。ありがとうございました。

関連するQ&A

  • 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)

  • 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  

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。 Sub test1() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource End Sub ******************************************************************* Sub test2() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource End Sub オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) ******************************************************************* Sub test3() Dim サブフォーム As String Dim フォーム As String フォーム = "土台" サブフォーム = "フォーム1" MsgBox Forms(サブフォーム).RecordSource End Sub 実行時エラー'2450' マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。 ******************************************************************* test1~3のうち test1のみはうまくいくのですが 変数を代入したいです。 ヘルフ゜のには Forms![受注]![受注サブフォーム].Formとなってますが これじゃ変数を代入できないですよね。 どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか? よろしくお願いします。

  • 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

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

  • なぜ値が代入されるのかわからない

    Sub Sample1() Dim 文字 As String 文字 = "あああ" Call Sample2(文字) 'プロシージャSample2の引数に変数を渡して呼び出す End Sub Sub Sample2(a As String) MsgBox a End Sub ---------------------------------- をやってみて疑問なのですが、 なぜ a = 文字 がないのに、 aに”あああ”が代入されるのでしょう? aにウォッチ式の追加をあてて、F8で一行ずつステップインしてみると Sub Sample2(a As String) の部分で、 aに””あああ”が代入されています。 a = 文字 と Sub Sample2(a As String) は 同じ意味なのでしょうか?

  • [ExcelVBA] Module1で定義した変数の(代入した)値を、Module2でも使う方法

    基本中の基本のことで誠に申し訳ございません。 ある標準Moduleで宣言した変数に値を代入します。 その後、別のModuleでその変数を使用しますが、 その変数の中の値が消えてしまいます。 たとえば下記のように、プログラムを書きます。 test1を実行すると、続いてtest2も実行されます。 この場合、変数の値が0になってしまいます。 このような場合どうやったらいいのでしょうか? Hensuu1の値をセルに一度出力させて、 別のModuleで、セルの値をもう一度変数に代入させて使用する という方法で何とかしていたのですが、大変で困っています。 Module1に記載------------ dim Hensuu1 as integer sub test1() Hensuu1 = 100 test2 end sub ------------------------- Module2に記載------------- sub test2 range("A1") = Hensuu1 end sub --------------------------

  • Word VBAでStyle型の変数に空の値を代入

    Word VBA でStyle型の変数に空の値を代入したい! 下記コマンドでテストしたところ、 Set style = "" では、型が違うと怒られます。 どのようにしたら、空のスタイル値を代入出来るのでしょうか? Sub stylevartest() Dim style As style Set style = "" MsgBox style End Sub 分かる方入らしたら、ご教授下さい。 よろしくお願い致します。

  • 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が入力されています。 宜しくお願い致します。

  • 変数にnullを代入するには

    諸事情で、変数の値をNullにしたいのですが、 Sub a() Dim mystr As String mystr = "moji" '他の処理 mystr = Null End Sub だと、実行時エラー94になります。 多分、NULLは値じゃないから代入できないんだと思いますが、どうすれば変数をnullにできるのでしょうか? String型が問題であれば、何にすればいいですか?

専門家に質問してみよう