我如何从单元格中读取比较运算符,并在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