2011-02-23 29 views
1

我已經遍及MSDN搜索,並找不到任何有關此信息。我有一個「設置」表來控制我的應用程序。此工作表有一系列存儲比較運算符的單元格,例如< =和>以用於過程。如何從單元中讀取比較運算符並在If ... Then ... Else語句中使用它?

我有一份水果清單和一份價格表,列出了每種水果的銷售量。我想看看有多少蘋果以低於或等於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 

在此先感謝!

回答

0

我才意識到,使用循環內的功能破壞性能,所以我會在循環運行之前爲每個運算符做一個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 
+0

我相信在第二種情況下會出現一個錯誤:)...'<='應該是'> =' – 2011-02-24 17:52:50

+0

您是對的,修復了,謝謝:) – fomoz 2011-02-24 21:21:06

+0

當您對某個答案感到滿意時,您應該接受它,即使它是你自己的... – 2011-02-25 13:23:43

0

如果你提供一個參考的Microsoft Access是xx對象庫,你可以說:

If Eval("'" & rngFruits(lRow, 1) & "'" & avOperator(1, 1) & "'apple' AND " _ 
     & rngPrices(lRow, 1) & avOperator(1, 2) & 10) Then 

我不知道爲什麼Excel沒有Eval,但我測試的一個早期版本,所以你不妨檢查一下。請注意,Evaluate根本不是一回事。我不確定這是一個好主意,但它在那裏,FWIW。

+0

順便說一句這是超級簡單過,我剛啓用的工具 - >引用...菜單中的Microsoft Access 12對象庫,然後通過使用Access.Application.Eval(「你好」) – fomoz 2011-02-24 16:26:45

+0

調用的函數這是一個好主意,但不是爲此目的。感謝您的幫助,雖然:) – fomoz 2011-02-24 16:42:53

0

您可以編寫自己的函數來做到這一點

喜歡的東西

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 
+0

這是一個很好的選擇,如果我沒有MS Access。 – fomoz 2011-02-24 16:51:25

相關問題