2013-01-12 55 views
1

一直在尋找一點,但還沒有找到合適的解決方案,所以這裏是我的問題!還是比較新的,請原諒我任何不正確的詞彙。VBA,通過一個單元格中的多個陣列參數進行過濾

我試圖做一個過濾器類似於下面的數據:

8.5 x 11 
8.3 x 10.9 
8.7 x 10.9 
8.3 x 10.9 
11 x 8.5 
8.5 x 11 
8.5 x 11 
15 x 11 

基本上,我需要能夠通過第一個值和第二個值過濾。在Stackoverflow成員的大量幫助下,我將這些值放入數組中,確定第一個和第二個值,並將它們分配爲Arrval(0)和Arrval(1),然後將這些值分配給變量基於尺寸的「小」和「大」。這樣,如果第一面較大等,它仍然可以解決。這裏是什麼覺得是相關代碼的問候是:

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 
      End If 
      End If 

後來我用這些值來確定在「大小」的大小和數量,如果它滿足某些參數。例如

testcase8511 = Small <= 9.9 And Large <= 14.5 
test117 = Small >= 10 And Large <= 17.6 

然後我使用if-else語句(只使用如果x然後range.value = range.value +1),並改變它們存在於該行的顏色數這些。

朗(希望能夠提供足夠的背景使其更容易!)我需要能夠通過這些參數進行過濾,然後將結果導出到文本文件。我已經將文本導出進行了整理,但我無法弄清楚如何正確過濾。我懷疑這主要是一個語法問題。

快速和骯髒的方法是在這些變量是真正的行中只有另一個單元格獲取「x」或「y」或其他標記添加到他們當我進行計數,然後過濾那個,但我懷疑有一個更好/更有效率/更少資源密集型的方式來爲那些比我有更多線索的人做這件事。我甚至不知道是否真的使用自動過濾器,導出然後將自動過濾器關閉是最好的方法。由於這些行是彩色的,我想我也可以通過單元的內部顏色或其他東西進行過濾。只是不知道該如何去正確完成這個任務。

所以基本上,總之我需要能夠通過我上面的變量之一(例如testcase8511)我已經通過所有的數據消失了,如果真數了後做

  1. 過濾器。 (有沒有辦法將這個信息存儲在VBA中,這使得資源明智嗎?
  2. 將此過濾的數據導出到文本文件(我主要爲自己排序)
  3. 返回工作簿(或離開它)在視覺上是相同的。即,我不希望該過濾器在導出過程完成後在視覺上呈現給用戶。
  4. 儘可能有效地做到這一點,明智的方案(坦率地說,我懷疑有人願意回答會渴望做其他事情)。我們正在使用的一些電腦...並不好。

在此先感謝!我會澄清任何我沒有解釋得很好的話。詢問。

+0

有這個帖子,詢問有關頁面大小的選擇... [檢查出來](http://stackoverflow.com/questions/ 14126962/vba-countifs-syntax-issue-and-or-about-multiple-conditions)..您使用的是哪個版本的Excel?因爲在2003年以後你有'CountIFs()'來幫助你... – bonCodigo

回答

0

好的,這是用於篩選的一個解決方案:
在工作表中,模塊:

Sub test() 
    Dim i As Long 
    Dim f1 As String, f2 As String 
    Dim f As String 
    Dim c As New Collection 
    Dim arr() As String 

    f = InputBox("Enter two filters with comma, e.g. '>3.2, <10", "Filters") 
    If InStr(f, ",") = 0 Then Exit Sub 
    f1 = Split(f, ",")(0) 
    f2 = Split(f, ",")(1) 

    For i = 2 To Me.UsedRange.Rows.Count 
     If xFilter(f1, f2, Me.Cells(i, "A").Text) Then c.Add Me.Cells(i, "A").Text 
    Next 
    If Not Me.AutoFilterMode Then Me.Rows(1).AutoFilter 

    ReDim arr(c.Count - 1) 
    For i = 1 To c.Count 
     arr(i - 1) = c(i) 
    Next 
    Me.UsedRange.AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues 

End Sub 

Field是列號,必須用上述Cell(i, "A")匹配)在一個模塊:

Public Function xFilter(f1 As String, f2 As String, t As String) As Boolean 
    Dim v1 As Double 
    Dim v2 As Double 
    Dim r1 As Boolean 
    Dim r2 As Boolean 

    v1 = Val(Split(t, "x")(0)) 
    v2 = Val(Split(t, "x")(1)) 

    r1 = Evaluate(_ 
     WorksheetFunction.Text(v1, "0.0########") & f1) 
    r2 = Evaluate(_ 
     WorksheetFunction.Text(v2, "0.0########") & f2) 
    xFilter = r1 And r2 
End Function 

它似乎在做「把」的把戲。 (我用WorksheetFunction.Text因爲CStr給出了一個本地化的字符串像德國3,5。) 從實用的角度來看然而,我個人堅持的規則:如果你想用數字作爲數字來工作,就應該是數字!所以我寧願將值分成兩列,並在這些列上使用「普通」數字過濾器。 (一個小組的工作將非常類似於這裏的...)

+0

謝謝!給了我一些想法。 – Finch042

相關問題