私は非常に奇妙なシナリオに出くわしました。関数では、評価される条件の文字列を受け取ります。
例えば
(a>b and (b=2 or c!=3))
ここで、a、b、cは私の変数名です。
たくさん検索してみましたが、意味のあるものは何も得られませんでした。
だから私の質問は:このような文字列を評価することは可能ですか?はいの場合、これに関するヒントを教えてください。
別の方法として、 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では無効であるため)、!=を<>に置き換える必要があることに注意してください。
単なるコメントではなく、あなたの質問に対する適切な答えがここにあります。
必要がある:
Microsoft Visual Basic for Applications Extensibility x.x
VBIDEで(ツール/参照)への参照を設定します。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