EXCEL - VBA

Range.AutoFilter Method(2) - Field, Criteria, Operator, SubField, VisibleDropDown

별동산 2023. 3. 3. 08:54
반응형

서울시 지역 시간별 수질 현황2.xlsm
0.17MB

 

 

(2) expression.AutoFilter(field, criteria1)

expression.AutoFilter 안에 field가 있지만 명령어로 입력할 때는 괄호 없이 field:=2식으로  field다음에 :=을 입력하고, 필드 순번을 기재합니다.

인수 입력시 :=을 사용

 

또한 field만 값을 지정하면 activecell.autofilter와 결과가 같기 때문에

 

criteria1:="개포1동"이라고 조건까지 같이 지정하는 것이 바람직합니다.

Sub autofilter_field1()
    ActiveCell.AutoFilter field:=2 , Criteria1:="개포1동"
End Sub

 

1편에서도 언급했지만 A열 왼쪽에 빈 열을 삽입해도 동명의 필드는 2로 변함이 없습니다.

만약 autofilter_expression6 매크로를 실행해서 제목 표시줄의 일부(A열)에만 필터가 적용된 상태에서 위 매크로를 실행하면

 

아래와 같이 '런타임 오류(메서드 오류)'가 발생하므로 먼저 필터를 해제해야 합니다.

필터가 설정되지 않은 필드에 대한 조건 설정시 에러 발생

 

(3) expression.AutoFilter(field, criteria1, operator, criteria2)

2개의 조건을 연결하는 operator로는 xlAnd와 xlOr가 있습니다.

Sub autofilter_field2()
    ActiveCell.AutoFilter field:=2, Criteria1:="개포1동", Operator:=xlOr, Criteria2:="신사동"
End Sub

 

위 매크로를 실행하면 개포1동이거나 신사동인 데이터만 표시됩니다.

개포1동과 신사동에 대한 데이터만 표시

 

매크로가 제대로 적용되지 않을 때는 필터를 해제하거나 필터 - 지우기를 먼저 해야 합니다. 자동으로 해결하는 방법은 추후 따로 설명하겠습니다.

 

(4) expression.AutoFilter(field, criteria1, operator)

xlTop10Items, xlFilterCellColor 등 Operator(xlFilterValues 제외)는 하나의 조건만 적용되므로 Criteria1로 조건을 지정해야 합니다. Criteria2로 지정해도 적용이 안됩니다.

아래와 같이 필드 8을 기준으로 가장 큰 수치 10개를 표시하도록 코드를 작성한 후 실행하면

Sub autofilter_field3()
    ActiveCell.AutoFilter Field:=8, Criteria1:="10", Operator:=xlTop10Items
End Sub

 

수온이 높은 데이터 10개를 표시합니다. 그런데 특이한 것은 데이터가 중복되기 때문에 중복을 제거하면 실제로는 5개 항목뿐이 안된다는 것입니다.

같은 데이터가 있는 경우 실제 항목이 10개가 안됨

 

가장 큰 항목 15개를 표시하도록 10을 15로 수정하고 실행하면

Sub autofilter_field3()
    ActiveCell.AutoFilter Field:=8, Criteria1:="15", Operator:=xlTop10Items
End Sub

 

15개가 아니라 17개가 표시된다는 것입니다,

데이터 개수를 15개로 한정했으나 동일한 데이터가 있어서 표시되는 개수가 17개임

 

15개만 표시하려고 했는데, 15번째 값과 같은 값이 4개가 있어서 모두 표시하기 때문에 17개가 된 것입니다.

 

(5) expression.AutoFilter(field, operator:=xlFilterValues , criteria2)

날짜를 기준으로 데이터를 필터링할 때는 Operator로 xlFilterValues를 사용하고, Criteria는 1이 아니라 2만 사용합니다.

또한 Criteria2를 정의할 때 Array를 사용하며, 첫 번째 인수는 0~2로 연, 월, 일의 일치 부분을 지정하고, 두 번째 인수는 실제 있는 데이터중 연, 월, 일의 기준이 되는 날짜를 기재합니다.

Sub autofilter_field4()
    ActiveCell.AutoFilter Field:=11, Operator:=xlFilterValues, Criteria2:=Array(0, "2020/07/25")
End Sub

 

필터 - 지우기를 한 후 위 매크로를 실행하면 Array의 첫 번째 인수가 0이므로 연도 2020과 일치하는 데이터를 모두 보여줍니다. 월과 일은 달라도 됩니다.

연도가 일치되는 데이터만 표시(Array(Level, Date)

 

Array의 첫 번째 인수를 0에서 1로 수정하고 매크로를 실행하면

Sub autofilter_field4()
    ActiveCell.AutoFilter Field:=11, Operator:=xlFilterValues, Criteria2:=Array(1, "2020/07/25")
End Sub

 

2020년 07월의 데이터만 표시합니다. 연과 월만 같다면 날짜가 달라도 됩니다.

연도, 월까지 같은 데이터만 표시

 

(6) expression.AutoFilter(field, subfield)

먼저 지리 정보를 표시해야 하는데, 구명에서 강남구, 강북구, 관악구를 선택하고, 데이터에서 '지리로 변환'을 클릭합니다. 강남구 등만 선택한 것은 강서구, 강동구 등은 지리 데이터가 없기 때문입니다.

데이터 탭 > 데이터 형식 그룹 > 지

 

그러면 강남구 등이 영어로 변경되고, 오른쪽 위에 데이터 삽입 아이콘이 표시되는데,

 

데이터 삽입 버튼을 누르면 Population 등 도시와 관련된 정보가 표시되는데, Population을 클릭합니다.

 

그러면 기존 데이터의 오른쪽 열에 인구수가 표시됩니다.

 

인구수까지 필터가 설정되도록 홈 탭의 필터를 눌러 필터를 해제한 후 다시 필터를 누릅니다. '인구수'란 필드명이 없어도 괜찮습니다. 인구수 위의 필터를 눌러 인구수를 살펴보면 구별 인구수가 3가지입니다. 

 

따라서, 인구수가 50만 이상인 데이터만 추출하려면 아래와 같이 Field는 '구명'이 있는 1로 지정하고, Criteria1으로는 50만 이상, Subfield는 지리 정보중 하나인 Population으로 지정합니다. 

Sub autofilter_field5()
    ActiveCell.AutoFilter Field:=1, Criteria1:=">=500000", SubField:="Population"
End Sub

 

그러면 아래와 같이 강남구(Gangnam District)와 관악구(Gwanak District)의 데이터만 표시됩니다.

구명 오른쪽을 보면 깔때기 표시와 작은 역삼각형 2개가 표시됩니다.

 

※ 지리 정보를 삭제하려면 범위를 모두 선택한 다음 마우스 오른쪽 버튼을 누른 후 데이터 형식 > 텍스트로 변환을 누르면 됩니다.

 

(7) expression.AutoFilter(field, VisibleDropDown)

VisibleDropDown은 DropDown 화살표로서 기본값은 표시하는 것이지만 아래와 같이 VisibleDropDown을 False로 지정하면

Sub autofilter_field6()
    ActiveCell.AutoFilter Field:=1, Criteria1:=">=500000", SubField:="Population", visibledropdown:=False
End Sub

 

구명 오른쪽에 있던 깔때기 표시와 역 삼각형 표시가 사라집니다.

 

서울시 지역 시간별 수질 현황(완성2).xlsm
0.18MB

반응형