1. 아별툴
  2. 아별툴 패밀리
  3. 엑셀 질문하기
  4. 엑셀 강좌
  5. 엑셀 팁
  6. 엑셀 자료실
  7. 엑셀 연구과제
  8. 엑셀 북마크
  9. 관련 프로그램 소개

[엑셀VBA] 자동필터를 매크로로 구현하기

조회 수 11267 추천 수 0 2008.08.28 22:20:05

출처 : http://abyul.com/

아.. 엑셀2003에는 필터링 하는 도구모음이 있었다.
그 녀석은 참으로 유용한 녀석이었다.
필터된 상태가 아니면, 자동필터된 상태로 만들어 줬고,
특정 셀을 선택하고 클릭하면 선택된 셀의 값으로 필터링을 해줬다.
정말 많이 썼다..

그러다.. 회사에서 엑셀2007을 전부 깔아줬다.. 그 도구모음이 없어졌다.. =_=;;
엑셀2007에 있는 녀석은.. 한번 클릭하면 자동필터 상태로 만들어주지만..
특정 셀을 선택하고 다시 누르면.. 자동필터 상태를 풀어버리기만 했다.. 미친.. =_=;;

할수없이.. Macro로 직접 짜서 쓰기로 했다.

생각보다 삽집을 많이 해서.. 졸 오래 걸렸다. 이틀은 걸린듯.. 머.. 일하다 짬짬이 한거니까.. 4시간쯤.. =_=;;

암튼.. 웃기다..

기본적인 자동필터 매크로는 아래와 같다. 여기서 numField는 사용자 변수다.
        Selection.AutoFilter Field:=numField, Criteria1:=Selection.Value
저 numField를 만드는게 살짝 고민됐지만.. 나름 빨리 해결 책을 찾았다.
데이터 영역에서 몇번째 필드인가.. Selection.Column으로 하면 안된다. 데이터 영역에 A열부터 있는게 아니면 어쩔 건가?
암튼.. 연속된 데이터 영역을 지정할 수 있는 CurrentRegion이 있는게 너무나 고마웠다.
    '전체 데이터 영역에서 현재 선택 셀의 위치 찾기
    numField = Selection.Column - Selection.CurrentRegion.Column + 1


'현재 선택된 값으로 필터링 하기.
Sub data_Filter_Filtering()

    Dim strFilter As String
    Dim strDate As Date
    Dim numField As Integer
    Dim rngCell As Range
    Dim formatSelection As String

    'On Error GoTo ERROR

    Set rngCell = Selection.CurrentRegion

    If rngCell.Count < 2 Then
        MsgBox "범위 설정을 너무 적게 했습니다." & Chr(10) & rngCell.Count & "개 셀 선택됨", vbExclamation, "abyul.com error _ Data Filtering"
        GoTo ERROR
    End If

   
    If Not (ActiveSheet.AutoFilterMode) Then
        If MsgBox("현재 선택셀로 자동필터링 하시겠습니까?", vbYesNo + vbQuestion + vbDefaultButton1, "확인창") = vbYes Then
            Selection.CurrentRegion.AutoFilter
        Else
            End
        End If
    Else
    End If


    '전체 데이터 영역에서 현재 선택 셀의 위치 찾기
    numField = Selection.Column - rngCell.Column + 1

    '선택값이 날짜 형식일 경우의 필터링
    If IsDate(Selection.Value) Then
        Selection.AutoFilter Field:=numField, Criteria1:=Selection.Value
    Else
        '선택값이 날짜 형식이 아닐 경우(숫자,텍스트,오류 등)의 필터링
        Selection.AutoFilter Field:=numField, Criteria1:=Selection.Text
    End If

ERROR:

End Sub 







여담이지만.. 중간에 삽질을 좀 했다.. =_+;;

아래처럼 몇 줄이면 끝날 코딩을.. 저 아래의 코드처럼 산처럼 만들었었었던 것이다. 미친.. =_=;;
겨우.. Selection.Text 하나면 됐을 문제를.. OTL.. 멍청하면 죽어야지..
그래도 이제 알았으니.. 조금 더 살아볼란다.. ㅋㅋ

    '전체 데이터 영역에서 현재 선택 셀의 위치 찾기
    numField = Selection.Column - rngCell.Column + 1

    '선택값이 날짜 형식일 경우의 필터링
    If IsDate(Selection.Value) Then
        Selection.AutoFilter Field:=numField, Criteria1:=Selection.Value
    Else
        '선택값이 날짜 형식이 아닐 경우(숫자,텍스트,오류 등)의 필터링
        Selection.AutoFilter Field:=numField, Criteria1:=Selection.Text
    End If



