2013-09-06 4 views
3

Microsoft Excel에서 VBA의 자동 필터로 작업하고 있습니다. 필터링을 위해 배열을 처리하는 방법에 문제가 있습니다. 범위 A1에 워크 시트에서Excel VBA 자동 필터 배열

: 나는 (원래 문제를 이해하는 희망) 단순화 된 버전으로 내 원래의 문맥을 약화했습니다의 우리가 있다고 가정 해 봅시다, A5 Fruit, Apple, Banana, OrangePear, 각기. Fruit이 열 머리글 인 자동 필터가 적용되었습니다.

아래 코드는 예상 된 결과 (Apple, BananaOrange하지만 Pear) 반환 실행 : 내가 맡은 프로젝트에서

Range("A1").Select 
ActiveSheet.Range("A1:A5").AutoFilter Field:=1, _ 
    Criteria1:=Array("=*an*", "=*app*"), Operator:=xlFilterValues 

것은, 필터 기준은 문자열 변수로 전달됩니다 위와 같이 작동합니다. 문제는 매 시간마다 모든 기준이 적용되는 것은 아니므로 그 중 일부는 효과가 없어야한다는 것입니다. 예를 들어

: B

Dim A As String, B As String, C As String 
A = "=*an*" 
B = Empty 
C = "=*ap*" 

Range("A1").Select 
ActiveSheet.Range("A1:A5").AutoFilter Field:=1, _ 
    Criteria1:=Array(A, B, C), Operator:=xlFilterValues 

는 (가, 널 (null) 왼쪽 Empty로 설정, 또는 =* 같은 와일드 카드를 사용하든)가 반환에게 레코드를 필터링하지 믹스에 던져. 그러나 실제 기준 배열에서 BEmpty (하드 코딩 됨)으로 대체하면 예상 된 결과가 반환됩니다.

ListObject의 일부인 AutoFilter를 사용했지만 비슷한 코드를 사용했습니다. 이 시점에서 내가 생각할 수있는 유일한 것은 구분 기호가있는 문자열을 필터에 연결하고 Array 변수로 분할하는 것입니다 (정확한 크기이므로 콜렉션의 설정되지 않은 항목이 같은 방식으로 엉망이므로 표준 변수는 않습니다). 그러나 그것은 직관력이없고 귀찮은 것처럼 보입니다.

내가 여기에 뭔가 분명한 것을 놓치고 있습니까?

답변

4

빈 매개 변수에 대한 테스트가 필요하지 않은 방법을 생각할 수 없습니다. 여기서는 사용할 수있는 방법 중 하나이며 중복식이 없습니다.

Sub Main() 
    Dim a As String 
    Dim B As String 
    Dim C As String 
    Dim filterCriteria as Variant 
    a = "=*an*" 
    B = Empty 
    C = "=*ap*" 
    filterCriteria = CombineArrays(Array(a, B, C)) 

    If Not uBound(filterCriteria) = -1 Then 

     Range("A1").Select 
     ActiveSheet.Range("A1:A5").AutoFilter Field:=1, _ 
      Criteria1:=filterCriteria, Operator:=xlFilterValues 

    End If 
End Sub 

Function CombineArrays(arr As Variant) As Variant 
    Dim a As Variant 
    Dim filterDic As Object 'Scripting.Dictionary 
    Set filterDic = CreateObject("Scripting.Dictionary") 

    For Each a In arr 
     If Not filterDic.Exists(a) And Not a = vbNullString Then 
      filterDic.Add a, a 
     End If 
    Next 

    CombineArrays = filterDic.Keys 

    Set filterDic = Nothing 
End Function 
+0

너무 늦게,하지만 난 당신이 빠른 루프에 추가하지 않는 한 이미 사전에 존재하는 키를 사용하여 항목을 추가하지 않습니다 당신이 사전을 채우기에 조건을 생략 할 수 있다고 생각합니다. – AntiDrondert

+1

@AntiDrondert 예 Exists 검사를 생략 할 수는 있지만 'filterDic (a) = a'를 암시 적으로 수행하는 데 필요한 Add 메소드를 사용할 수 없습니다. –