我有一个包含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很新。因此不太确定所有这些选项和语法。
可能这是全部过度工程。然而,我对这个方向的可能性更感到好奇,而不是真的担心不得不完全改变我的方法。感谢您寻求解决方案的帮助,甚至指出我可以探索的选项。我宁愿将用户操作限制为仅输入条件和值。
答案 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公式,而不是更新。 这有助于提高性能,并允许用户正常编写表达式..(除非没有' =')