-
엑셀 매크로 (VBA) - 001. 특정 행을 복사하여 삽입하기Excel/Excel 매크로 2022. 8. 12. 22:34728x90
작업하다가 VBA를 사용할 일이 많아서, 기본적인 내용 및 해왔던 내용들을 정리해 봅니다.
전체 목차
- 001. 특정 행을 복사하여 삽입하기
- 002. 선택하여 붙여 넣기 기능 정리
- 003. 변수/Assignment/Loop/비교
- 004. 데이터가 있는 셀의 범위 알아내기
- 005. 데이터 시트(쉘) 순회하기
- 006. 셀 병합 하기
- 007. 변수에 저장되어 있는 데이터 확인하기 (디버그 기능)
- 008. 정렬하기 (Sort)
- 009. 버튼 컨트롤 (Excel Form vs. ActiveX)
- 010. 콤보 상자 컨트롤 (Excel Form vs. ActiveX)
- 011. 확인란/옵션단추 컨트롤(Excel Form vs. ActiveX)
- 012. 스핀단추 컨트롤(스피너, Excel Form vs. ActiveX)
- 013. 자동필터(Auto Filter)
- 014. 함수(function) (전편)
- 015. 함수(function) (후편)
- 016. 중복 데이터 제거하기
- 017. 텍스트 나누기 (공백, 특수문자)
- 018. Vlookup으로 데이터 조회하기(주식 종목 코드 조회)
- 019. 런타임 에러 처리 (1)
- 020. 런타임 에러 처리 (2)
- 020. 인풋박스 (InputBox) 사용 방법
포스트 목차.
01. 엑셀에서 개발도구 사용 설정- 엑셀을 실행 후 파일 메뉴를 클릭한다.
- 이후 하단에 있는 옵션 메뉴를 클릭한다.
엑셀의 파일 메뉴를 클릭하면 위와 같은 세부 메뉴에 접근할 수 있다. - Excel 옵션 메뉴에 진입 후에 리본 사용자 지정 메뉴를 클릭한다. 오른쪽에 있는 개발도구 앞의 체크박스를 클릭하여 개발도구를 활성화 한다.
- 엑셀의 메인 화면으로 돌아가서 개발도구 메뉴가 보이면 성공이다. 왼쪽의 Visual Basic을 클릭하면 편집기를 실행 할 수 있다.
02. 해결해야하는 문제 설명
작업 전
작업 후- [작업 전] 시트에 있는 4번째 행의 데이터를 동일하게 5개 복사하여, 총 6개의 중복 데이터를 만든다.
03. 문제 해결을 위한 도구 설명- Range 객체
하나 또는 그 이상의 연속된 셀을 나타내는 객체이다.
엑셀의 셀 영역을 지정하는 함수들이 Range 객체를 반환한다.
- ActiveCell 속성
활성화되어 있는 엑셀 프로그램에서 선택되어 있는 셀을 나타낸다.
선택되어 있는 셀이 단일 셀이 아닐 경우 좌측 최상단의 셀을 나타낸다.
셀을 나타내기 위해 Range 객체를 반환한다.
- 범위 선택
Range 객체에서 Select를 이용하면 범위 선택이 가능하다.
실제 엑셀에서 마우스 또는 방향키로 범위를 선택하는 것과 동일한 기능
- Offset
Range 객체의 위치를 바꾼다.
Offset(x,y): x 만큼 아래 행으로 이동 (음수 값의 경우 위로), y 만큼 오른쪽 열로 이동 (음수 값의 경우 왼쪽)
Range가 단일 셀이 아닐 경우 좌측 최상단의 셀을 기준으로 위치를 바꾼다.
ActiveCell, Offset, 범위선택의 사용 예)
1234'활성화되어 있는 셀을 선택한다.ActiveCell.Select'활성화되어 있는 셀에서 5행 밑에 있는 셀을 선택한다.ActiveCell.Offset(5,0).Selectcs - Rows
Rows 엑셀에서 행을 특정하는 Range 객체를 반환한다.
Rows(n): n번째 행
Rows("n:m"): n번째 행부터 m번째 행까지의 영역
Rows의 사용 예)
12'활성화 셀에서 밑으로 4개의 행을 선택한다.ActiveCell.Rows("1:4").Selectcs - EntireRow
Range 객체와 함께 사용하고, 행을 구성하는 전체 열을 포함하고 있는 Range 객체를 반환한다.
EntireRow의 사용 예)
12'Sheet1이란 이름의 시트의 1번에서 3번까지의 행을 선택한다.Worksheets("Sheet1").Rows("1:3").EntireRow.Selectcs - Insert
셀이나 셀의 범위를 삽입한다.
Insert Shift:=[옵션값] CopyOrigin:=[옵션값]
다음과 같은 파라미터를 가지며, 모든 파라미터가 생략 가능하다.
*Shift: 삽입하면서 기존에 있던 셀을 어떤식으로 이동시킬지를 나타낸다.
xlShiftToRight, xlShiftToDown를 사용할 수 있다.
*CopyOrigin: 삽입할 때 셀의 포멧이 복사되는데, 어떤 셀을 참조하여 복사할지를 정한다.
xlFormatFromLeftOrAbove, xlFormatFromRightOrBelow 두개의 값을 가질수 있으며,
왼쪽또는 위의 셀을 참조할지, 오른쪽 또는 아래의 셀을 참조할지 정한다.
Insert의 사용 예)
12'선택된 영역을 기준으로 데이터를 삽입하며, 기존 데이터를 밑으로 이동시키고, 위쪽/왼쪽 셀의 포멧을 따른다.Selection.Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromLeftOrAbovecs - Selection
현재 선택되어 있는 셀 또는 셀의 범위를 가져온다. Range 객체를 반환한다.
- Copy
Range 객체와 연동하여 해당 Range를 복사한다.
다음과 같은 파라미터를 가지며, 모든 파라미터가 생략 가능하다.
- PasteSpecial
Range 객체와 연동하여 해당 Range에 붙여넣기를 실행한다.
PasteSpecial Paste := [옵션값] Operation := [옵션값] SkipBlanks := [옵션값] Transpose := [옵션값]
*Paste: XlPasteType의 값들 (선택하여 붙여넣기의 붙여넣기 속성에 해당)
*Operation: XlPasteSpecialOperation의 값들 (선택하여 붙여넣기의 연산에 해당)
*SkipBlanks: True일 경우 내용이 없는 셀을 카피 하지 않는다. (선택하여 붙여넣기의 내용 있는 셀만 붙여넣기)
*Transpose: True일 경우 열과 행을 바꿔서 복사한다. (선택하여 붙여넣기의 행/열 바꿈)
04. 코드 설명 및 실행 결과이제 Visual Basic 편집기를 실행하고, 현재 작업 중인 파일(프로젝트를 선택 후 오른쪽 클릭을 하여 모듈을 삽입한다)
모듈에 다음과 같은 코드를 넣고 저장한다.
123456789101112131415161718'매크로의 Sub으로 매크로의 정의를 시작한다.'RowCopy 부분에는 정하고자 하는 매크로의 이름을 쓰면 된다.Sub RowCopy()'현재 선택되어 있는 셀을 기준으로 밑으로 5줄 전체를 선택한다.ActiveCell.Rows("1:5").EntireRow.Select'선택된 영역에 빈 셀을 삽입한다. 셀은 밑으로 밀어내고, 왼쪽/상단의 포멧을 복사한다.Selection.Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromLeftOrAbove'삽입된 영역에서 5줄 밑에 있는 행 전체를 선택한다.ActiveCell.Offset(5, 0).EntireRow.Select'선택 영역을 복사한다.Selection.Copy'현재 선택된 영역에서 위로 5칸 이동한 후, 밑으로 5줄 전체를 선택한다.ActiveCell.Offset(-5, 0).Rows("1:5").EntireRow.Select'선택하여 붙여넣기 기본동작을 수행한다.Selection.PasteSpecialEnd Subcs 복사하고자하는 4번째 행의 첫 셀을 선택한 상태에서, 개발도구>매크로 버튼을 클릭한다.
매크로 리스트중에 RowCopy를 선택하여 실행을 누른다.
실행 후 의도하는 결과를 얻을 수 있는 것을 확인했다.
728x90'Excel > Excel 매크로' 카테고리의 다른 글
Excel 매크로 (VBA) - 006. 셀 병합 하기 (0) 2022.08.18 Excel 매크로 (VBA) - 005. 시트에 있는 데이터(셀) 순회하기 (0) 2022.08.17 Excel 매크로 (VBA) - 004. 데이터가 있는 셀의 범위 알아내기 (0) 2022.08.16 엑셀 매크로 (VBA) - 003. variable/assignment/branch/loop (변수/할당/비교/순환) (0) 2022.08.15 엑셀 매크로 (VBA) - 002. 선택하여 붙여 넣기 기능 정리 (0) 2022.08.13