Evaluate()関数を使って数式を評価する方法

このQ&Aのポイント
  • VB.NETのEvaluate()関数を使用して、プログラム実行中に決まる数式を評価する方法について説明しました。
  • 数式を文字列の形で処理させ、Evaluate()関数で評価するためには、数式を" "で囲まずに渡す必要があります。
  • また、数式の構造自体がプログラムの実行中に生成される場合は、数式を文字列として表現する方法も紹介しました。
回答を見る
  • ベストアンサー

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)

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

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

ANo.2です。 「式が求まっていない」というのがイマイチ良く判りませんが。 「i1+i2+5」だけではなく、場合によっては「i1-i2+5」になったり「i1*i2+5」になったりするという事でしょうか。 それとも、変数i1、i2の値は演算直前まで決まらないという意味ですか? 前者なら、式が決まった時点で変数の値と、決定した演算子で文字列を作成します。 後者なら、演算直前に term_i = i1 & " + " & i2 & " + 5" とするだけです。

yam2012
質問者

お礼

前者です。 > 式が決まった時点で変数の値と決定した演算子で文字列を作成します。 なんとなく、どのようにすればいいのかが分かってきました。 これでやってみます。ありがとうございました。

その他の回答 (2)

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

数日前に同じような回答をした筈なのですが、ご理解いただけていなかったようですね。 Evaluateは、それまでのソースを読んでいるわけではありませんので、VB.Netで使用されていた変数の中身などまったく知りません あくまでも文字列で与えられた演算式だけで演算を行うものです。 「i1+i2+5」を計算しろと渡されても『i1ってなに?i2ってなに?』と、理解できません。 「i1+i2+5」ではなく、「2+3+5」という文字列を作って渡してあげる必要があります。 term_i = "i1 + i2 + 5" ↓ term_i = i1 & " + " & i2 & " + 5" これで Term_i = "2 + 3 + 5" になりますのでEvaluateもちゃんと演算できます。 正しいと言われている↓ですが、2+3+5の演算はVB.Netが行っています。 term_i = i1 + i2 + 5 ' (A)

yam2012
質問者

補足

質問の意図が分かりにくくて申し訳ありません。 数日前のご質問の回答を参考に term_i = "i1 + i2 + 5"を term_i = i1 & " + " & i2 & " + 5" の形にすればできることは理解できたのですが、 今回、困っていることは、コードを書く時点では i1 + i2 + 5の式がまだ求まっていないので事前に term_i = i1 & " + " & i2 & " + 5" と記述することができず、プログラム実行中に 変数term_iに"i1 + i2 + 5"が生成された後に 変数term_iの内容を i1 & " + " & i2 & " + 5" の形にする必要があります。 プログラムはi1とi2が変数と分かっていますので "i1" & " + " & "i2" & " + 5" という形にはできるのですが "i1","i2"の部分が文字列になっていますので i1 & " + " & i2 & " + 5"の形にするには "i1","i2"の部分をi1,i2のように" "がない形に しなければなりませんが どのようにすればよいのかがよく分からないのです。 整理しますと term_i = "i1 + i2 + 5" または term_i = "i1" & " + " & "i2" & " + 5" から term_iの中身を i1 & " + " & i2 & " + 5" にする方法が知りたいのです。 よろしくお願いします。

回答No.1

そもそも,ExcelのEvaluate関数を使っているのですから, Visual Basic側の変数を渡す術はなく,変数の値を文字列にするしかありません。 式木をこねくり回せばデリゲート経由で直接処理が可能だとは思いますが……。

yam2012
質問者

お礼

> Visual Basic側の変数を渡す術はなく, > 変数の値を文字列にするしかありません。 変数は渡せないので変数名を変数の中身に置き換えて渡してみます。 ありがとうございました。