열라 삽질한 코드의 시작.. =_=;;

    
    '전체 데이터 영역에서 현재 선택 셀의 위치 찾기
    numField = Selection.Column - rngCell.Column + 1

    '선택영역에 적용된 서식값을 불러옴
    formatSelection = Selection.NumberFormatLocal

    '선택값이 숫자일 경우의 필터링
    If IsNumeric(Selection.Value) Then
        If formatSelection = "G/표준" Then
            strFilter = Selection.Value
        ElseIf IsEmpty(Selection.Value) Then
            strFilter = Selection.Value
        Else
            strFilter = Replace(Replace(Replace(Replace(Format(Selection.Value, formatSelection), "-", ""), "_", ""), "(", ""), ")", "")
        End If
       
        Selection.AutoFilter Field:=numField, Criteria1:=strFilter
       
        End
       
    End If
   
    '선택값이 오류일 경우의 필터링
    If IsError(Selection) Then
   
        Select Case Selection.Value
            Case "오류 2007"
                strFilter = "#DIV/0!"
            Case "오류 2042"
                strFilter = "#N/A"
            Case "오류 2029"
                strFilter = "#NAME?"
            Case "오류 2000"
                strFilter = "#NULL!"
            Case "오류 2036"
                strFilter = "#NUM!"
            Case "오류 2023"
                strFilter = "#REF!"
            Case "오류 2015"
                strFilter = "#VALUE!"
        End Select
       
        Selection.AutoFilter Field:=numField, Criteria1:=strFilter
       
        End
    End If
   
    '숫자, 오류를 제외한 나머지 경우의 필터링
    Selection.AutoFilter Field:=numField, Criteria1:=Selection.Value
   


문서 첨부 제한 : 0Byte/ 2.00MB
파일 제한 크기 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 기타 엑셀 VBA 간단한 팁 모아놓기.. +_+ [레벨:30]아별 2007-01-24 33997
44 기타 엑셀 기본 제공 대화 상자 인수 목록 file [레벨:30]아별 2009-11-04 8037
43 엑셀2007에서 셀의 색상을 RGB로 뽑아내기 file [레벨:30]아별 2009-10-06 10241
42 [VBA팁] 화일이 존재하는지 확인하기 [레벨:30]아별 2009-07-31 8037
41 엑셀에서 사용하는 언어 확인하기. file [1] [레벨:30]아별 2009-06-03 13820
40 메시지 박스 대용으로 Shape 사용하기 file [레벨:30]아별 2009-05-07 16083
39 유저폼 크기 조절 가능하게 만들기 file [레벨:30]아별 2009-05-07 5867
38 스스로 사라지는 메시지 박스 file [1] [레벨:30]아별 2009-05-07 5625
37 마우스 좌표를 반환 받기 file [레벨:30]아별 2009-05-07 5839
36 [펌] Excel Macro(VBA) 입문자를 위한 소개자료 image [레벨:30]아별 2008-12-19 6665
35 기타 [Excel VBA] 피벗테이블(PivotTable)을 VBA로 컨트롤해보자.. [레벨:30]아별 2008-12-19 12199
34 [펌] 엑셀로 최대 공약수 구하기 [2] [레벨:30]아별 2008-12-18 5290
33 바로 옆셀의 메모값 가져 오기 [1] [레벨:30]아별 2008-10-20 5505
32 [엑셀VBA] ERROR CODE file [레벨:30]아별 2008-08-28 7400
» [엑셀VBA] 자동필터를 매크로로 구현하기 [레벨:30]아별 2008-08-28 11267
30 [VBA] 전역변수 설정하기. Public 문, Private 문 imagefile [레벨:30]아별 2008-07-01 14093
29 [엑셀VBA] 네이버 지식인 답변 _ 엑셀 쿼리를 이용해서 펀드 기준가 데이터를 읽어오기. file [레벨:30]아별 2008-04-30 9169
28 엑셀 추가 기능 만들기 [레벨:30]a☆ 2006-01-19 7373
27 메모 입력할때 사용자 이름 제거하고 입력하기.. [레벨:30]a☆ 2006-01-19 5423
26 시트에서 콤보박스 활용하기 file [레벨:30]a☆ 2005-11-12 16761