오빠두엑셀 스터디/VBA 4주 완성

[2주차] VBA를 시작하는 4가지 코드 (Dim / Set / For / If )

취준생 에몽가 2022. 7. 16. 18:50

1️⃣ 이론 ( Dim / Set / For / If )

 

DIM 

변수를 선언할 때 사용함

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 to m - 반복할 행위 - 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로 설정 하는 것을 / 반복한다.

For
 i = 1 To 10
 Ws.Range("A"&i).Value = i
Next

────────────────────────────────────────────
😀 예제 3
: 문서의 워크시트들을 차례대로 / 워크시트의 이름을 메세지 박스로 출력하는 것을 / 반복한다.

For
Each WS In WB.WorkSheet
 Msgbox WS.Name
Next

────────────────────────────────────────────
😀 예제 4
: 워크시트의 (A1:A10) 범위를 차례대로 / Rng의 값에 Rng의 주소로 설정하는 것을  / 반복한다.

For
 Each Rng In WS.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

────────────────────────────────────────────
😀 예제 4
: 워크시트의 (A1:A10)범위를 차례대로 / Rng값이 80 초과라면 / Rng값은 "Pass" / 아니라면 Rng값은 "Fail" 

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과 함께 통합문서, 시트, 범위 사용해보기

▼ 코드 작성하기 ▼

이미지처럼 작성해보자

 

Sub test()
: 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의 결과 값을 보여줍니다.
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"셀의 값이다.

────────────────────────────────────────────
😁 검토해봐요 ①
MsgBox FindValue & ", " & ReplaceValue
: 메세지 박스로 FindValue와 ReplaceValue를 출력한다.
────────────────────────────────────────────

End Sub

 

결과 값

 

 

▼ 선택한 범위에서 값을 바꾸고 바탕색을 변경하기 ▼

표시된 부분이 추가된 코드

Set Rng = Selection
: Rng는 현재 선택한 범위이다.

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 사이의 코드를 반복한다.

End Function