2

私は非常に奇妙なシナリオに出くわしました。関数では、評価される条件の文字列を受け取ります。

例えば

(a>b and (b=2 or c!=3))

ここで、a、b、cは私の変数名です。

たくさん検索してみましたが、意味のあるものは何も得られませんでした。

だから私の質問は:このような文字列を評価することは可能ですか?はいの場合、これに関するヒントを教えてください。

4

2 に答える 2

2

別の方法として、 MicrosoftScriptControlへの参照を追加します

Dim vx As MSScriptControl.ScriptControl
Set vx = New MSScriptControl.ScriptControl

a = 100
b = 200
c = 300
Cond = "(a>b and (b=2 or c<>3))"

With vx
    .Language = "VBScript"
    .AddCode "function stub(a,b,c): stub=" & Cond & ": end function"

    result = .Run("stub", a, b, c)
End With

MsgBox result

前者はVB*では無効であるため(および/またはjScriptでは無効であるため)、!=を<>に置き換える必要があることに注意してください。

于 2013-03-14T11:03:49.307 に答える
1

単なるコメントではなく、あなたの質問に対する適切な答えがここにあります。

必要がある:

  • Microsoft Visual Basic for Applications Extensibility x.xVBIDEで(ツール/参照)への参照を設定します。
  • VBAプロジェクトオブジェクトモデルへのアクセスを信頼します(Googleを使用して、ご使用のバージョンのExcelでこれを行う方法を確認してください)。
  • 実行initValues()してから呼び出しますgetConstantValue("(a>b and (b=2 or c<>3))")

コード:

Option Explicit

Dim a As Long
Dim b As Long
Dim c As Long

Sub initValues()
    a = 3
    b = 2
    c = 4
End Sub

Function getConstantValue(constStr As String) As Variant

    Dim oMod As VBIDE.CodeModule
    Dim i As Long, _
        num As Long

    Set oMod = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule

    For i = 1 To oMod.CountOfLines
        If oMod.Lines(i, 1) = "Function tempGetConstValue() As Variant" Then
            num = i + 1
            Exit For
        End If
    Next i

    oMod.InsertLines num, "tempGetConstValue = " & constStr

    getConstantValue = Application.Run("tempGetConstValue")

    oMod.DeleteLines num

End Function

Function tempGetConstValue() As Variant
End Function
于 2013-03-14T00:48:48.217 に答える