본문 바로가기
WeekdayLife/excel vba tutorial

[엑셀VBA/초보자] 테스트 코드 [2일차]

by JO_i 2024. 8. 6.

코드 작성하기

코드를 작성하기 전에 내가 작성한 코드가 특정 WORKBOOK(엑셀파일)에서만 실행되는 코드인지, 켜져있는 모든 WORKBOOK(엑셀파일)에서 실행될 수 있는 코드인지 그 범위를 생각해두어야 한다. 그 답은 본인만 알고 있을 것이다.

 

특정 WORKBOOK에서만 실행하기

사전에 작성된 문서의 형태와 틀에 맞게 코드를 작성한 경우, 해당 코드는 다른 문서에서 실행하게 되면 원치 않는 결과를 낳게 될 것이니, 리본메뉴에 실행메뉴를 만든다던지 하는 것은 의미가 없다. 이 때는 내가 작성한 코드(프로시저 또는 함수)를 실행하는 버튼을 이미지 또는 버튼 컴포넌트로 특정 시트 영역에 넣어두는 편이 나을 것이다.

 

TAKE #1

아래와 같은 WORKBOOK > WORKSHEET가 있다고 하자. 내가 하고자 하는 작업은 A1셀의 값을 MODEL로 변경하고, 그 옆 괄호 안에 모델의 수를 넣고 싶다. MODEL(XX) 이런 형태가 될 것이다. 해당 파일의 이름은 mycars.xlsx 이다.

 

 

 

VBA 에디터(VBE)를 켜서 project 창을 확인하면 현재 켜져(활성화) 있는 엑셀 파일들을 확인할 수 있다. VBAProject(mycars.xlsx) 트리 위에서 모듈을 하나 생성해본다. insert > Module 이며, 단축키는 alt > i > m 키를 순서대로 연타하면 된다.

 

 

 

 

새로 생성된 모듈을 더블 클릭하면, 코드 창이 나타난다.

 

 

 

1일차에서 기술한 대로 sub 프로시저이름() 을 입력하고 엔터를 치면 end sub가 자동으로 나올 것이고, 사전 준비는 모두 끝이다. 아래의 코드를 작성해보자.

 

TAKE #2

Model명이 나와있는 영역이 a2~a33이므로 해당 영역을 하나의 object 변수 c1으로 선언해준다. 어려운 말은 다 때려 치고, 그냥 영역을 변수로 참조할때는 set 키워드를 쓴다고 외워두자.

또한 1일차에서 기술한 대로 Range 앞에는 실제로 Application.Thisworkbook.Activesheet가 생각되어있음을 알아두자. 귀찮으니까 일단 다 생략한다.

MsgBox는 Alert창을 호출하는 명령어이다. 여기서는 c1 변수(여기서는 영역)의 count(갯수)를 alert창에 표기하도록 했다.

 

Sub change_a1_value()

    Set c1 = Range("a2:a33")    
    MsgBox c1.Count

End Sub

 

f5키를 눌러서 실행을 하면 아래와 같이, 해당 영역의 셀 개수가 표기됨을 확인할 수 있다. 

 

명령어들은 MS홈페이지에 자세하게 나와있기 때문에 암기하려고 하지말고, 필요할때 그때 그때 찾아보는 것이 훨씬 효율적이다. 모든 명령어를 알고 있는 사람도 없고, 그럴 필요도 없다. 내가 무엇을 하고 싶은지에 집중하는 것이 낫다.

 

TAKE #3

약간의 생각을 해보면, 영역이 지정이 되어있으니, 중간에 행을 추가한다면, 개수도 달라져야 하는데, 위와 같이 코드로는 해결이 불가능하다. 행이 추가되었을때 동적으로 영역을 변경하는 코드로 변경해보자.

Sub change_a1_value()

    Dim num As Integer                        '#1

    num = Range("a2").Offset.End(xlDown).Row  '#2
    Set c2 = Range("a2" & ":" & "a" & num)    '#3
    MsgBox c2.Count                           '#4

    c2_count = c2.Count                       '#5

    Range("a1") = "Model(" & c2_count & ")"   '#6

End Sub

 

 

일단 내가 원하는 것이 무엇인지, 정확하게 판단하는 것이 중요하다. #1번부터 #5번까지는 Model명의 개수를 동적으로 산출하는 코드이고, #6번만 A1셀의 값을 바꾸는 코드이다.

 

#1 num이라는 변수를 정수타입으로 사용하는 것으로 정했다. 사전에 선언하지 않아도 상관없다. 일단 그냥 넘어가도록 한다.

#2 num이라는 변수에 a2셀을 기준으로 값이 들어있는 맨아래 셀의 행번호를 넣었다.

#3 c2 변수를 새로 만들어서, a2부터 aXX 로 설정하고, XX에 위에 만들어 놓은 num 변수를 넣어줬다. 이를 통해서, 값이 들어있는 맨 마지막 셀까지의 범위가 동적으로 설정이 된다.

#4 메시지 박스로 c2로 설정된 범위의 개수를 세어본다. 아마 32개가 될 것이다.

#5 c2의 개수를 c2_count 변수 안에 저장했다.

#6 a1셀의 값을 바꾸는데, Model(XX) 이라는 텍스트 안에 XX 값을 c2_count가 들어가도록 했다.

 

잘 이해가 가지 않아도 상관없다. 필요에 따라 필요한 코드를 하나씩 눈과 손으로 익히면 된다. chatGPT의 도움을 받든 남의 코드를 베끼든 전혀 상관없다. 코드를 치기 전에 설계한 설계도와 맞는다면 이미 성공이다.

 

 

 

 

앞으로 천천히 알아본다.

 

끝.