[엑셀 자동화]엑셀 VBA로 필터링 된 값 시트로 복사하기

엑셀에서 필터 기능은 무척이나 유용한데요. 필터를 통해서 원하는 값을 한번에 살펴 볼 수 있습니다.

 

엑셀 필터

엑셀 자동 필터의 경우 단축키 (Ctrl + Shift + L)을 누르거나 데이터 - 필터에서 선택하여 사용할 수 있습니다.

기본적으로  데이터를 필터링할 때 하나 이상의 열에 있는 값이 필터링 조건에 맞지 않을 경우 전체 행이 숨겨져서 원하는 항목만 볼 수 있는데요. 이 때 조건은 숫자 또는 텍스트 값을 필터링하거나 해당 배경 또는 텍스트에 색 서식이 적용된 셀의 경우 색별로 필터링할 수 있습니다.

 

https://support.microsoft.com/ko-kr/office/%EB%B2%94%EC%9C%84-%EB%98%90%EB%8A%94-%ED%91%9C%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%95%84%ED%84%B0%EB%A7%81-01832226-31b5-4568-8806-38c37dcc180e

 

범위 또는 표의 데이터 필터링 - Microsoft 지원

보려는 데이터에만 집중할 수 있도록 필터를 사용하여 표에서 일부 데이터를 일시적으로 숨길 수 있습니다. 데이터 범위 필터링 범위 내에서 아무 셀이나 선택합니다. 데이터 > 필터를 선택합니

support.microsoft.com

 

이러한 필터 기능은 사실 엑셀을 사용한다면 거의 필수적인 기능이라고 할 수 있는데요. 오늘은 이 필터 기능을 VBA를 통해서 간단하게 자동화 하는 방법을 알아보겠습니다.

 

엑셀 VBA로 필터 하기

정말 간단하게 구현하였는데요. 기본적인 원리는 아래와 같습니다.

Sub CopyData()
    Sheets("붙여넣기").Select
    Range("a1").Select
    ActiveSheet.Range("$a$1:$r$110").AutoFilter Field:=5, Criteria1:="실적"
    Range("a1:r109").Select
    Selection.Copy
    Sheets("실적").Select
    Range("a1").Select
    ActiveSheet.Paste

 

기본적으로 제일 먼저 붙여넣기 시트를 선택하고, 가장 위를 선택하고 자동 필터를 걸고 5번째 구분에서 "실적"을 자동필터 합니다.

 

그리고 전체 영역을 선택하여 복사(copy)한 다음 목적 시트를 선택하고, a1에 가장 위를 선택하고 붙여넣기(paste)하였습니다.

동일한 내용을 ChatGPT에게도 물어봤는데요.

 

여기서 마지막 행을 찾는 함수가 추가되었습니다.

 

Sub FilterAndCopyPerformanceData()
    Dim sourceSheet As Worksheet
    Dim targetSheet As Worksheet
    Dim lastRow As Long
    Dim filterRange As Range
    Dim copyRange As Range
    
    ' 시트 설정
    Set sourceSheet = ThisWorkbook.Sheets("원본 시트 이름") ' 실제 원본 시트 이름으로 변경해주세요.
    Set targetSheet = ThisWorkbook.Sheets("실적")
    
    ' 목적지 시트 초기화
    targetSheet.Cells.ClearContents
    
    With sourceSheet
        ' 원본 시트에서 마지막 행 찾기
        lastRow = .Cells(.Rows.Count, "r").End(xlUp).Row
        
        ' 필터링할 범위 설정
        Set filterRange = .Range("A1:R" & lastRow) ' 필터링할 열 범위를 조정해주세요.
        filterRange.AutoFilter Field:=5, Criteria1:="실적" ' 3번 필드(C열)를 기준으로 "실적" 필터링
        
        ' 필터링된 데이터 범위 설정 (제목 행 제외)
        On Error Resume Next ' 필터링된 데이터가 없을 경우를 대비
        Set copyRange = filterRange.SpecialCells(xlCellTypeVisible)
        On Error GoTo 0 ' 오류 핸들링 초기화
        
        ' 필터링된 데이터가 있다면 복사 후 붙여넣기
        If Not copyRange Is Nothing Then
            copyRange.Copy Destination:=targetSheet.Range("A1")
        End If
        
        ' 필터 해제
        .AutoFilterMode = False
    End With
End Sub

 

원본 시트(sourceSheet)와 목적지 시트(targetSheet)를 설정합니다.
목적지 시트의 내용을 초기화합니다.
원본 시트에서 필터링할 데이터의 마지막 행을 찾고, 필터링할 전체 범위를 설정합니다.
"C" 열(Field:=3)에서 "실적"을 기준으로 데이터를 필터링합니다.
필터링된 범위에서 데이터가 있는 셀들만을 찾아(xlCellTypeVisible) 목적지 시트로 복사합니다.
마지막으로 필터를 해제합니다.
이 스크립트를 사용하기 전에, 몇 가지 사항을 확인하고 조정해야 할 수 있습니다:

"원본 시트 이름"을 실제 데이터가 있는 시트의 이름으로 변경해야 합니다.
필터링할 범위인 Set filterRange = .Range("A1:C" & lastRow) 부분에서, "A1:C"는 필터링하고자 하는 열 범위를 나타냅니다. 필요에 따라 조정할 수 있습니다.
이 코드는 "실적" 시트가 이미 존재한다고 가정합니다. 만약 없다면, VBA를 실행하기 전에 시트를 생성해야 합니다.
VBA 코드를 실행하려면, 엑셀에서 개발자 탭을 열고 "Visual Basic"을 클릭한 후, "삽입" > "모듈"을 선택하여 새 모듈 창에 위 코드를 붙여넣고, F5 키를 눌러 실행합니다.

 

제목행 추가는 아래 코드중 filterRange.SpecialCells(xlCellTypeVisible)을 사용하여 필터링된 데이터 셀만을 복사 범위로 설정한 것을 .UsedRange.Offset(0).SpecialCells(xlCellTypeVisible)을 사용하여 제목 행을 포함한 필터링된 데이터 전체를 복사 범위로 설정합니다. 이렇게 하면 필터링된 데이터와 함께 제목 행도 함께 복사됩니다.

 

그럼 잘 사용하시기 바랍니다.