1. FAQ
  2. 엑셀(Excel)
  3. AfterEffects
  4. Premiere
  5. Photoshop
  6. ETC

이 게시판은 아별닷컴 회원만 질문을 올릴 수 있습니다. 회원에게 주어지는 특권인셈이지요. 회원이 아닌 분들은 열람만 가능합니다.

필터된 데이터 가져오기 시 문제점

VBA 조회 수 4041 추천 수 0 2012.07.23 17:50:58

안녕하세요 오랫만에 방문하여 질문을 드리네요.

잘 계시죠?? ^^


문의드립니다~ _DB에서 원하는 목록만 불러오기(고급필터)

2010.03.22 10:55:05


위의 질문이 제가 드릴 내용과 똑같은 질문이네요.

잘 보았구요. 저도 이미 비슷하게 작성을 하였는데 한가지 문제가 있어요.

필터를 통해 원하는 데이터를 DB로 부터 가져오려고 작성을 하였는데 필터 조건에 따라 필터된 데이터가 없는 경우가 있습니다.

이럴 경우 아별님의 코드는 에러가 나고 저는 필터가 풀려서 필터링 안된 데이터가 조회되고 있습니다.

해결책이 무엇일까요?

고견을 부탁드립니다.


엑셀대단해 배상.


------------------------------

참고로 제가 작성한 일부 코드입니다.


' ### 테이블명과 쿼리 문자열을 주면 그 테이블 시트에서 조건에 따라 각 컬럼을 필터링하여 그 결과를 배열에 전체 Row를 저장하는 기능(Function)

Function Data_Query(ByVal tbl_Name As String, ByVal Query_Str As String)

    Dim MyObj As Variant

    Dim m As Integer

    Dim TRng As Range

    

    ' ## Query String을 Parsing하여 Col과 조건문자열의 갯수를 파악하여 QueryParsing을 ReDim하고

    ' ## Col과 조건문자열을 각각 QueryParsing 배열에 저장한다.

    ' ## Query 문 예제 : "[A]=[B],[C]=[D]" 조건문자열에는 문자면 ''로 묶고 숫자면 그대로 숫자를 입력한다. = 은 안 넣어도 무방함

    

    ' ## Query 문자열 내에 " 가 있으면 ' 로 변경. 조건 문자열로 묶을 경우 " 는 중복이 일어나기 때문임

    Query_Str = WorksheetFunction.Substitute(Query_Str, Chr(34), "'")

    QueryParsing = Parse_Str(Query_Str) '// 조건문을 파싱하는 Function

    

    ' ## 지정한 테이블 시트의 Data 영역과 Col 영역을 설정

    Set AllRng = Worksheets(tbl_Name).UsedRange

    Set ColRng = Worksheets(tbl_Name).Range(Worksheets(tbl_Name).Cells(1, 1), Worksheets(tbl_Name).Cells(1, AllRng.Columns.Count))

    AllRng.AutoFilter

    

    For n = 1 To AllRng.Columns.Count               '// AllRng의 헤더영역을 반복하고 파싱한 배열을 반복해서

        For m = 1 To UBound(QueryParsing, 1)        '// 컬럼명이 일치하고 조건문이 비어있지 않을 경우 필터링을 설정하는 기능

            If QueryParsing(m, 1) = AllRng.Cells(1, n) And QueryParsing(m, 2) <> "" Then

                AllRng.AutoFilter Field:=n, Criteria1:=QueryParsing(m, 2)

            End If

        Next

    Next


    Set DataRng = AllRng.Offset(1).Resize(AllRng.Rows.Count - 1)            '// 헤더 로우를 제외시킴


    Worksheets("Temp_Save").UsedRange.Clear

    

    Set TRng = Worksheets("Temp_Save").Cells(1, 1).End(3)(1)                 '// Temp_Save 시트에 DataRng의 데이터를 저장할 임시 영역을 설정함

    DataRng.Copy TRng                                                       '// DataRng의 데이터를 임시영역인 TRng로 이동 (즉, Temp_Save 시트에 쓰기가 됨)

    Set DataRng = Worksheets("Temp_Save").Range("A1").CurrentRegion          '// Temp_Save 시트에 스여진 데이터를 다시 DataRng로 읽어들임

    

'## 여기도 문제인데요 필터링한 범위를 바로 리턴하면 필터링된 데이터가 풀려서 전 데이터 범위가 넘어가는 현상이 발생하여 어쩔 수 없이 임시저장시트(Worksheets("Temp_Save"))를 지정하여 한번 스기를 한 후에 다시 그 영역을 설정하여 리턴하고 있습니다. ==> 뭔가 잘못한 부분이 있는 것 같아요.

' ## 그리고 이 경우 위에 말한 것 처럼 필터링한 데이터가 없는 경우 (조건 자체가 그런 것임)에는 필터링 안된 전 데이터가 리턴된답니다.


    AllRng.AutoFilter                                                       '// Autofiltering을 해제 (토글방식)

    

    Data_Query = DataRng


