EXCEL - VBA

Range.AutoFilter Method(7) - 필터된 영역에 붙여넣기(2-2)

별동산 2023. 3. 10. 08:59
반응형

다. 복사할 범위로 여러 셀 지정후 붙여 넣을 범위에 붙여 넣는 매크로 작성

 

CopyRange가 2차원 배열이므로 2차원 배열에 맞게 매크로를 작성하였습니다.

 

Sub FilteredRange_Copy5()
    Range("a2").Select
    If Not ActiveSheet.FilterMode Then Selection.AutoFilter 2, "가락1*"
    
    Set CopyRange = Application.InputBox("복사할 범위를 선택하세요.", Type:=8)
    Set PasteRange = Application.InputBox("붙여넣을 첫번째 셀을 선택하세요.", _
        Type:=8, Default:=Range("a2").Address(0, 0))
    
    Set PasteRange = Range(PasteRange, PasteRange.End(xlDown)).SpecialCells(xlCellTypeVisible)

    Row_limit = CopyRange.Rows.Count
    Column_limit = CopyRange.Columns.Count
    
    i = 1
    For Each c In PasteRange
'        인덱스 값 i가 CopyRange 배열의 1차원 인덱스 값 상한보다 작거나 같다면
        If i <= Row_limit Then
            Range(CopyRange(i, 1), CopyRange(i, Column_limit)).Copy Destination:=c
        Else
            End
        End If
        i = i + 1
    Next
End Sub

 

다. 매크로 설명

다른 부분은 이전 것과 같으므로 생략하고 다른 부분만 설명하겠습니다.

 

Row_limit = CopyRange.Rows.Count : 복사할 범위를 인쇄할 때는 Ubound함수를 사용했는데, 이번에는 행 수를 구하기 위해 Rows.Count 속성을 이용했습니다.
Column_limit = CopyRange.Columns.Count : 마찬가지로 Ubount함수가 아니라, 열 수를 구하기 위해 Columns.Count 속성을 이용했습니다.

 

If i <= Row_limit Then : i가 행 수보다 작거나 같은 동안만 
    Range(CopyRange(i, 1), CopyRange(i, Column_limit)).Copy Destination:=c :

    i행 첫 번째 열부터 열의 개수에 해당하는 열까지 범위로 잡은 후 복사해서 붙여 넣을 범위에 하나씩 붙여 넣습니다.

   여기서 1이란 1열이 아니라 복사할 범위중 첫 번째 열을 의미합니다.

 

 

라. 매크로 실행

 

개발 도구 - 매크로를 누른 후 매크로 목록에서 FilteredRange_Copy5를 선택하고 실행 버튼을 누르면

매크로 이름 목록 및 실행 버튼

 

복사할 범위를 선택하라고 하는데, A25셀부터 K30셀까지 지정하고 확인 버튼을 누릅니다.

 

이번에는 붙여 넣을 첫 번째 셀을 선택하라고 하는데 A2셀을 클릭하고 확인 버튼을 누릅니다.

 

그러면 A25셀부터 K30셀의 내용이 2행부터 9행까지 화면에 보이는 행에만 붙여 넣어집니다.

 

마. 매크로 일부 수정

 

(1) 입력 대화상자 기본 값 지정

붙여 넣을 범위의 첫 번째 셀을 지정하는데 매번 A2셀을 클릭하는 것이 불편하므로 이를 수정하려면

Default값을 A2셀로 지정하면 됩니다.

 

Set PasteRange = Application.InputBox("붙여넣을 첫번째 셀을 선택하세요.", _
        Type:=8, Default:=Range("a2").Address(0, 0))

 

A2셀의 주소를 지정해야 하므로 Address속성을 이용해야 하며,

A2셀 기본(Default) 값 지정

 

Range("a2") 다음의 .Address(0, 0)을 지우면

기본 속성이 .Value이므로 A2셀의 값인 송파구가 입력됩니다.

Range("a2")라고 입력하면 값이 반환됨

 

 

 

바. A열에 빈 열을 삽입하고 실행할 경우

CopyRange(i, 1)이라고 줘서 A열일 경우만 적용되는지 확인하기 위해 A열을 클릭한 후 마우스 오른쪽 버튼을 눌러 삽입 메뉴를 눌러 

 

빈 열을 삽입합니다.

 

개발 도구 - Visual Basic을 눌러 VB Editor를 실행한 후

Range(CopyRange(i, 1), CopyRange(i, 1).End(xlToRight))까지 범위를 잡은 후 마우스 오른쪽 버튼을 눌러 조사식 추가 메뉴를 클릭합니다.

조사식 추가 메뉴

그리고 나서 End키를 눌러 식 맨 오른쪽으로 이동한 후 범위에 해당하는 주소를 알기 위해 .address를 추가하고 확인 버튼을 누릅니다.

조사식 추가 창에서 수식 작성 화면

 

그리고, 조사식 창에서 마우스 오른쪽 버튼을 누른 후 식에 c.address를 입력하고 확인 버튼을 눌러 조사식 2개를 추가합니다.

조사식 창

그리고, 조사식의 값을 알기 위해 왼쪽 기둥을 눌러 중단점을 설정하고, 엑셀로 돌아가서

중단점 설정

 

개발도구 - 매크로를 누른 후 FilteredRange_Copy5를 선택하고 실행버튼을 누릅니다.

 

그리고 나서 복사할 범위로 B25셀부터 L30셀까지 선택하고,

 

 

붙여 넣을 첫 번째 셀을 B2셀을 클릭해서 A2셀을 B2셀로 수정하고 확인 버튼을 누르면

 

VB Editor창이 열리면서 중단점에서 매크로 실행을 멈추고,

중단점에서 실행 멈춤

 

Range(CopyRange(i, 1), CopyRange(i, Column_limit)).Address의 값은 "$B$25:$L$25"로 표시되고,

c.Address의 값은 "$B$2"로 범위 내 첫 번째 셀을 기준으로 잘 표시됩니다.

 

CopyRange(i, 1)에서 1이 A열이 아니라 복사할 범위에서 첫 번째 열을 가리키므로 문제가 없는 것입니다.

 

Selection.AutoFilter 2, "가락1*"에서 2도 필터 영역의 두 번째 필드인 동명을 가리키기 때문에 빈 열이 삽입돼도 문제가 없습니다.

 

표준도구 모음에서 실행 아이콘을 누르면 

Sub 실행 아이콘

 

정상적으로 복사 및 붙여 넣기가 실행됩니다.

 

 

3. 매크로 사용 통합 문서 저장

 

파일을 저장하기 위해 파일 - 저장을 누르면 아래와 같이 VB 프로젝트가 포함되어 있어서 매크로 제외 통합 문서에 저장할 수 없다고 하면서, VB 프로젝트 기능이 포함된 파일을 저장하려면 [아니요]를 누른 후 [파일 형식] 목록에서 매크로 사용 파일 형식을 선택하라고 합니다. 아래 부분의 아니요 버튼을 누르면

VB 프로젝트 포함 파일 저장 여부 문의
VB 프로젝트 기능이 포함된 파일을 저장하려면 [아니요] 선택한 다음 매크로 사용 파일 형식 선택

 

아래와 같은 화면이 나오는데, 파일 형식 부분을 누른 후 Excel 매크로 사용 통합 문서(*.xlsm)를 선택하고 저장 버튼을 누르면 에러 없이 저장됩니다.

Excel 매크로 사용 통합 문서 (*.xlsm) 파일 형식 선택
서울시 지역 시간별 수질 현황(완성7).xlsm
0.02MB

반응형