2012-08-08 7 views
1

현재는 unlike the data presented here이 아닌 메인 프레임의 데이터로 작업하고 있습니다. 이 경우, 내 기준과 목표 데이터 세트에 대해 100-AAA와 유사한 문자열이 있습니다. 비슷한 솔루션을 찾았지만 VBA에 대한 범위 질문에서 직접 필터를 찾지 못했습니다.범위를 기준으로 필터링 열 VBA

다양한 범위의 기준에 따라 큰 데이터 집합을 필터링하려고합니다.

Sub FilterTest1() 

Dim RngOne As Range 
Dim LastCell As Long 

Sheets("Criteria").Activate 
Sheets("Criteria").Select 
Range("A1").Select 

LastCell = Application.WorksheetFunction.CountA(ActiveSheet.Range("A:A")) 

Set RngOne = ActiveSheet.Range("A2:A" & LastCell) 

Sheets("Sheet 1").Activate 
Sheets("Sheet 1").Select 

With ActiveSheet 
    If .FilterMode Then 
    .ShowAllData 
    End If 
End With 

Columns("A:A").Select 
Selection.AutoFilter 
ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:=RngOne, Operator:=xlOr 

End Sub 

불행하게도, 세포 내 범위는 데이터를 필터링하지 않는 경우에도, 다음과 같이, 원래, 나는 별도의 클래스/서브 루틴의 컬렉션과 함께 연주하기 시작,하지만 난 하나의 서브 루틴 내에서 범위의 사용으로 압축 Operator:=xlOr과 같은 기준을 사용하면 기준에 사용 된 마지막 셀 값만 표시됩니다. VBA 코드가 실패하지 않습니다 - 그냥 범위를 기반으로 제대로 필터링하지 않습니다.

나는 간단한 해결책이 존재한다는 것을 확신하지만 나는 그것을 꽤 볼 수 없다.

+0

SQL 명령을 사용하여 필터링을 수행 할 수 있지만 (여전히 Excel을 사용하는) ADO를 사용하는 것이 좋습니다. 귀하의 기준과 데이터 세트 간의 내부 조인을 수행하면 계산서에 맞을 수도 있습니다. – barrowc

+0

비슷한 질문에 대한이 초기 답변이 도움이됩니까? - http://stackoverflow.com/a/7863452/53614? 나는 관리자 권한이없는 직장에서 ADO를 사용하며 정상적으로 작동합니다. YMMV하지만 그럴 가치가있다. – barrowc

+0

좋아. 나는 주말에 그 기회를 포기하고 다음 주 초에 그것이 어떻게 전개되는지 보게 될 것이다.SQL에 의존하는 것이 장기적으로 훨씬 더 빨리 실행될 가능성이 있기 때문에 ADO를 사용하여 대규모 데이터 세트에 사용할 가치가 있습니다. 그것이 작동한다면 잘 당신의 대답 =)에 대한 또 다른 +1을 의미합니다 – JackOrangeLantern

답변

5

현재 라인 :

ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:=RngOne, Operator:=xlOr 

은하지 않는 범위 내에서 각각의 값으로하는 Range 객체에 의해 첫 번째 필드를 필터링하기 위해 노력하고있다.

값을 배열로로드 한 다음 배열을 필터 조건에 전달하여이 작업을 수행하는 한 가지 방법을 제공했습니다. 당신 (그리고 미래에 다른 사람을) 도움을 주목할 필요가

몇 가지 포인트 :

  • 나는 매크로 레코더를 사용하여 객체의 선택에 필터링 할 올바른 구문의 배웠습니다.
  • 이 사이트는 배열 트릭에 대해 배울 수 있도록 도와주었습니다. Pass Array to Filter Criteria
  • 불필요한 선택 진술 등을 제거하여 코드를 더욱 빠르고 효율적으로 정리했습니다. (아니 큰 코드의이 작은 비트에 대한 거래,하지만 연습에서 점점 더 큰 프로젝트에 당신을 도울 것입니다!)

코드 아래 :

Sub FilterTest1() 

Dim RngOne As Range, cell As Range 
Dim LastCell As Long 
Dim arrList() As String, lngCnt As Long 

With Sheets("Criteria") 
    LastCell = .Range("A" & Sheets("Criteria").Rows.Count).End(xlUp).Row 
    Set RngOne = .Range("A2:A" & LastCell) 
End With 

'load values into an array 
lngCnt = 0 
For Each cell In RngOne 
    ReDim Preserve arrList(lngCnt) 
    arrList(lngCnt) = cell.Text 
    lngCnt = lngCnt + 1 
Next 


With Sheets("Sheet 1") 

    If .FilterMode Then .ShowAllData 

    .Range("A:A").AutoFilter Field:=1, Criteria1:=arrList, Operator:=xlFilterValues 

End With 

End Sub 
+0

안녕하세요 스콧, 나는 당신이 어디로 가고 있는지 생각합니다 - 범위보다는 기준으로 문자열의 배열을 사용합니다. 코드 정리에 관해서는 많은 감사를드립니다. 한 번에 10,000 행을 정기적으로 처리합니다. 그러나 코드를 테스트 할 때 "형식 불일치"오류 메시지가 발생했습니다. 코드에 들어가서 나머지 코드 구문을 확인한 후 25 행에 '.Range ("A : A"). 자동 필터 필드 : = 1, Criteria1 : = Array (strList), 연산자 : = xlFilterValues' . 이것이 일어날 수있는 이유를 알고 있습니까? 나머지 코드는 제대로 작동하는 것 같습니다. – JackOrangeLantern

+0

수정 된 답변을 보았습니까? 원래 (삭제 된) 게시물에서이 문제를 해결했습니다. –

+0

나는 지금 시험 할 것이다 - 방금 들어갔다. =) – JackOrangeLantern

3

에주의해야 할 일이 있다는 것입니다 Criteria1에는 문자열 변수가 인수로 필요합니다. 배열에 범위를 할당 한 다음 string 배열을 조건에 전달할 수 있습니다. 또 다른주의 사항은 기준에 배열을 전달하는 것입니다. 제 지식은 열이 아니라 행에 있어야합니다. StringArray(3,0) 대신 StringArray(0,3)입니다. 그러므로 왜 당신은 당신의 범위에서 마지막 가치를 얻고 있었습니까? 행으로 변환하려면 Application.Transpose(StringArray)을 사용하면됩니다.

이 작은 코드는 저에게 유용하며 더 큰 배열로 쉽게 확장됩니다.

Sub test() 
Dim StringArray(0, 1 To 3) As String 'This is a fixed dimension of an array, you can easily change to dynamic by using the ReDim statement. 
ActiveSheet.AutoFilterMode = False 'To reset autofilter 

Range("D3:D5").Select 

For c = 1 To 3 'Step through the range that you wish to use as the criteria. 
StringArray(0, c) = CStr(Selection(c, 1).Value) 
Next 

Range("A:A").AutoFilter Field:=1, Criteria1:=StringArray, Operator:=xlFilterValues 

End Sub 
+1

귀하의 설명이 도움이되며 허용되는 답변에 추가됩니다. +1 – JackOrangeLantern

관련 문제