End Function


댓글 '5'

profile

[레벨:30]아별

2012.07.24 11:27:38
*.104.126.21

엑셀대단해님..

안녕하세요? 오랫만이시네요.. ^^

잘지내시는지요..? ㅎㅎ 저는 잘 지냬고 있습니다. ^_^;

 

1. 참고하셨던 문서의 첨부파일을 에러처리를 보완 후에 다시 첨부하였습니다.
   바로가기 : http://www.abyul.com/zbxe/73991

 

2. 해당 조건이 없으면 필터링이 안된 데이터가 조회되는 로직으로 구현하셨네요..
   AutoFilter문이 있는 곳에 Counter를 넣어서.. Counter가 1보다 작으면 해당 데이터가 없다고 메시지를 띄우거나 하시면 될 것 같습니다.


3. 필터링한 범위를 바로 리턴하면 전체 데이터가 넘어가는 현상..
   화면에 보이는 셀만 선택하는 SpecailCells를 사용하시면 됩니다.

   DataRng.SpecialCells(xlCellTypeVisible).Copy TargetRange


도움이 되셨기를..

 


되도록이면 엑셀파일을 첨부해주시길.. ^^

 

 

[레벨:3]엑셀대단해

2012.07.24 20:32:12
*.173.111.3

아별님 안녕하세요.

여전히 친절하게 잘 알려주시네요. 감사합니다.


근데 새로 올려주신 코드에서 아래 부분을 제 코드에 설정하였는데 계속 에러만 나네요.

(셀이 없다는 에러 메시지)


    If rngAutoFilter.SpecialCells(xlCellTypeVisible).Cells.Count = 6 Then

        MsgBox "조건에 해당하는 값이 없습니다."


Autofilter와 AdvancedFilter의 기능 차이 때문인가요? 알 수가 없네요.


정리하자면 위에서 주신 해결책 중

1. 에러처리를 하신 부분이 저는 안되구요

2. 해당조건이 없으면 필터링 안된 데이터가 조회되는 로직으로 구현되었다는데 시트에서는 틀림없이 필터링은 잘 되거든요. 데이터를 조회하는 부분에서 문제가 있는 것 같은데 잘 모르겠습니다.

3. 마지막 DataRng.SpecialCells(xlCellTypeVisible).Copy TargetRange 이 문장도 저는 해당조건이 없는 경우 셀이 없다는 이유로 에러만 납니다.


범위나 명령에 대한 깊은 이해가 부족해서인 것 같습니다.


죄송하지만 파일을 올리니 한번 봐주시기 바랍니다.

파일을 첨부하지 않은 이유는 코드가 정리가 안되어 좀 지저분해서 입니다.


제 파일을 보는 방법은 

1. Input_Sht 시트에서 양식만들기 버튼을 누르면 tbl_Eng_Labor DB를 필터링하여 그 데이터를 뿌려줍니다.

   현재 Project No = "P2012001"이면 조건에 맞는 데이터가 있는 상태이고

2. tbl_Project의 Project 선택 버튼을 눌러 프로젝트를 P2012002로 바꾸면 조건에 맞는 데이터가 없습니다.

  이 경우 계속 전체 데이터가 나타나거나 에러가 발생하고 있습니다.


아별님의 도움이 절실하네요. 그럼 부탁드립니다.

첨부
profile

[레벨:30]아별

2012.07.25 14:39:36
*.104.126.21

제가 제시했던 코드는..

자동 필터된 최종 결과가 헤더만 있을 경우에는 없다고 표시하라는 의미였습니다.

If rngAutoFilter.SpecialCells(xlCellTypeVisible).Cells.Count = 6 Then

 

엑셀대단해님이 코드에 적용하신 것은..

헤더를 일단 제외한 다음에 저 코드를 적용하려 했기 때문에 에러가 난 것입니다.

헤더를 제외하기 전에 저 코드로 필터된 내용이 있는지 확인하면 될 것 같네요..

 

    '### 필터된 결과가 헤더만 있을때는 임시 공간에 False를 채워넣는다. by abyul.com 2012.07.25
    If AllRng.SpecialCells(xlCellTypeVisible).Cells.Count = AllRng.Columns.Count Then
        Range(TRng, TRng.Offset(0, 1)) = Array(False, False) '### 필터링한 결과가 없으면 False를 채워넣는다.
    Else
        Set DataRng = AllRng.Offset(1).Resize(AllRng.Rows.Count - 1)            '// 헤더 로우를 제외시킴
        DataRng.SpecialCells(xlCellTypeVisible).Copy TRng                        '// DataRng의 데이터를 임시영역인 TRng로 이동 (즉, Temp_Save 시트에 쓰기가 됨)
    End If

 

