2013-01-02 306 views
1

我環顧了Stackoverflow論壇(基本上在Google上的其他任何地方),並且發現了很多「幾乎」如果我對VBA更熟悉一點就足夠了,但是我已經搞砸了一段時間了,而且還沒有弄清楚。有點沮喪,所以我覺得是時候問了!對不起,如果我解釋我的問題時得到錯誤等錯誤!這可能只是我的語法問題。VBA Countif(s)語法問題(和/或關於多個條件)

基本上我需要能夠從電子表格中的列中獲取數據,並讓它對特定參數集的單元格進行Countifs(我認爲無論如何)。我需要的所有數據都是具有「Dimension1 x Dimension 2」格式的頁面尺寸,例如「8.5 x 11」

Valtest = Application.WorksheetFunction.CountIfs(Range("P:P"), "8.5 x 11") 

這個公式,可能相當不出所料,工作得很好。但我需要標識(或任何我需要的)也能夠給我的尺寸< = 8.5 x < = 11以及翻轉尺寸(< = 11 x < = 8.5)。

我試圖改變公式樣形式(以及類似)

Valtest = Application.WorksheetFunction.CountIfs(Range("P:P"), "<=8.5" & " x " & "11") 

但是,這將報告一個尺寸如3×4或22×11,我知道COUNTIFS可以使用多個參數(其這就是爲什麼我會亂搞它而不是正常的countif),但我不知道是否輸入多個參數甚至是正確的路徑,或者如果它是正確使用引號的東西或......誰知道?

我能夠使If-then語句正常工作(使用數組並通過計數器循環遍歷每個單元格),但這顯然不是實現此目的的最快方法。這是爲了讓我的目標更清楚一些。

「如果X(0)< = 8.5和x(1)< = 11或 X(1)< = 8.5和x(0)< = 11然後

在一個相關的問題,我d還需要能夠找到例如< = 11 x < = 17之類的頁面,但不包括我之前的問題(8.5 X 11)的搜索結果。所以我需要知道多個參數的正確語法,這些參數會涉及到類似< 8.5但小於17的大小。

在此先感謝!任何幫助是相當讚賞。如果我沒有充分解釋任何事情,請告訴我。

編輯:數據的一個例子,我會被搜索:

A      Count for 8.5 x 11 (expected output) 
8.6 x 11    5 
8.5 x 11 
8.5 x 11 
8.5 x 11 
8.5 x 11 
8.4 x 11 
22 x 11 
10 x 17 
+0

你能告訴您想要驗證的列數據的一小部分樣本? – bonCodigo

+0

當然。列可能有數據是這樣的: 8.6×11 8.5×11 8.5×11 8.5×11 8.5×11 8.4×11 22×11 – Finch042

+0

你說你還「需要找到網頁」於是這些相應的「頁面」是你要查找的?最好只是通過添加一部分專欄來更新你的問題:)剪切粘貼就可以了。我更新了你的數據,你能告訴我們你有什麼,在下一列中有相應的頁面名稱嗎? – bonCodigo

回答

1

你可以試試這個UDF:複製粘貼到正規的VBA模塊。您將它分別傳給一個範圍,以及小尺寸和大尺寸的下限/上限。

例如:計數8和10以及大側之間具有小側所有尺寸12和14(含)之間:

=CountSizes(A:A,8,10,12,14) 

編輯:對於8您的特定使用情況。5x11或更小

=countsizes(A:A, 0, 8.5, 0, 11) 'one side btw 0 and 8.5 & one side btw 0 and 11.5 

EDIT3:顯示你如何使用這個從VBA,而不是作爲一個UDF,包括你的第二列

Sub Tester() 
    With ThisWorkBook.Sheets("Pages") 
     'count only where second column has "Color" 
     .Range("B1").Value = CountSizes(.Range("A:B"), "Color", 0, 8.5, 0, 11) 
    End With 
End sub 

代碼:

Function CountSizes(rng As Range, colorType As String, _ 
        smallGE, smallLE, largeGE, largeLE) 

    Dim tmp, val, v1, v2, small, large, arr, arrVals 
    Dim num As Long, r As Long, nr As Long 

    num = 0 
    arr = rng.Value 
    nr = UBound(arr, 1) 
    For r = 1 To nr 
     val = Trim(arr(r, 1)) 
     If val Like "*x*" Then 
      arrVals = Split(val, "x") 
      v1 = Trim(arrVals(0)) 
      v2 = Trim(arrVals(1)) 
      If IsNumeric(v1) And IsNumeric(v2) Then 
       v1 = CDbl(v1) 
       v2 = CDbl(v2) 
       If v1 > v2 Then 
        small = v2: large = v1 
       Else 
        small = v1: large = v2 
       End If 

       If small >= smallGE And small <= smallLE And _ 
        large >= largeGE And large <= largeLE Then 

        If Trim(arr(r, 2)) = colorType Then 
         num = num + 1 
        End If 

       End If 

      End If 
     End If 
    Next r 

    CountSizes = num 
End Function 
+0

在使用你的UDF和你的例子(把我的數據放在列A中)我只是得到0的結果。我猜我有些東西我只是不理解? – Finch042

+0

查看我的編輯 - 更新您的第一個使用案例。 –

+0

看起來像是完美的工作。非常感謝。有沒有相應的方法來適應這個非UDF?我意識到我正在分裂頭髮,這更關注我的好奇心。基本上有這種情況發生,但是將結果放入特定的單元格而不必輸入公式?我希望其他人能夠在按下按鈕之後使用它。謝謝。 – Finch042