DIM 선언 문법 👉 DIM (만드려는 변수) as (데이터 타입) ────────────────────────────────────────────
❓ DIM과 같이 쓰이는 VBA의 개체
1️⃣통합문서 : Dim (변수) As Workbook ① Set (변수) = ThisWorkBook : 현재 통합문서 ② Set (변수) = ActiveWorkBook : 현재 실행 중인 또다른 통합문서 ③ Set (변수) = Application.Workbooks.Open(경로) : 경로에 있는 특정한 파일의 통합문서
──────────────────────────────────────────── 2️⃣ 시트 : Dim (변수) As Worksheet ① Set (변수) = ActiveSheet : 현재 활성화된 시트 ② Set (변수) = 통합문서.WorkSheets("시트 이름" or 순번) : 통합문서 안에 있는 어떠한 시트 ③ Set (변수) = Sheet1 : VBA의 편집기에서 정의한 고유한 시트의 이름 : Sheet1 (1월매출)
──────────────────────────────────────────── 3️⃣ 범위 : Dim (변수) As Range ① Set(변수) =시트.Range("A1:A2") : 특정 시트의 범위 ② Set(변수) = 시트.Cells(행번호, 열번호) : 시트 내의 행, 열번호에 있는 범위 ③ Set(변수) =Selection : 현재 선택된 범위
Set
데이터 타입이 값이 아닌 경우 변수 앞에 Set을 붙임
❓ 데이터 타입의 종류
──────── 값 ──────── ① 논리값 : Boolean ② 정수 (0) : Long ③ 실수(0.00) : Double ④ 문자 : String
─────── 그 외 ─────── ⑤ 개체, 범위 등 : Object, Variant, Range ...
For
1 ~ n까지 작동하는 반복문
For 문법 👉 For (변수) = n tom - 반복할 행위 - next 👉 For Each (변수) in (반복할 범위) - 반복할 행위 - next ──────────────────────────────────────────── 😀 예제 1 : i가 1에서 10이 될 때까지 / 메세지 박스 i 를 반복한다. For i = 1 To 10 Msgbox i Next
──────────────────────────────────────────── 😀예제 2 : i가 1에서 10이 될 때까지 / 워크시트 범위(A&i)의 값을 i로 설정 하는 것을 / 반복한다. Fori = 1To10 Ws.Range("A"&i).Value = i Next
──────────────────────────────────────────── 😀예제 3 : 문서의 워크시트들을 차례대로/ 워크시트의 이름을 메세지 박스로 출력하는 것을/반복한다. For EachWS In WB.WorkSheet Msgbox WS.Name Next
──────────────────────────────────────────── 😀예제 4 : 워크시트의 (A1:A10) 범위를 차례대로/ Rng의 값에 Rng의 주소로 설정하는 것을 /반복한다. ForEachRngInWS.Range("A1:A10") Rng.Value = Rng.Address Next
IF
"만약 ~ 라면, 참은 ~ 이고, 거짓은 ~ 이다"와 같은 조건문
IF 문법 👉 조건이 1개 If(조건) Then(조건의 참 값) Else(조건의 거짓 값) end If
👉 조건이 여러개 If(조건1) Then (조건1의 참 값) Else IF (조건2) Then (조건2의 참 값) Else (조건2의 거짓 값) end If ──────────────────────────────────────────── 😀 예제 1 : 만약 A1 값이 0보다 크다면 / A2셀의 값은 "양수"이고 / 아니라면 A2셀의 값은 "음수"이다.
If WS.Range("A1").Value > 0 Then WS.Range("A2").Value = "양수" Else WS.Range("A2").Value = "음수" End If
──────────────────────────────────────────── 😀 예제 2 : 만약 A1값이 0보다 크면 / A2셀의 값은 "양수"이고 / A1값이 0이라면 / A2셀의 값은 "-"이고 / 아니라면 "음수"이다.
If WS.Range("A1").Value > 0 Then WS.Range("A2").Value = "양수" Else If WS.Range("A1").Value = 0 Then WS.Range("A2").Value = "-" Else WS.Range("A2").Value = "음수" End If
──────────────────────────────────────────── 😀 예제 3 : 문서의 워크시트를 차례대로 / 이름이 5글자 초과이면 / 메세지 박스로 워크시트의 이름을 출력하고 For 반복문을 중지한다. / 아니라면 위 과정을 반복한다.
For Each Ws In WB.WorkSheets If Len(WS.Name) > 5 Then Msgbox WS.Name Exit For End if Next
For Each Rng In WS.Range("A1:A10") If Rng.Value > 80 Then Rng.Value = "Pass" Else Rng.Value = "Fail" End if Next
2️⃣실습
① 장보기 매크로 만들기
▼ DIM 활용하기 ▼
삽입 - 모듈 선택
이미지와 같이 작성하고 실행 버튼 클릭
DIM 선언 문법 👉 DIM (만드려는 변수) as (데이터 타입)
오류창이 뜸 (정상입니다)
▼ 개체, 범위 앞에는 Set 붙이기 ▼
하이라이트 부분을 추가
실행 버튼 클릭시, 결과가 출력됨
❓ 추가한 문구의 뜻은?
Set Rng = Range("A1") : 변수 Rng는 A1셀의 범위이다.
Msgbox Rng : 변수 Rng를 메세지 박스로 출력한다.
👉 Rng = A1셀이기 때문에, 메세지 박스로 A1셀의 값인 "과일 리스트"가 출력 됨
❓ Set을 붙이는 이유
👉 1️⃣ 이론에서 언급했듯이 데이터 타입이 개체, 범위인 경우에는 변수 값 앞에 Set을 붙여줘야 한다. 👉 개체, 범위는 안에 여러가지의 속성을 가지고 있기 때문임
정수, 문자는 속성이 없지만 / 범위엔 속성이 많음 예시를 들자면 🧐 ✅ A1 셀에는 많은 속성들이 존재함! ✅ 설정된 폰트, 폰트 크기, 폰트의 색깔, 적힌 내용, 셀에 채워진 색깔 등 많은 속성들이 A1 셀에 존재함
범위는 여러 속성을 가지고 있다 👉 Set을 붙임! (개인적으로 쉽게 이해할 수 있도록 해석해봤어요😅 이 의미가 아닐 수도 있음!)
② 디버깅 하기
디버깅(debugging) : 만든 프로그램이 정확한지 확인하는 과정, 프로그램의 순서를 살피는 검사
▼ 편집기 레이아웃 세팅 ▼
이미지처럼 화면의 세팅을 먼저 해야 함
보기 - 직접 실행 창 / 지역 창 / 조사식 창 모두 클릭
창을 드래그하여 위 이미지처럼 레이아웃을 세팅함
▼ 한 단계씩 실행하기 ▼
F8 키를 통해 한 단계씩 실행
지역 창에 변수 / 값 / 데이터 타입(형식)이
제대로 출력되어야 함
🙆♀️F8 키는 코드를 한 단계씩 실행합니다.
실행 버튼을 클릭하면 빨간 점이 생긴 곳에서 실행이 멈춤
🙆♀️F9 키는 실행을 정지시키는 코드을 설정합니다.
▼ VBA의 개체 찾아보기 ▼
흔히 쓰는 font와 구성원 bold, color, size를 볼 수 있음
🙆♀️F2 키는 VBA의 개체 라이브러리를 볼 수 있습니다.
🙆♀️F7 키는실행기 창으로 돌아갑니다.
③ DIM과 함께 통합문서, 시트, 범위 사용해보기
▼ 코드 작성하기 ▼
이미지처럼 작성해보자
Subtest() : Tset라는 매크로를 수행한다.
😀 Dim (변수) As (데이터 형식) 😁 Workbook / Worksheet / Range 모두 개체를 뜻함 ▶ Set 사용
Dim WB As Workbook : WB(변수)는 문서파일로 선언한다. Dim WS As Worksheet : WS(변수)는 워크시트로 선언한다. Dim Rng As Range : Rng(변수)는 범위로 선언한다.
Set WB = ThisWorkbook : WB(변수)는 현재 문서 파일이다. Set WS = WB.Worksheets("1월매출") : WS(변수)는 WB의 "1월매출"시트이다. Set Rng = WS.Range("C5") : Rng(변수)는 WS의 "C5" 셀이다.
MsgBox WB.Name : WB(변수)의 이름을 메세지 박스로 출력한다. MsgBox WB.Path : WB(변수)의 경로를 메세지 박스로 출력한다. MsgBox WB.FullName : WB(변수)의 이름과 경로를 메세지 박스로 출력한다. WS.Activate : WS(변수)를 활성화 한다. MsgBox Rng.Value : Rng(변수)의 값을 메세지 박스로 출력한다.
End Sub
▼ 결과값 ▼
Msgbox WB.name의 결과값
Msgbox WB.path의 결과값
Msgbox WB.fullname의 결과값
WS.Activate의 결과값
msgbox Rng.value의 결과값
④ 시트 목차를 작성하는 매크로 만들기
▼ 원하는 위치에 목차 출력하기 ▼
이미지처럼 작성해보자
Sub CreateToc() : CreateToc라는 매크로를 수행한다.
Dim WB As Workbook : WB는 통합문서로 선언한다. Dim WS As Worksheet : WS는 워크시트로 선언한다. Dim i As Long : i는 정수로 선언한다.
Set WB = ThisWorkbook : WB는 현재 통합문서이다. Set WS = WB.Worksheets("목차") : WS는 WB의 "목차" 시트이다.
──────────────────────────────────────────── 😁 검토해봐요 ① MsgBox WB.Worksheets.Count : WB의 워크시트들의 개수를 셉니다. 결과값은 8이 나옵니다. ──────────────────────────────────────────── For i = 1 To WB.Worksheets.Count : i가 1부터 8이 될때까지 반복합니다. (검토해봐요 ① 참고)
──────────────────────────────────────────── 😁 검토해봐요 ② Debug.Print i : 실행기 화면의 직접 실행 창에 i의 결과 값을 보여줍니다. Debug.Print WB.Worksheets(i).Name : 직접 실행 창에 WB의 i 번째 워크시트의 이름 출력합니다. ──────────────────────────────────────────── WS.Range("C" & i).Value = WB.Worksheets(i).Name : 워크시트의 ( C & i )의 값은 워크시트 i의 이름입니다.
Next : For ~ Next 사이의 코드를 반복
End Sub
결과값
▼ 목차에 하이퍼링크 추가하기 ▼
매크로 기록으로 하이퍼 링크를 기록함
1월매출(A3)을 클릭하면 1월매출 시트로 가도록 만들었음
하이퍼링크의 내부 속성들을 잘 기억해두자!
😀 하이퍼링크 문법 (적용할 시트).Hyperlinks.Add (링크를 추가할 셀), (웹페이지 주소 or 파일경로), (선택: 내부시트로 이동시 주소)
내부시트의 주소적는 법 👉 시트이름!A1 : 시트이름의 A1셀로 이동한다는 뜻
적어놨던 for문에 2번째 코드를 삽입
For i = 1 To WB.Worksheets.Count : i가 1부터 8이 될때까지 반복합니다. (검토해봐요 ① 참고)
WS.Range("C" & i).Value = WB.Worksheets(i).Name : 워크시트의 ( C & i )의 값은 워크시트 i의 이름입니다.
WS.Hyperlinks.Add WS.Range("c" & i), "", WB.Worksheets(i).Name & "!A1" : ( C & i )범위의 셀에 워크시트 i 의 이름의 A1로 이동하는 하이퍼링크를 워크시트에 추가합니다.
Next : For ~ Next 사이의 코드를 반복
결과값
⑤ 내용을 찾고 바꾸는 매크로 만들기
▼ 찾을 값 바꿀 값 설정하기 ▼
이미지처럼 작성해보자
Sub FindReplace() : FindReplace라는 매크로를 수행한다.
Dim WS As Worksheet : WS는 워크시트로 선언 Dim FindValue As String : FindValue는 문자로 선언 Dim ReplaceValue As String : ReplaceValue는 문자로 선언 Dim Rng As Range : Rng는 범위로 선언 Dim R As Range : R은 범위로 선언
Set WS = ThisWorkbook.Worksheets("확진자경로") : WS는 현재 문서의 "확진자경로" 시트이다. FindValue = WS.Range("J4").Value : FindValue는 WS의 "J4"셀의 값이다. ReplaceValue = WS.Range("J5").Value : ReplaceValue는 WS의 "J5"셀의 값이다.
R의 역할 🧐 👉 C5:C11 까지 범위라고 설정했으면, R은 C5, C6, C7, C8, C9, C10, C11의 범위를 차례대로 가지게 됩니다.
For Each R In Rng : Rng의 범위를 차례대로 If R.Value = FindValue Then : 만약 R의 값이 FindValue와 같다면 R.Value = ReplaceValue : R의 값은 ReplaceValue이고 R.Interior.Color = 65535 : R의 바탕색은 노란색이다. End If
Next : For ~ Next 사이의 코드를 반복한다.
결과값
3️⃣ 미션
① 시트 목차 작성 매크로
② 찾기, 바꾸기 매크로
③ 보너스 미션 : Xlookup 함수 만들기
Function MyXLookUp (lookup_value, lookup_range As Range, return_range As Range) : MyXLookUp 라는 값을 리턴한다.
👉 MyXLookUp (찾을 값, 찾을 범위, 출력 범위) ✅ lookup_value = 찾을 값 ✅ lookup_range= 찾을 범위 (범위로 선언됨) ✅ return_range = 출력 범위 (범위로 선언됨)
Dim i As Long : i 를 정수로 선언한다. 👉 i = 찾을 범위에서 반복할 순번
For i = 1 To lookup_range.Rows.Count : 1부터 찾을 범위에 있는 행의 개수만큼 If lookup_range.Cells(i).Value = lookup_value Then : 찾을 범위의 i번째 셀의 값 = 찾을 값과 같다면 MyXLookUp = return_range.Cells(i).Value : MyXLookUp는 출력 범위의 i번째 셀의 값이고 Exit Function : 현재 진행 중인 리턴을 종료한다. End If Next : For ~ Next 사이의 코드를 반복한다.