main 함수에서 아래처럼 첫번째 값이 False인 경우에 해당 값이 없다고 하고 종료하면 되겠습니다.

Sub Eng_Labor_Form_make()

    If Temp_DataSet(1, 1) = False Then
        MsgBox "해당 하는 데이터가 없습니다."
        Exit Sub
    End If

 

 

자세한건 첨부파일을 참고하세요..

다운받기 : Test-1.xlsm

 

 

** 역시 엑셀파일을 첨부해주시니.. 답변하기가 쉽네요..

    앞으로 질문하실거면 엑셀 파일을 꼭 좀 첨부해주세요.. ^^

 

 

첨부

[레벨:3]엑셀대단해

2012.07.24 21:24:37
*.173.111.3

일단 


On error goto Handler

DataRng.SpecialCells(xlCellTypeVisible).Copy TRng

' .....


Handler:

Msgbox "조건에 맞는 데이터가 없습니다. 종료합니다"

End


이런 방식으로 에러가 나는 것은 막고 메시지로 처리하여 급한 불은 껐습니다.

ㅜㅜ!

profile

[레벨:30]아별

2012.07.25 14:44:24
*.104.126.21

일단 저렇게 하셔도 되지만..

중간에 다른 코드에서 에러가 나도 데이터가 없어서 종료되는 것처럼 되는 문제가 있을 수 있겠네요..

에러가 없는 상태로 되돌리는 On Error GoTo 0 문을 활용해보세요..

 

On error goto Handler

DataRng.SpecialCells(xlCellTypeVisible).Copy TRng

On Error GoTo 0

On error goto Handler2

' .....


Handler:

Msgbox "조건에 맞는 데이터가 없습니다. 종료합니다"

Exit Function

 

Handler2:

Msgbox "뭔가 다른 이유.."

Exit Function

 

 

문서 첨부 제한 : 0Byte/ 2.00MB
파일 제한 크기 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
공지 공지 [공지] 아별닷컴의 엑셀 질문방 폐쇄합니다. 카페 질문방 이용하세요.. imagefile [레벨:30]아별 2015-04-23 41590
821 엑셀일반 엑셀파일 비밀번호 단체 설정 가능한가요? [30] [레벨:4]쟈니 2012-06-18 53975
820 엑셀일반 회원만 질문을 올릴 수 있습니다. [레벨:30]아별 2010-09-21 33216
819 기타 [필독] 질문시.. 엑셀 파일 첨부, 윈도우버전과 엑셀버전 표기, 답변 받으면 피드백 댓글 꼭 달기.. [레벨:30]아별 2011-08-11 26755
818 엑셀일반 행높이 최대치 조절 가능할까요? _ Excel 사양 및 제한 [3] [레벨:6]파이스 2012-06-01 14609
817 엑셀 웹커리에서 URL 바꾸기 매크로 질문 [1] [레벨:1]밥사마 2009-09-01 13274
816 엑셀- sumif와 sumcol 혼용사용에 대해서 (급해요) [1] 아놔 2009-07-31 12944
815 엑셀일반 엑셀에서 사진 고정하는 방법 없을까요? [3] [레벨:3]빛의행운아 2012-07-30 12621
814 제가 해외 사우디에서 파일을 받았는데 글씨가 계속 깨짐니다. file [1] [레벨:0]홍콩중국홍콩 2010-05-10 10912
813 또 다시 질문이 있어서 왔습니다. (일자별 관리시트에서 이전 시트 값(전일 잔액 등) 자동 불러오기) file [1] [레벨:3]harcz 2010-05-22 10874
812 엑셀수식 3차 방정식 풀기. [1] [레벨:3]rynoel 2012-06-13 10811
811 엑셀에서 지수값 계산하기 [1] [레벨:2]양다원 2009-07-21 10409
810 셀색깔별로 합계를 내고 싶습니다. file [1] [레벨:1]지민 2010-04-09 10395
809 엑셀에서 복사할 때 행 및 열넓이까지 그대로 복사하는 방법 [7] [레벨:2]만쥬 2010-12-07 10203
808 엑셀일반 셀 안에 삽입된 이미지의 정가운데(가로+세로)정렬 방법이 궁금합니다. [6] [레벨:6]파이스 2011-10-11 9942
807 엑셀 주식형 차트 2009-08-17 9941
806 VBA 엑셀 열 추가 _ 엑셀의 마지막 셀 재 인식시키는 팁 ActiveSheet.UsedRange.Select imagefile [1] [레벨:5]눈물바다 2009-08-27 9935
805 엑셀에서 특정데이터 불러오기 [1] [레벨:1]쒸뱅이 2009-07-17 9893
804 두 자료를 비교하여 같은 값을 다른 시트에... file [1] [레벨:1]프로도 2010-05-11 9712
803 시트 이동/복사 시 나오는 에러에 대해 질문드립니다 [1] [레벨:1]잔차 2010-02-10 9683