- 최초 작성일: 2001-02-20
- 최종 수정일: 2026-09-30
- 조회수: 11 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 현재시트를 메일로 보내기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
오늘은 메일 두 통과 질문 하나를 함께 살펴봅니다.
저는 주로 Oracle Database를 많이 다룹니다.
PL/SQL을 많이 사용하는데 원하는 데이터를 뽑거나 분석을 위해 EXCEL처럼
구현하는 것은 거의 불가능 하더군요.
특히 Roolup 기능(엑셀의 피벗기능과 비슷), 정말 엑셀은 대단한 프로그램입니다.
SQL 기능과 엑셀의 데이터 관리를 비교하며 공부하고 있는데 처음 엑셀에 대해서
그냥 개념없이 공부했는데 이 사이트에서, 몰랐던 것을 선생님의 강좌를 보면서
많은 것을 알게 되었습니다.
SQL과 개념이 같은 것을 단지 다른 관점으로 접근하는 것을 보면 재미가 있습니다.
필터링 기능도 SQL의 distinc과 엑셀의 고급필터 소스를 보고 싶습니다. 궁금합니다.
메일 부탁드립니다.
VB0036 강좌에서 PowerTools라는 애드인 파일을 소개해 드리면서 소스코드는 Lock을 걸어두었습니다. 그러면서 암호를 원하시는 분은 메일을 주시면 언제든지 알려드린다고 했었지요. Exceller's Home을 찾으시는 분이 하루 700~800명 정도 되는데 지금까지 한 10% 정도 되는 분이 암호를 알려달라는 메일을 주셨습니다(물론 메일을 받는 즉시 암호를 알려드렸습니다).
요즘도 잊혀질만 하면 한번씩 이분처럼 암호를 알려달라고 하시는 분이 계십니다. 아직 PowerTools를 못보신 분은 어서 살펴보시고 Exceller에게 암호를 요청하시면 언제든지 알려드립니다. "요청만 하면 알려줄 거면서 왜 암호는 걸고 난리야?" 이런 생각을 하시는 분도 VB0036 강좌를 살펴보세요. ^^;
현재시트를 메일로 보내기
핵심 요약: 시트를 메일로 보내기
사용된 영역을 문자열로 바꾸는 GetData 함수를 만들고 Outlook MailItem의 Body에 담아 전송합니다.
- 1단계: 도구-참조에서 Outlook 개체 라이브러리를 체크합니다.
- 2단계: GetData 함수로 UsedRange의 내용을 문자열로 만듭니다.
- 3단계: CreateItem으로 MailItem을 만들고 Recipients, Subject, Body를 지정해 Send 합니다.
Step 1: 질문 살펴보기
반갑습니다. Exceller님
참 오래간만입니다. 일일이 답변해 주시느라고 수고가 많으십니다.
매크로를 사용하여 현재의 워크시트를 메일로 보낼 수 있는 방법은 없는지요?
워크북을 첨부파일 형태로 보내는 것은 있는 것 같은데(Workbook.SendMail…)
현재 활성화 된 워크시트 자체를 메일로 보내는 매크로를 알고싶습니다.
감사합니다.
참고로 현재 저는 아웃룩과 아웃룩 익스프레스를 쓰고 있습니다.
메일 중에서 낯익은 ID가 보이면 반갑습니다. '아, 아직 열심히 하고 계시구나!'하는 생각에서… 한동안 열심히 질문을 하시다가 어느 날부터인가 소식이 뜸하면 안타깝습니다. '이제 다른 살길(?)을 찾아가셨나?'하는 생각에서…
위의 질문하신 분은 Exceller's Home 초기 때부터 들러 가끔 질문을 하시던 분인데 한동안 소식이 없다가 다시 연락을 주신 분입니다. 그래서 더욱 반갑기도 하고요. ^^
워크북(파일) 단위로 전송하는 방법에 대해서는 VB0043에서 이미 설명을 드린 기억이 납니다. 아시는 바와 같이 SendMail Method를 사용하시면 됩니다. 아주 간단하니까 VB0043 강좌를 살펴보도록 하시고…
워크시트 단위로 전송하는 것은… 글쎄요 다른 방법도 있겠으나 해당 시트의 내용을 문자열 데이터로 만든 다음 이것을 상대방의 메일 계정으로 전송하는 방법을 택해 보았습니다.
Step 2: 실행해 보기와 참조 설정
일단 아래의 버튼을 누른 다음 메일을 받고자 하는 E-mail 계정을 입력해 보세요. Outlook이 아닌 다른 메일 프로그램을 사용하시는 분을 위해 결과를 메일이 아닌 메시지 박스에 출력하도록 해 보았습니다. Outlook을 사용하시는 분들은 코드 중에서 주석처리된 부분의 '를 없앤 다음 실행해 보시면 될 것입니다. 참고로 Exceller는 Outlook을 사용하지 않기 때문에 잘 작동하는지 테스트는 해 보지 못했습니다.
이 프로시저가 정상적으로 실행되도록 하기 위해서는 먼저 "참조" 지정을 해 주어야 합니다. VB Editor 상태에서 "도구-참조" 메뉴를 선택하고 "사용 가능한 참조 목록"에서 "Microsoft Outlook 9.0 Object Library"를 체크합니다.
강좌에 나온 Microsoft Outlook 9.0 Object Library는 Outlook 2000의 버전입니다. 지금 사용하시는 Outlook의 버전(예: 16.0)에 맞는 항목을 체크하시면 됩니다. 또한 최근 Outlook은 프로그램에서 메일을 보내려고 하면 보안 경고가 나타날 수 있고, 새 Outlook(new Outlook)은 VBA와 COM 자동화를 지원하지 않습니다. 워크시트 전체를 파일로 보내는 것이라면 Workbook.SendMail도 함께 고려해 보시기 바랍니다.
Step 3: SendActiveSheet 프로시저
체크를 하셨으면 아래와 같은 코드를 모듈시트에 작성합니다.
Sub SendActiveSheet()
Dim MyOlApp As Outlook.Application
Dim shtSheet As Worksheet
Dim MyNameSpace As NameSpace
Dim strMail As String
Dim MyMailItem As MailItem
Dim varTemp As Variant
Dim strName As String
'//등장인물과 배역을 설정합니다. 어럽쇼? 그런데 새로운 인물들이 몇 명 등장했지요?
'//VB0073 강좌인가에서 파워포인트를 실행시킬 때
'//Dim pptApp As PowerPoint.Application
'//이런 식으로 선언해 준 적이 있었는데 기억이 나시는지?
'//파워포인트나 워드에도 VBA 엔진이 내장되어 있으므로 해당 애플리케이션의
'//오브젝트를 EXCEL에서 불러다 사용하기 위해 지정을 하는 부분입니다.
'//Outlook도 당연히(!) VBA를 지원합니다.
Set shtSheet = ActiveSheet
strName = shtSheet.Name
strMail = InputBox("전송할 E-mail 주소를 입력하세요", "메일 주소 입력//Exceller", _
"exceller@netian.com")
If Len(strMail) = 0 Or InStr(strMail, "@") = 0 Then
MsgBox "E-mail 주소가 잘못 되었습니다", , "주소 입력 오류//Exceller"
Exit Sub
End If
'//전송하고자 하는 E-mail 계정을 사용자로부터 입력받은 다음, 이것이 유효한 계정인지
'//아닌지를 검사합니다.
Set MyOlApp = CreateObject("outlook.application")
Set MyNameSpace = MyOlApp.GetNamespace("MAPI")
'MyNameSpace.Logon
'//Outlook Application 오브젝트를 생성합니다. 파워포인트를 실행할 때에는
'//Powerpoint.Application, 워드를 실행할 때에는 Word.Application이라고 했었지요?
'//그리고 NameSpace라는 새로운 오브젝트가 하나 사용되었는데 이것은 "개체 자체에서
'//로그인과 로그아웃, ID로 저장 개체를 바로 액세스 하는 등의 기능을 수행" 합니다.
'//Application 개체에서 Outlook NameSpace 개체를 반환할 때, GetNamespace("MAPI")를
'//사용합니다. 이것은 사용자의 메일 저장소에 저장된 모든 아웃룩 데이터를 액세스할 수
'//있도록 해 줍니다.
'//NameSpace, MailItem 오브젝트 등에 대한 보다 자세한 것은 도움말을 참고하시기 바랍니다.
varTemp = GetData(shtSheet.UsedRange)
'//현재 시트 중에서 사용된 영역을 GetData라는 사용자 정의 함수의 인수로 건네주어 함께
'//실행되도록 한 다음, 그 결과값을 다시 돌려 받습니다.
Set MyMailItem = MyOlApp.CreateItem(olMailItem)
'//MailItem 오브젝트는 받은 메일 폴더에 있는 메일 메시지를 나타냅니다. CreateObject 메서드를
'//사용해서 새로운 메일 메시지를 나타내는 MailItem 개체를 생성합니다. MailItem 오브젝트에
'//대해서도 도움말을 살펴보시기 바랍니다.
'With MyMailItem
' .Recipients.Add strMail
' .Subject = strName
' .Body = varTemp
' .Send
'End With
'MyNameSpace.Logoff
'MyOlApp.Quit
'//만약 Outlook을 사용하는 분이라면 위의 녹색 부분에 있는 '을 모두 제거한 다음 실행시키면
'//되겠습니다.
MsgBox varTemp
Set shtSheet = Nothing
Set MyNameSpace = Nothing
Set MyOlApp = Nothing
End Sub
Step 4: GetData 함수
이제 사용자 정의 함수인 GetData()의 내용을 보도록 합니다. 특별한 내용이 있는 것은 아니고 현재 워크시트에 있는 내용을 문자열로 바꾼 다음 그 결과값을 돌려주는 내용입니다.
Function GetData(rngRange As Range) As String
Dim i As Integer
Dim intStart As Integer
Dim intEnd As Integer
Dim r As Long
Dim lngStart As Long
Dim lngEnd As Long
Dim strTemp As String
With rngRange
'//현재 워크시트의 사용된 영역의 시작행, 열, 끝행, 열의 위치를 파악하여 변수에 담습니다.
intStart = .Column
intEnd = .Column + .Columns.Count - 1
lngStart = .Row
lngEnd = .Row + .Rows.Count - 1
End With
For r = lngStart To lngEnd
'//순환문을 돌면서 각 셀의 내용을 strTemp라는 변수에 담아 둡니다.
For i = intStart To intEnd
strTemp = strTemp & rngRange.Worksheet.Cells(r, i) & vbTab
Next i
strTemp = strTemp & vbCr
Next r
GetData = strTemp
End Function
마무리
여러 프로그램을 사용해 본 분일수록 EXCEL이 얼마나 대단한 프로그램인지, 그리고 EXCEL의 분석기능이 Powerful한 것인지 뼈저리게 느끼게 됩니다.
다음 시간에…
정리 — 메일 전송 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| Outlook 개체 | CreateObject("outlook.application") | Outlook 실행 |
| 네임스페이스 | GetNamespace("MAPI") | 메일 저장소 접근 |
| 메일 만들기 | CreateItem(olMailItem) | 새 메일 개체 |
| 본문 지정 | .Body = varTemp | 시트 내용을 본문에 |
| 전송 | .Send | 메일 전송 |
자주 묻는 질문 (FAQ)
Q1. 워크시트 하나만 메일로 보내려면 어떻게 하나요?
시트의 내용을 문자열로 만든 다음 Outlook MailItem의 본문에 담아 전송하는 방법을 사용할 수 있습니다.
Q2. 워크북 전체를 첨부파일로 보내려면?
Workbook.SendMail 메서드를 사용하면 간단합니다.
Q3. Outlook 참조 설정은 어떻게 하나요?
VB 편집기의 도구-참조에서 사용 중인 Outlook 버전의 Object Library 항목을 체크합니다.
마치며
시트 내용을 문자열로 바꾸어 Outlook 메일 본문에 담으면 워크시트 단위로 메일을 보낼 수 있습니다.