1편에서 작성한 매크로를 실행해보고, 작성된 매크로를 분석해 보겠습니다.
1. 매크로로 기록한 매크로 실행
위 파일을 연 다음, 입력된 내용을 지우고, 매크로를 실행하면 1편에서 작업했던 모든 내용이 순식간에 실행되어 구구단이 화면에 표시됩니다. 처음 보시는 분은 신기할 것입니다.
① A열과 1행 사이 코너를 클릭해서 전체 셀을 선택한 다음
② 마우스 오른쪽 버튼을 누른 다음 삭제 메뉴를 클릭합니다.
③ 그러면, 아래와 같이 입력된 모든 내용이 지워지고, 열 너비도 초기화됩니다.
그러나, Delete키를 눌러 지우면 내용만 지워질 뿐 열 너비는 그대로 유지됩니다.
④ 개발도구 - 매크로 메뉴를 선택하고,
⑤ '매크로1'이란 매크로를 더블 클릭하거나, 클릭한 후 오른쪽 실행 버튼을 클릭합니다. 저는 personal.xlsb(개인용 매크로 통합 문서) 매크로가 있어 목록이 복잡한데, personal.xlsb가 없다면 '매크로1'이란 매크로만 나오는 것이 원칙입니다.
2. 매크로 문 분석
구문을 살펴보면 범위 선택에 관한 것, 값 및 수식 입력, 채우기, 정렬, 복사하여 붙여 넣기, 열 너비 자동 맞춤, 열 너비 입력, 병합하고 가운데 맞춤, 폰트 설정으로 크게 나눌 수 있습니다.
가. 셀 범위 선택
매크로 기록 시는 셀 범위 지정 시 Range 함수만을 사용했는데, 다른 방법도 있습니다. 이것은 프로그램을 이용한 매크로 작성 시 설명하겠습니다.
(1) 한 개 셀 선택
① range("a4").select → a4셀을 선택하는 것입니다. 셀 주소로 열+행 형식을 사용합니다. 다시 말해 열은 알파벳, 행은 숫자를 쓰면 되므로, c5, f5000 식으로 입력하면 됩니다.
VBA에서 대, 소문자는 구분하지 않고 정상적으로 작동합니다. 그러나 예약어(VBA에서 사용하는 명령어, 속성 등)라면 자동으로 대, 소문자로 바꿉니다. 예를 들어 range("a4").select라고 입력하면 Range("a4").Select라고 a4는 소문자 상태로 있지만 range는 Range, select는 Select로 자동으로 바뀝니다.
(2) 두 개 이상의 셀 선택
① 연속된 범위 선택 : Range("A4:E4").Select → a4부터 e4까지의 셀, 다시 말해 연속된 범위를 선택하는 것으로 :(콜론)을 사용합니다.
② 떨어진 2개 셀 선택 : Range("A4,E4").Select → a4셀과 e4셀 2개만 선택하는 것입니다.
③ 떨어진 3개 셀 선택 : Range("A4,C4, E4").Select → a4셀, c4셀, e4셀 3개만 선택하는 것입니다. 떨어진 셀을 연결할 때는 ,(컴마)를 사용합니다.
(3) 두 개 이상의 열 선택
① 떨어진 2개 열 선택 : Range("B:B,D:D").Select → B열과 D열을 선택하는 것입니다. range("b,d").select라고 입력하면 에러가 나니 반드시 b:b,d:d라고 두 번씩 입력해야 합니다.
② 연속된 열 선택 : Range("B:D").Select → B열에서 D열까지 연속된 범위를 선택하는 것입니다. 연속된 범위를 선택할 때는 같은 값을 두 번 입력할 필요가 없습니다.
③ 떨어진 3개 열 선택 : Range("F:F,L:L,R:R").Select → F, L, R열을 선택하는 것입니다. 떨어진 열을 선택할 때는 ,(컴마)를 계속해서 사용하면 됩니다.
(4) 두 개 이상의 행 선택
두 개 이상의 열 선택과 같은데, 알파벳 대신에 행 수인 숫자를 사용하면 됩니다.
① 떨어진 행 선택 : range("3:3,5:5").select → 3행과 5행을 선택하는 것입니다. 계속해서 떨어진 행을 선택할 때는 ,(컴마)를 사용합니다.
② 연속된 행 선택 : range("3:5").select → 3행부터 5행까지 선택하는 것입니다.
나. 값 및 수식 입력
(1) ActiveCell.FormulaR1C1 = "2"
→ ActiveCell에 2라는 값을 입력하라는 의미입니다.
※ 선택된 범위를 지정하는 속성
① ActiveCell : 활성화된 셀로 현재 셀 포인터(빨간 선으로 표시한 부분)가 위치하고 있는 셀입니다.
한 개의 셀을 선택했다고 하면 그 셀이 ActiveCell, 아래 화면에서는 E4셀이고,
범위를 선택했다고 하면 셀 포인터가 있는 셀이 ActiveCell, 아래 화면에서는 A4셀입니다.
② Selection : 선택된 범위를 의미합니다. 한 개의 셀만 선택한 경우는 그 셀을 의미하지만, 여러 셀을 선택한 경우는 선택된 범위를 의미합니다.
③ ActiveCell과 Selection : 아래와 같이 범위를 지정한 경우 A4셀만 흰색으로 표시되고 있는데, 셀 포인터가 있어서 다르게 보이는 것이며, 이 셀이 ActiveCell입니다. 그렇지만, Selection은 a4셀에서 e12셀까지입니다.
아래와 같이 선택된 셀이 떨어져 있는 경우 K5만 흰색으로 표시되고 있으므로 ActiveCell은 k5셀이고, Selection은 g4셀과 k5셀입니다.
(2) ActiveCell.FormulaR1C1 = "=RC[-4]*RC[-2]"
① ActiveCell에 수식 =RC[-4]*RC[-2] 을 입력하라는 의미입니다. 셀 주소가 A1 방식(열은 알파벳, 행은 숫자로 표시하는 방식)이 아니라, R1C1 방식(행인 Row와 열인 Column을 모두 숫자로 표현하는 방식)이라 헷갈리는데, RC[-4]는 R(row) 다음에 아무것도 없으므로 같은 행이라는 것이고, C(column)는 [-4]라는 것이 붙어 있으므로 열을 왼쪽으로 4번 이동하라는 의미입니다. 따라서, 현재 셀이 E4일 경우 RC[-4]는 A4셀이 됩니다. 마찬가지로 RC[-2]는 열만 왼쪽으로 2개 이동하므로, C4셀이 됩니다.
이를 연결하면 ActiveCell인 E4셀의 수식은 =a4*c4가 됩니다.
② 그러나, A1 방식으로도 표시할 수도 있는데, 이 때는
ActiveCell.Formula = "=a4*c4"
로 뒷부분의 수식도 a1방식으로 바꿔주고, FormulaR1C1에서도 R1C1을 빼고 Formula로 바꿔줘야 합니다.
다. 채우기
(1) 셀 복사
Range("A4:E4").Select
Selection.AutoFill Destination:=Range("A4:E12"), Type:=xlFillCopy
→ A4셀에서 E4셀까지의 범위를 A4에서 E12까지 복사하라는 의미입니다. 모든 행이 같은 값이 됩니다.
(2) 연속 데이터 채우기
Range("C4").Select
Selection.AutoFill Destination:=Range("C4:C12"), Type:=xlFillSeries
→ C4셀 값을 기준으로 C12셀까지 값을 연속으로 채우라는 의미입니다.
C4셀 값이 1이라면 1에서 9, 2라면 2에서 10이 됩니다.
라. 정렬
정렬은 수직, 수평 정렬로 구분되고, 수직정렬은 위쪽, 가운데, 아래쪽 맞춤이 있고, 수평 정렬은 왼쪽, 가운데, 오른쪽 맞춤이 있습니다.
예시)
Range("B:B,D:D").Select → B열과 D열을 선택하라
Range("D1").Activate → D1셀을 활성화하라는 것으로 Activecell(활성화된 셀)이 D1셀이 됨
With Selection - 선택된 셀인 Selection을 공통 인수로 사용한다는 것임
.HorizontalAlignment = xlCenter → 선택된 셀의 수평 정렬을 가운데 정렬로 함
.VerticalAlignment = xlCenter → 선택된 셀의 수직 정렬을 가운데 맞춤으로 함
.WrapText = False → 선택된 셀의 입력 값이 열 너비보다 길더라도 '줄 바꿈'은 하지 않음
.Orientation = 0 → 선택된 셀의 텍스트 방향을 수평으로 함
.AddIndent = False → 선택된 셀의 내어 쓰기를 안 함
.IndentLevel = 0 → 선택된 셀의 내어 쓰기 값을 0으로 설정
.ShrinkToFit = False → 선택된 셀을 '셀에 맞춤'하지 않음. 다시 말해 셀의 너비에 맞게 글자 크기를 조절하지 않음
.ReadingOrder = xlContext → 선택된 셀의 읽기 순서를 텍스트 방향으로 함
.MergeCells = False → 선택된 셀의 셀 병합 속성을 거짓으로 설정하므로, 병합 셀인 경우 병합이 풀어짐
End With → With문을 끝냄
(설명)
공통되는 부분은 With를 사용해서 표시하고 End With로 끝납니다.
With Selection이라고 했으므로 Selection이 공통되는 부분이고,
.HorizontalAlignment = xlCenter는
Selection.HorizontalAlignment = xlCenter가 됩니다.
이하 모두 Selection이 앞에 있는 것입니다.
매크로 기록 시 일률적으로 적용되다 보니,
Range("D1").Activate, ".Orientation = 0" 등 불필요한 부분이 많이 있습니다.
직접 매크로를 작성할 때는 필요한 부분만 적으면 됩니다.
마. 복사하여 붙여 넣기
엑셀 작업할 때 가장 많이 쓰는 복사와 붙여넣기를 VBA로 어떻게 작성하는지 보겠습니다.
예시)
Range("A4:W12").Select
Selection.Copy
Range("A15").Select
ActiveSheet.Paste
→ A4셀에서 W12셀을 복사해서, A15셀에 붙여넣기 하겠다는 의미입니다. 그런데 특이한 것은 복사는 Selection.Copy인데, 붙여넣기는 ActiveSheet.Paste로 copy 또는 paste의 앞이 Selection과 ActiveSheet로 다르다는 것입니다.
Range("A4:W12").Copy Range("A15")로 간단히 쓸 수도 있습니다.
바. 열 너비 자동 맞춤
전체 셀을 선택한 후 열과 열 사이의 경계를 더블 클릭하면 열 너비가 자동으로 조절하는데, VBA는 어떻게 하나 보겠습니다.
① 열 너비 자동 맞춤
예시)
Cells.Select
Cells.EntireColumn.AutoFit
→ Cells란 전체 셀을 의미하며, Cells.Select라고 했으므로 전체 셀을 선택한다는 의미이고,
Cells.EntireColumn.AutoFit 은 전체 셀 중 모든 열의 너비를 자동으로 조절하겠다는 의미입니다.
② 행 높이 자동 맞춤
전체 행의 높이를 자동 조절한다고 하면
Cells.EntireRow.AutoFit로 EntireRow만 바꾸면 됩니다.
사. 열 너비 입력
Range("F:F,L:L,R:R").Select
Range("R1").Activate
Selection.ColumnWidth = 5
→ F, L, R열을 선택한 다음 열 너비를 5로 지정하는 것입니다. 두 번째 줄의 Range("R1").Activate는 굳이 있을 필요가 없습니다.
아. 병합하고 가운데 맞춤
이 기능도 엑셀에서 많이 쓰는 기능 중 하나입니다. VBA로는 어떻게 작성하는지 보겠습니다.
예시)
Range("A1:W1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
→ A1셀부터 W1셀까지 선택한 다음 수평, 수직 모두 가운데 정렬(.HorizontalAlignment = xlCenter,
.VerticalAlignment = xlCenter)을 하고, 셀 병합(Selection.Merge)을 하는 것입니다.
나머지 문장은 현재 셀 서식의 맞춤을 초기화하는 것으로, 이미 초기화된 상태이므로 특별한 의미는 없습니다.
엑셀에서는 병합하고 가운데 맞춤으로 되어 있는데, VBA에서는 가운데 맞춤을 먼저 하고 셀 병합을 하는 점이 다릅니다.
자. 폰트 설정
폰트 설정도 중요한 부분 중 하나입니다.
예시)
With Selection.Font → 선택된 범위의 폰트를 공통 인수로 사용하겠다는 의미입니다.
.Name = "맑은 고딕" → 글자체를 맑은 고딕으로 설정
.Size = 16 → 글자 크기를 16으로 설정
.Strikethrough = False → 글자 취소선을 없앰.
.Superscript = False → 위 첨자를 사용하지 않음.
.Subscript = False → 아래 첨자를 사용하지 않음.
.OutlineFont = False → 폰트 외곽선을 없앰.
.Shadow = False → 폰트 그림자를 없앰.
.Underline = xlUnderlineStyleNone → 밑줄을 없앰.
.ThemeColor = xlThemeColorLight1 → 폰트 색을 검정색으로 지정.
.TintAndShade = 0 → 폰트 색의 tint와 shade를 0, 다시 말해 변경하지 않음.
.ThemeFont = xlThemeFontMinor → 아무리 찾아도 모르겠네요. 아시는 분은 댓글 부탁합니다.
End With → with문을 끝냅니다.
Selection.Font.Bold = True → 폰트를 굵게 설정.
매크로 기록 시 폰트 크기를 지정한 다음 굵게를 선택했기 때문에, Selection.Font.Bold 문이 with문 밖에 있는데, with 문 안에 공통된 부분인 Selection.Font이 있으므로 .Bold = True라고 작성해도 됩니다.
이상 매크로로 기록된 구문을 분석해 봤습니다. "아! 그렇구나" 하고 배운 것도 있고, "왜 쓸데없이 들어갔지?" 하고 의문 나는 부분도 있습니다. 어쨌든 이것이 VBA 구문의 기초입니다.
'EXCEL - VBA' 카테고리의 다른 글
구구단 만들기(4) (엑셀 VBA 구구단 프로그램 확장) (0) | 2022.12.13 |
---|---|
구구단 만들기(3) (엑셀 VBA 프로그래밍 기초) (0) | 2022.12.12 |
구구단 만들기(1) (엑셀 VBA의 매크로 기록하기) (0) | 2022.12.08 |
엑셀 VBA - 배열(2) (0) | 2022.12.07 |
엑셀 VBA - 배열(1) (0) | 2022.12.06 |