VBA(Visual Basic for Applications)는 MS Office 프로그램을 더욱 강력하게 사용할 수 있게 해주는 도구입니다. 자동화, 데이터 처리, 반복 작업 등을 효율적으로 처리할 수 있지만, 처음 시작할 때는 다소 어려움을 겪을 수 있습니다.
이번 글에서는 VBA를 처음 접하는 분들을 위해 단계별로 익히는 방법과 실용적인 팁을 소개하겠습니다.
1. 처음에는 엑셀 VBA로 시작하세요
VBA를 처음 배울 때는 엑셀에서 시작하는 것이 가장 좋습니다. 엑셀 VBA는 다른 프로그램에 비해 참고 자료가 많고, 실습하기도 쉽기 때문입니다.
참고자료가 풍부하다
엑셀 VBA는 많은 사람들이 사용하고 있어, 다양한 튜토리얼과 예제 코드를 쉽게 찾을 수 있습니다. 이를 통해 원하는 정보를 빠르게 얻을 수 있어 학습 부담을 줄일 수 있습니다.
단적으로 시중에서 VBA에 대한 책을 찾아 봐도 10권중 9권은 엑셀 VBA에 대한 책이고, 인터넷 검색에서 VBA로 검색해 봐도 10건중 9건은 엑셀 VBA에 대한 내용입니다.
매크로 기록 기능이 있다
VBA 뿐만 아니라 프로그래밍에서 모르는 기능을 처음 익히고자 할 때 가장 좋은 방법 중 하나는 누군가가 만든 잘 동작하는 코드를 분석하는 것입니다.
VBA에서는 따로 선생님을 구하지 않아도 참고할만한 코드를 자동을 만들수 있습니다. 엑셀에서 제공되는 매크로 기록 기능을 사용하면, 이것이 가능합니다.
이를 활용하면 복잡한 코드를 직접 작성하지 않아도, 엑셀의 매크로 기록 기능을 통해 서서히 익숙해질 수 있습니다.
메뉴의 개발도구를 보면, 엑셀에서는 매크로 기록 기능이 제공되는 것을 볼 수 있습니다.
반면 파워포인트의 경우 개발 도구로 들어갔을 때 메뉴에서 매크로 기록 기능이 없는 것을 확인 할 수 있습니다.
메뉴에서 개발 도구 버튼이 보이지 않을 경우에는 메뉴의 아무 버튼에서 마우스 우클릭 → 리본 메뉴 사용자 지정으로 들어간 다음
우측 리본 메뉴 사용자 지정에 있는 메뉴 중 개발 도구에 체크를 한 다음 확인을 눌러주면 메뉴에 개발 도구가 추가됩니다.
표 형식으로 데이터 위치 찾기가 쉽다
엑셀은 문서 자체가 표 형식으로 이루어져 있습니다.
이점은 VBA와 같은 프로그래밍을 할 때 매우 큰 장점으로 작용됩니다. 어느 위치에 어떤 값을 넣을지를 정할 때, 그 위치 정보가 매우 명확하기 때문입니다.
엑셀의 경우 아래 이미지와 같이 커서가 위치한 칸에 정확한 값을 입력하고 싶다면,
‘B2’ 라는 주소를 입력 함으로써 데이터를 다룰 정확한 위치를 쉽게 찾을수 있습니다.
반면, 파워포인트의 경우 아래 이미지와 같이 하나의 슬라이드 안에 여러개의 글상자가 있다면, 정확히 내가 편집하고 싶은 개체를 하나 선택하는 것이 까다롭습니다.
이와 같이 엑셀의 경우 필요한 데이터를 찾는 것도, 값을 입력할 위치를 찾는 것도 쉽고 명확하기 때문에 VBA 연습과 실습에 적합한 환경을 제공합니다.
2. 파워포인트와 워드의 VBA 시작은 어떻게?
우리가 VBA를 익히는 이유는 공부를 하기 위함이라기 보다는 실제 내 업무에 활용하기 위함입니다.
VBA에 대한 공부를 하기 가장 유리한 것이 엑셀 VBA였지만, 실제 내 업무에 필요한 영역이 파워포인트나 워드라면, 이 영역을 공부해야만 할 것입니다.
하지만, 파워포인트나 워드 프로그램에 대한 VBA 자료는 상대적으로 적고, 익히기도 어려운 것이 사실입니다.
이런 상황에서는 다음과 같은 해결책을 시도해 볼 수 있습니다.
영문 자료를 참고하자
국내 자료는 부족하지만, 영어로 검색하면 그나마 유용한 자료들을 찾을 수 있습니다.
특히, 처음 입문할 때는 한권 정도는 기본 개념을 다룬 책을 찾아 보는 것도 유용한데, 원서로 찾아보면 이와 관련된 서적을 찾아보는 것이 가능합니다.
개인적으로 추천하는 도서는 “Mastering VBA for Microsoft Office 365” 입니다.
2019년에 나온 책으로 연식이 좀 오래되었다는 단점은 있지만, VBA라는 언어 자체가 큰 변화가 생긴 언어는 아닌 관계로, 기본을 익히기에 좋습니다.
한국에서 이 책을 구하기는 아무래도 어려운 면이 있기에, 저는 전자책으로 보시는 것을 추천합니다. Amazon Kindle 앱을 설치하고, Amazon 사이트에서 구매하시면 읽어보실 수 있습니다.
무료로 Sample 버전을 한번 읽어볼 수도 있으니, 먼저 Sample을 본 다음 내게 필요하고 잘 맞는다는 판단이 들면 그때 구매해 보시길 추천합니다.
또, 한가지 가장 추천하는 사이트는 Microsoft의 공식 VBA Reference 사이트 입니다. 여기서는 MS Office VBA의 각 프로그램별 VBA에 제공되는 여러 Function과 Object에 대한 내용이 빠짐없이 다뤄지기 때문에 막히는 부분이 있을 때 도움을 받을 수 있습니다.
※ 영어의 압박이 있다는 점, 친절함이 좀 떨어진다는 점은 극복해야 할 단점입니다.
짧은 테스트 코드를 작성해보자
간단한 코드를 작성해보고, 개체(Object)와 속성(Properties)이 어떻게 동작하는지 파악하는 것이 중요합니다. 이를 통해 VBA의 구조와 로직을 이해하는 데 큰 도움이 됩니다.
그런데, 파워포인트의 경우 내가 수정하고자 하는 개체와 수정하는 속성의 이름이 어떻게 되는지 이것을 확인하는 것 부터가 상당히 까다롭습니다.
※ 엑셀의 경우 매크로 기록을 이용해 수정하고자 하는 내용을 수정한 다음 코드를 분석하면 개체의 이름과 속성을 확인하는 것이 비교적 쉽습니다.
이 경우, 아래의 코드를 활용하면 조금은 쉽게 확인할 수 있습니다.
Sub Test()
Dim shp As ShapeRange
Set shp = ActiveWindow.Selection.ShapeRange
Debug.Print shp.TextFrame.TextRange.Text
End Sub
개발도구 → Visual Basic 버튼을 클릭하면 Visual Basic Editor 화면이 뜹니다.
좌측에 있는 VBAProject (파일이름)에서 마우스 우클릭 → 삽입 → 모듈을 클릭하면 VBA 코드를 입력할 수 있는 창이 생성됩니다.
생성된 창에 위의 코드를입력한 다음 Debug.Print 앞에 중단점을 만들어 둡니다.
상세한 속성을 알고 싶은 개체를 선택한 상태에서 매크로를 실행하면, 중단점에서 코드가 멈춥니다.
에디터 메뉴에서, 보기 → 조사식 창을 클릭합니다.
소스 코드에서 ‘shp’를 범위를 씌운다음 마우스 드레그 앤드 드랍으로 조사식 창안에 끌고 들어옵니다.
또는 조사식 창 안에서 마우스 우클릭 → 조사식 추가를 선택한 다음 shp라고 입력하고, 확인 버튼을 클릭합니다.
조사식 창에 shp라는 값이 추가된 것을 볼 수 있는데, shp 옆의 + 버튼을 클릭하면 상세한 개체 정보들을 모두 볼 수 있습니다.
※ 속성 값이 너무 많아서 사실 조사하는게 쉽지는 않습니다.
AI 도구를 활용하자
코딩에 어려움이 있을 때는 AI 도구들을 활용해보는 것도 좋은 방법입니다.
최근 많은 AI 기반 툴들이 VBA 코드를 자동으로 생성하거나 설명을 제공하므로, 내가 잘 모르는 기능에 대해서도 질문을 통해 힌트를 얻거나 답을 찾아갈 수 있습니다.
3. 동료들과 구현된 기능을 공유하고 피드백을 받자
VBA로 만든 기능을 개인적으로 사용하는 것도 좋지만, 직장 동료들과 공유하면서 피드백을 받이 더 좋습니다.
직장 동료와 함께 팀 전체의 업무 수행 능력이 향상된다는 점도 있지만, 그보다는 내가 미처 생각하지 못했던 버그나 오류를 동료들과 나누면 보다 쉽게 찾을 수 있기 때문입니다.
이와 같은 기능들을 동료와 나누고, 추가 개선이 필요한부분을 점진적으로 개선해 나가다 보면 나 자신의 VBA 구현 실력이 상당히 크게 개선되는 것을 느낄 수 있을 것입니다.
4. 메뉴에 VBA 기능을 추가하는 방법을 알아두자
직장 동료들과 VBA 기능을 효과적으로 공유하려면, 개발한 기능을 메뉴에 추가하는 방법을 익혀두는 것을 추천합니다.
이 방법을 통해 사용자들이 쉽게 VBA 기능을 사용할 수 있게 만들고, 동료들이 더 나은 경험을 하도록 도울 수 있습니다.
내가 구현한 기능을 메뉴에 추가하기 위해서는 별도의 프로그램을 사용할 필요가 있습니다.
이 프로그램에 대한 보다 상세한 내용은 아래 링크의 내용을 참고하시면 좋겠습니다.
5. 자주 사용하게 되는 VBA 코드 모음
제 유튜브 채널과 블로그 사이트에서는 지금까지 꽤 많은 VBA 코드를 만들어 두었습니다.
그 과정에서 반복적으로 사용하게 되는 코드가 있었는데요. 그 코드를 아래에 표기하였습니다.
참고하시어, 필요할 때마다 활용해보시면 좋겠네요.
'공통
'1. 폴더내 파일 리스트 가져오기
Dim F_Dir As FileDialog
Dim FolderName, FileName As String
Dim i As Integer
Set F_Dir = Application.FileDialog(msoFileDialogFolderPicker)
F_Dir.Show
FolderName = F_Dir.SelectedItems(1)
FileName = Dir(FolderName & "\*.*")
Do While FileName <> ""
' 작업할 내용
FileName = Dir()
Loop
'2. 알람메시지 무시하기
Application.DisplayAlerts = False
' 작업할 내용
Application.DisplayAlerts = True
'3. 에러 메시지 무시하기
On Error Resume Next
' 작업할 내용
On Error GoTo 0
'4. 에러와 알람 무시하고 작업하기
On Error Resume Next
Application.DisplayAlerts = False
' 작업할 내용
Application.DisplayAlerts = True
On Error GoTo 0
'5. Outlook 라이브러리 추가하고 자동 메일 보내기
Dim MyOutlook As Outlook.application
Dim MyMail As Outlook.MailItem
Set MyOutlook = New Outlook.application
Set MyMail = MyOutlook.CreateItem(olMailItem)
With MyMail
.To = "받는 사람 메일주소"
.Subject = "제목"
.Body = "본문 내용"
.Attachments.Add "파일상세경로"
.Display '.Send로 바꾸면 자동 메일 전송
End With
'6. Outlook 라이브러리 추가하지 않고 자동 메일 보내기
Dim MyOutlook As Object
Dim MyMail As Object
Set MyOutlook = CreateObject("Outlook.Application")
Set MyMail = MyOutlook.CreateItem(olMailItem)
With MyMail
.To = "받는 사람 메일주소"
.Subject = "제목"
.Body = "본문 내용"
.Attachments.Add "파일상세경로"
.Display '.Send로 바꾸면 자동 메일 전송
End With
'※ VBA에서 줄바꿈 부호
vbCrLf
vbNewLine
'PPT
'1. 마지막 슬라이드 복사하고 그 앞 슬라이드를 작업용 슬라이드로 지정
Dim ppt As PowerPoint.Presentation
Dim sld As Slide
Set ppt = ActivePresentation
ppt.Slides(ppt.Slides.Count).Duplicate.MoveTo (ppt.Slides.Count)
Set sld = ppt.Slides(ppt.Slides.Count - 1)
'2. PPT VBA 각 슬라이드에서 Text Frame 모두 편집하기 (개체, 그룹, 표)
Dim Ppt As PowerPoint.Presentation
Dim Sld As Slide
Dim Shp as Shape
Dim tCol as Column
Dim tCell as Cell
Dim sShp as Shape
Set Ppt = ActivePresentation
For Each Sld In Ppt.Slides
For Each Shp In Sld.Shapes
On Error Resume Next
If Shp.HasTextFrame Then
Shp.TextFrame.TextRange. '이하 편집할 내용
ElseIf Shp.HasTable Then
For Each tCol In Shp.Table.Columns
For Each tCell In tCol.Cells
tcell.Shape.TextFrame.TextRange. '이하 편집할 내용
Next
Next
ElseIf Shp.GroupItems.Count > 0 Then
For Each sShp In Shp.GroupItems
sShp.TextFrame.TextRange. '이하 편집할 내용
Next
End If
On Error GoTo 0
Next
Next
'3. Shape에 이미지 채워 넣기
Dim Shp as Shape
Shp.Fill.UserPicture ("이미지 파일 경로")
'4. 이미지 삽입하기
Dim Sld as Slide
Dim Shp as Shape
Set Sld = ActivePresentation.Slides(슬라이드번호)
Set Shp = Sld.Shapes.AddPicture("파일명",True, True, 0, 0, -1, -1) ' 옵션 : 파일명, 링크여부, 문서에 저장여부, 왼쪽, 위쪽, 폭, 높이
'엑셀
'1. 엑셀에 이미지 삽입하기
Dim myPic As Shape
Dim picpath As String
picpath = "파일경로" '읽어올 이미지 파일 경로
Set myPic = Sheets(1).Shapes.AddPicture(picpath, False, True, 20, 20, -1, -1) ' 옵션 : 파일명, 링크여부, 문서에 저장여부, 왼쪽, 위쪽, 폭, 높이
With myPic
.Width = 25 '폭
.Height = 25 '높이
.Top = Cells(1, 1).Top 'A1 셀의 위쪽 위치와 일치 / 필요시 위치 변경
.Left = Cells(1, 1).Left 'A1 셀의 왼쪽 위치와 일치 / 필요시 위치 변경
End With
'2. 시트 복사하기
Sheets("복사할Sheet이름").Copy Before:=Sheets("복사된Sheet위치기준Sheet이름")
'추가된 Sheet는 ActiveSheet가 되므로 필요시 바로 변수 선언
'3. 엑셀에서 데이터가 있는 Max Row & Column 값 알아내기
Dim LC, LR As Integer
Dim Ws As Worksheet
Set Ws = Sheets("대상 Worksheet이름")
LC = Ws.UsedRange.Column + Ws.UsedRange.Columns.Count - 1
LR = Ws.UsedRange.Row + Ws.UsedRange.Rows.Count - 1
VBA는 어렵게 느껴질 수 있지만, 엑셀을 시작으로 꾸준히 연습하면 많은 업무 자동화를 쉽게 처리할 수 있습니다. 또한, 동료들과 공유하며 개선하는 과정을 통해 더 나은 스크립트를 만들 수 있습니다.
아래의 링크들은 지금까지 제 유튜브 채널과 블로그 사이트에 올려놓았던 영상과 글 중 VBA 학습 요령에 대한 내용의 링크들 입니다.
이번 글에서는 간단하게 언급만 한 메뉴에 기능추가하기, 자주 사용하는 코드 등에 관련된 내용의 원문을 찾아보실 수 있으니, 참고하시기 바랍니다.
강력 추천 채널 & 사이트 : 오빠두 엑셀