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

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

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

VBA 조회 수 3952 추천 수 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
번호 제목 글쓴이 날짜 조회 수
공지 공지 [공지] 아별닷컴의 엑셀 질문방 폐쇄합니다. 카페 질문방 이용하세요.. imagefile [레벨:30]아별 2015-04-23 40210
462 VBA sub과function차이 [4] [레벨:2]snail0513 2012-08-07 2145
461 엑셀수식 mid len 함수 질문욤^^ [1] [레벨:5]눈물바다 2012-08-06 1520
460 엑셀수식 시작점 지정에 관한 질문입니다. file [1] [레벨:1]bugi87 2012-08-03 1484
459 엑셀일반 엑셀에서 사진 고정하는 방법 없을까요? [3] [레벨:3]빛의행운아 2012-07-30 12556
458 피벗테이블 피벗테이블 질문입니다... file [1] [레벨:2]Merak 2012-07-30 1736
457 VBA [ XML PARSING ] 오픈 API 관련된 질문입니다. [3] [레벨:2]난호 2012-07-26 2674
456 VBA 조건문을 변수화 하는 방법 [2] [레벨:3]엑셀대단해 2012-07-23 6408
» VBA 필터된 데이터 가져오기 시 문제점 [5] [레벨:3]엑셀대단해 2012-07-23 3952
454 SUMPRODUCT 저자 정리 부분 file [2] [레벨:4]pgpoch 2012-07-17 1709
453 VBA 시트와 차트에 따라 다른 함수 실행? [4] [레벨:3]고독한나그네 2012-07-14 1697
452 기타 만족도 조사 file [2] [레벨:3]빛의행운아 2012-07-09 2460
451 VBA [긴급] Range 범위 "A2:A10" -> 를 변수로 받게 하는 방법.. file [3] [레벨:1]마리너 2012-07-05 4214
450 엑셀일반 일일단위로 순위갱신되는 인터넷 참조 시트 만들기 질문입니다. imagefile [2] [레벨:6]파이스 2012-07-05 1974
449 엑셀일반 엑셀 파일들끼리 연결(??), 호환 이 안돼는거 같습니다. ㅜㅜ imagefile [2] [레벨:3]월전천넘 2012-07-04 3946
448 엑셀일반 폴더이름을 엑셀로 가져오고 싶습니다. imagefile [5] [레벨:1]통통삼겹살 2012-07-03 3438
447 파워포인트연계 엑셀과 파워포인트 _ ppt 연계 자동 업데이트 [3] [레벨:5]눈물바다 2012-07-02 7509
446 VLookup vlookup 의 true 기능 관련. [5] [레벨:3]rynoel 2012-07-02 2702
445 엑셀일반 텍스트 나누기 [1] [레벨:5]눈물바다 2012-06-27 1738
444 VLookup 표에서 해당 값 찾기 질문입니다. file [2] [레벨:3]rynoel 2012-06-26 2257
443 엑셀일반 엑셀 작업한 내용이 안보여요. file [5] [레벨:2]시나브로 2012-06-20 4113