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

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

조회 수 11224 추천 수 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
번호 제목 글쓴이 날짜 조회 수sort
공지 기타 엑셀 VBA 간단한 팁 모아놓기.. +_+ [레벨:30]아별 2007-01-24 33819
64 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 _ 윈도우 도움말 file [레벨:30]아별 2017-04-21 39350
63 [펌] Visual Basic (비쥬얼 베이직) 함수 정리 imagefile [레벨:30]아별 2009-11-27 20068
62 시트에서 콤보박스 활용하기 file [레벨:30]a☆ 2005-11-12 16709
61 메시지 박스 대용으로 Shape 사용하기 file [레벨:30]아별 2009-05-07 16045
60 기타 [펌] 엑셀 VBA 총정리 _ Excel 개체 모델 참조 등 image [2] [레벨:30]아별 2010-03-09 15919
59 [VBA] 전역변수 설정하기. Public 문, Private 문 imagefile [레벨:30]아별 2008-07-01 14019
58 엑셀에서 사용하는 언어 확인하기. file [1] [레벨:30]아별 2009-06-03 13776
57 기타 [펌] VBA 공부를 시작하시는분들에게 추천하는 강의자료 imagefile [4] [레벨:30]아별 2011-03-21 13698
56 기타 [Excel VBA] 피벗테이블(PivotTable)을 VBA로 컨트롤해보자.. [레벨:30]아별 2008-12-19 12076
» [엑셀VBA] 자동필터를 매크로로 구현하기 [레벨:30]아별 2008-08-28 11224
54 엑셀에서 달력 집어 넣기.. [1] [레벨:30]a☆ 2004-10-21 10947
53 엑셀2007에서 셀의 색상을 RGB로 뽑아내기 file [레벨:30]아별 2009-10-06 10197
52 엑셀의 유저폼 관련 [1] [레벨:30]a☆ 2004-10-21 10049
51 엑셀에서 줄바꿈에 대해서.. 줄바꿈하기 제거하기 등등.. [레벨:30]a☆ 2004-11-15 9992
50 기타 [링크] VBA로 파일을 다루는 방법에 대한 강좌들을 모아놓은 겁니다. [레벨:30]아별 2010-03-03 9832
49 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 file [2] [레벨:30]아별 2011-10-05 9219
48 [엑셀VBA] 네이버 지식인 답변 _ 엑셀 쿼리를 이용해서 펀드 기준가 데이터를 읽어오기. file [레벨:30]아별 2008-04-30 9120
47 기타 VBA _ 레지스트리 다루기 ( registry control ) imagefile [레벨:30]아별 2011-03-19 8672
46 [10/19일 수정] 엑셀 매크로 수정하기... [2] [레벨:30]a☆ 2003-09-29 8250