Excel VBA使用动态参数评估方法

时间:2015-03-10 07:38:47

标签: excel vba parameters evaluate

我有一个包含A,B,C,D列值的工作表。用户输入前3个,使用下面的宏生成列D,

Dim Dvalue(1 To 100) As Long

For rownum = 1 To 100
    If my_condition_1 Then
        Dvalue(rownum) = my_value_1
    ElseIf my_condition_2 Then
        Dvalue(rownum) = my_value_2
    ElseIf MySheet.Evaluate(user_condition_1) Then
        Dvalue(rownum) = user_value_1
    ElseIf MySheet.Evaluate(user_condition_2) Then
        Dvalue(rownum) = user_value_2
    End If
Next rownum

基本上,当它无法使用内部硬编码条件填充时,它会评估一些用户条件(为真/假)并相应地填充。还有另一个工作表,用户可以在其中输入自定义条件作为文本。它看起来像

If(A1 + B1 = C1, True, False)
If(B1 > C1, True, False)

如您所见,我只需针对某些行进行评估。我面临的问题是如何更改用户条件中的行号。用户可以随时修改任何条件。

我想到的一个选择是使用一个占位符(A?+ B?= C?)并用行号替换(或者标记为?并缝合)。条件只能引用同一行的值,即全部?将被当前的rownum取代。然而,性能将受到影响,因为每行都会发生这种替换/拼接。

另一种选择是可能在其他地方使用固定行,其值将在上述for循环的每次迭代期间被修改。用户条件将始终引用此行。如果可能,还可以修改此方法以使用一些可由vba和公式共享的命名参数/内存位置。另一个想法是关于条件将引用的“活动”行,其将在迭代期间被改变。我对vba很新。因此不太确定所有这些选项和语法。

可能这是全部过度工程。然而,我对这个方向的可能性更感到好奇,而不是真的担心不得不完全改变我的方法。感谢您寻求解决方案的帮助,甚至指出我可以探索的选项。我宁愿将用户操作限制为仅输入条件和值。

1 个答案:

答案 0 :(得分:0)

好的,我建议你看看EVALUATE()

这是一个快速工作的例子:

Sub SO()
     Dim Text As String
     Dim rowNumber As Integer
     rowNumber = 1
     Text = "=" & Replace(CStr(Range("C" & CStr(rowNumber)).value), "¤", rowNumber)
     Text = Evaluate(Text)
     d = Dvalue(rowNumber, Text)
End Sub

Function Dvalue(rownumber As Integer, value As String)
    Range("D" & CStr(rownumber)) = value
End Function

基本上,当你想要它时,它运行一个excel公式,而不是更新。 这有助于提高性能,并允许用户正常编写表达式..(除非没有' =')