関連する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()で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  

  • 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

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

  • ある文字が含まれているセルの個数を結果表示

    いつもお世話になっております。 また詰まってしまいましたので質問させてください。 S列に「test」という文字が入っているセルの個数を集計し結果を セル「AC1」に表示したいのですがうまくいかずにおります。 なお、S列には様々な文字が入っているのでワイルドカードで検索しております。 データ数は変動します。 Sub Macro1() Dim c As Long Dim ans As Integer Dim i As Integer ans = 0 With ActiveSheet For i = Cells(65536, c).End(xlUp).Row To 1 Step -1 If Range("S" & i) = "*test*" Then ans = ans + 1 End If Next i Range("AC1") = ans End With End Sub 環境 Excel2003 以上、宜しくお願いします。

  • EXCELの列複数削除

    VB6.0で開発しています。 下のようにEXCELの列を複数削除していますが 思うように削除されません。 削除はされるのですが B列を削除してから次C列を削除となってしまっているので C列を削除する時は元々のC列ではなく B列を削除してからのC列を削除してしまいます。 どう直せばいいのでしょうか? お願いします。 Private Sub Command2_Click() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim B As Integer Dim C As Integer Dim D1 As Integer Dim E As Integer Dim G As Integer Dim H As Integer Dim K As Integer Dim L As Integer Dim M As Integer Dim N As Integer Dim P As Integer Dim R As Integer Dim T As Integer Dim U As Integer Dim V As Integer Dim Y As Integer Dim Z As Integer Dim AA As Integer Dim AB As Integer Dim AC As Integer Dim AD As Integer Dim AE As Integer Dim AF As Integer Dim AG As Integer Dim AH As Integer Dim AI As Integer Dim AJ As Integer Dim AL As Integer Dim AM As Integer Dim AP As Integer Dim AQ As Integer Dim AR As Integer Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("C:\Users\maki\Documents\Book1") Set xlSheet = xlBook.Worksheets("Sheet1") xlApp.Visible = True B = 2 C = 3 D1 = 4 E = 5 G = 7 H = 8 K = 11 L = 12 M = 13 N = 14 P = 16 R = 18 T = 20 U = 21 V = 22 Y = 25 Z = 26 AA = 27 AB = 28 AC = 29 AD = 30 AE = 31 AF = 32 AG = 33 AH = 34 AI = 35 AJ = 36 AL = 38 AM = 39 AP = 42 xlSheet.Cells(1, C).EntireColumn.Delete xlSheet.Cells(1, D1).EntireColumn.Delete xlSheet.Cells(1, E).EntireColumn.Delete xlSheet.Cells(1, G).EntireColumn.Delete xlSheet.Cells(1, H).EntireColumn.Delete xlSheet.Cells(1, K).EntireColumn.Delete xlSheet.Cells(1, M).EntireColumn.Delete xlSheet.Cells(1, N).EntireColumn.Delete xlSheet.Cells(1, P).EntireColumn.Delete xlSheet.Cells(1, R).EntireColumn.Delete xlSheet.Cells(1, T).EntireColumn.Delete xlSheet.Cells(1, U).EntireColumn.Delete xlSheet.Cells(1, V).EntireColumn.Delete xlSheet.Cells(1, Y).EntireColumn.Delete xlSheet.Cells(1, Z).EntireColumn.Delete xlSheet.Cells(1, AA).EntireColumn.Delete xlSheet.Cells(1, AB).EntireColumn.Delete xlSheet.Cells(1, AC).EntireColumn.Delete xlSheet.Cells(1, AD).EntireColumn.Delete xlSheet.Cells(1, AE).EntireColumn.Delete xlSheet.Cells(1, AF).EntireColumn.Delete xlSheet.Cells(1, AG).EntireColumn.Delete xlSheet.Cells(1, AH).EntireColumn.Delete xlSheet.Cells(1, AI).EntireColumn.Delete xlSheet.Cells(1, AJ).EntireColumn.Delete xlSheet.Cells(1, AL).EntireColumn.Delete xlSheet.Cells(1, AM).EntireColumn.Delete xlSheet.Cells(1, AP).EntireColumn.Delete Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing End Sub

  • 文字列から数式に変換する標準モジュールが不安定

    文字列を数式に変換する標準モジュール「EVALUATE」の更新が不安定です エクセルシート内の文字列を数式に変換して、計算結果を返すために下記標準モジュールを登録して試すのですが うまく行ったりいかなかったり、標準モジュールが安定して機能しない原因などが分かりません。 ●現在の設定とやりたいこと (1)A1⇒=myEvalAry(B1)、B1⇒C1+D1、C1⇒2、D1⇒5 として、A1にC1+D1計算結果の7を表示させたい (2)一つのシートの中に、myEvalAry標準モジュールを数百使っている (3)一つのセルの中で、=myEvalAry(B1)+myEvalAry(B2)のように標準モジュールを複数使っているセルもある ●現在の状況 上記状態で、何かのタイミングで標準モジュールの計算結果が一気に全て正しく反映されることもあれば、 急に反映されなくなることもある。100のうち10だけ反映されることもある。 というような不安定な状態です。 しかも数量が問題かと思って、多量に登録していたmyEvalAryのセルを1つだけにして動きを確認しようとしたらまた反映 されなかったりで、全然理由が分かりません。 どこか標準モジュール内に、考慮すべき構文が漏れたりしてるのでしょうか???? 正常稼働しない理由が分かると大変ありがたいです。win7、win8、excel2003、excel2013のいずれの環境でも同様です。 /////////////////////////////////////////////////////// Function myEvalAry(ParamArray ItemR()) As Variant Dim re As Variant Dim strTmp As String Dim varR As Variant Dim i As Variant, j As Variant strTmp = "" varR = ItemR() For Each i In varR If IsArray(i) Then '引数が配列の場合 For Each j In i If IsNumeric(j) Then re = CStr(j) Else re = j End If strTmp = strTmp & re Next Else '引数が配列以外 If IsNumeric(i) Then re = CStr(i) Else re = i End If strTmp = strTmp & re End If Next myEvalAry = Application.Evaluate(strTmp) End Function

  • 最終列の列番号を列文字に変換することはできますか?

    例えばaaaがある列を探し、その列番号は4で列文字がDですが、 列番号から列文字をvbaで取得する方法はありますか? Sub Sample() Dim i As Long Dim Colmoji As String i = Rows(1).Find(What:="aaa", LookAt:=xlWhole).Column Colmoji = i 'ここで列文字に変換したい MsgBox i & "の列文字は" & Colmoji & "です" End Sub このようなコードを作ってみたのですが列文字に変換する方法がわかりません。

  • 整数→文字列の置換

    VB6の質問です。 ↓例で、REC変数を文字列の扱い(整数→文字列)にする方法はございますか? 宣言時の変数タイプは、変更したくありません。 宜しくお願いいたします。 Dim REC As Integer Private Sub test() As Integer  ・  ・  ・  ・ REC = '←処理結果をRECに入れる。RECには、文字列が挿入されます。 End Sub

  • VBA 文字列の抜き出し

    VBAで文字列の抜き出しの方法を教えてください。 同様な質問があり、参考にしてみたのですがうまくいきません。 お分かりの方がいましたらご享受お願いいたします。 30~45字からなる文字列があります。 その中に特定の文字列が2つあり、そのうちの最初の特定文字列に続く文字2つ目の特定文字列前までを抜き出したいのですがうまくいきません。 具体的には abcdefghi GN=12jikl PE=fghj456 という文字列のなかから"GN="と"PE="の中間の文字を取り出したいのですが、 自分で書いたものでは"PE="以上が抜き出され、"GN="より前の文字列を抜き出せませんでした。 GN=......, PE=......の文字数はそれぞれ不規則です。また、GN=...よりも前の文字数も不規則です。 以下が作成したものです。 Dim i As Integer Dim Srch As String Dim Btwn As String Const Chr1 As String = "GN " Const Chr2 As String = "PE" Dim m As String Set sheetobj = ThisWorkbook.Worksheets("A") With sheeobj lastrow = sheetobj.Cells(sheetobj.Rows.Count, 10).End(xlUp).Row For i = 2 To lastrow Srch = sheetobj.Cells(i, 10) Btwn = Mid(Srch, InStr(Srch, Chr1) + 1, InStr(Srch, Chr2) - InStr(Srch, Chr1) - 1) sheetobj.Cells(i, 9) = Btwn Next i End With End Sub なにかいい方法があれば教えて頂けたらと思います。 よろしくお願い致します。

専門家に質問してみよう