我如何从单元格中读取比较运算符,并在If … Then … Else语句中使用它?
我search了所有的MSDN,并找不到任何有关这方面的信息。 我有一个“设置”表控制我的应用程序。 这个工作表有一个存储比较运算符(如<=和>)的单元格范围,以便在过程中使用。
我有一份水果清单和一份价格表,列出了每种水果的销售量。 我想看看有多less苹果已经以低于或等于10美元的价格出售了。
我的程序以前的版本使用了WorksheetFunction.CountIfs方法,它基本上将工作表中的操作符读入数组中,并像下面这样使用它们:
Sub BuiltInCountIfsUsingArray() Dim rngOperator As Range Dim avOperator As Variant Set rngOperator = [A1:B1] avOperator = rngOperator With WorksheetFunction lResult = .CountIfs(rngFruits, _ avOperator(1, 1) & "apple", _ rngPrice, _ avOperator(1, 2) & 10) End With End Sub
avOperator(1,1)从A1读取,其中包含=
avOperator(1,2)从B1读取,其中包含<=
所以在VBA中,
avOperator(1,1)返回值“=”
avOperator(1,2)返回值“<=”
所以上面的代码相当于:
Sub BuiltInCountIfs() With WorksheetFunction lResult = .CountIfs(rngFruits, _ "=" & "apple", _ rngPrice, _ "<=" & 10) End With End Sub
而CountIfs函数可以正常工作。
我的问题是:如何使用存储比较运算符的同一种方法,然后在If … Then … Else语句中使用它们?
基本上我想这样做:
Sub MyCountIfs() Dim lRow As Long Dim lCounter As Long Dim lResult As Long For lRow = 1 To 10 If rngFruits(lRow, 1) = "apple" _ And rngPrices(lRow, 1) <= 10 Then lCounter = lCounter + 1 End If Next lRow lResult = lCounter End Sub
成这样的东西:
Sub MyCountIfsUsingArray() Dim lRow As Long Dim lCounter As Long Dim lResult As Long Dim rngOperator As Range Dim avOperator As Variant Set rngOperator = [A1:B1] avOperator = rngOperator For lRow = 1 To 10 If rngFruits(lRow, 1) & avOperator(1, 1) & "apple" _ And rngPrices(lRow, 1) & avOperator(1, 2) & 10 Then lCounter = lCounter + 1 End If Next lRow lResult = lCounter End Sub
如果数组是不可能的,直接读rngOperator也会很好。 这样的事情可能是:
Sub MyCountIfsUsingRange() Dim lRow As Long Dim lCounter As Long Dim lResult As Long Dim rngOperator As Range Dim avOperator As Variant Set rngOperator = [A1:B1] For lRow = 1 To 10 If rngFruits(lRow, 1) & rngOperator(1, 1) & "apple" _ And rngPrices(lRow, 1) & rngOperator(1, 2) & 10 Then lCounter = lCounter + 1 End If Next lRow lResult = lCounter End Sub
提前致谢!
如果您包含对Microsoft Access xx对象库的引用,则可以这样说:
If Eval("'" & rngFruits(lRow, 1) & "'" & avOperator(1, 1) & "'apple' AND " _ & rngPrices(lRow, 1) & avOperator(1, 2) & 10) Then
我不确定为什么excel没有Eval
,但我正在testing一个早期的版本,所以你不妨检查一下。 请注意, Evaluate
是不是一回事。 我不确定这是一个好主意,但它在那里,FWIW。
你可以写自己的function来做到这一点
就像是
Function CompareTest(v1 As Variant, Operator As String, v2 As Variant) As Boolean Select Case Operator Case "=": CompareTest = v1 = v2 Case "<>": CompareTest = v1 <> v2 Case ">": CompareTest = v1 > v2 Case ">=": CompareTest = v1 >= v2 Case "<": CompareTest = v1 < v2 Case "<=": CompareTest = v1 <= v2 Case <insert any other operator you may need> Case Else: <handle the invalid operator case as you see fit> End Select End Function
那么你的代码变成了
For lRow = 1 To 10 If CompareTest(rngFruits(lRow, 1), rngOperator(1, 1), "apple") And _ CompareTest(rngPrices(lRow, 1), rngOperator(1, 2), 10) Then lCounter = lCounter + 1 End If Next lRow
我只是意识到在循环中使用一个函数会破坏性能,所以我只是在循环运行之前为每个运算符做一个select case。 感谢球员,我感谢你的时间努力,我今天学到了新的东西:)
我很笨,我忘记提到第一个操作符总是“=”,所以用户只会指定第二个。
Sub MyCountIfsUsingCases() Dim lRow As Long Dim lCounter As Long Dim lResult As Long Dim rngOperator As Range Dim avOperator As Variant Set rngOperator = [A1:B1] avOperator = rngOperator Select Case avOperator(1, 2) Case "<=" For lRow = 1 To 10 If rngFruits(lRow, 1) = "apple" _ And rngPrices(lRow, 1) <= 10 Then lCounter = lCounter + 1 End If Next lRow Case ">=" For lRow = 1 To 10 If rngFruits(lRow, 1) = "apple" _ And rngPrices(lRow, 1) >= 10 Then lCounter = lCounter + 1 End If Next lRow 'Case "<", etc... End Select lResult = lCounter End Sub