엑셀 메일 보내기 자동화 매크로 완전정복!
엑셀 메일 보내기 자동화 목차 바로가기
강의요약
이번 강의에서는 엑셀 메일 보내기 자동화 매크로를 작성해보겠습니다. 엑셀과 아웃룩을 연동하여 메일 보내기 자동화 프로그램을 만들면, VBA에서 기본으로 제공하는 아웃룩 라이브러리를 통해 첨부파일, 예약발송 등의 다양한 부가기능을 활용할 수 있습니다.
이전 강의에서 알아본 PDF 추출 매크로와 페이지 레이아웃 설정 모듈도 같이 사용하니, 이전 강의를 못보고 오신 분은 관련 링크를 참고해주세요.
좀 더 자동화 된 Send_Email 명령문이 필요하신가요? 추가 설정없이 바로 사용가능한 Send_Email 메일 보내기 명령문 전체 마스터 코드는 아래 링크에서 확인하실 수 있습니다.
패치노트
2019년 12월 5일 :
Send_Email 명령문에 예약발송기능 및 '그림으로 첨부'하는 코드를 추가하였습니다.
2020년 5월 28일:
메일 아래에 서명을 추가할 수 있는 명령문을 업데이트 하였습니다.
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [퀵VBA] 엑셀 메일 보내기 자동화 (아웃룩 연동)예제파일
1. 메일 보내기 명령문 보조 모듈 추가
이전 강의에서 제작한 PDF 변환 명령문 및 그 외 보조 모듈을 추가합니다. 각 명령문에 대한 자세한 설명은 이전 강의 PDF 변환 매크로 만들기 (퀵 VBA 6강) 강의를 참고하세요.
A. 파일명 설정 및 파일 저장을 위한 보조 명령문
각 명령문에 대한 자세한 설명은 관련 포스트를 참고하세요.
'########################################## 'z_SubModule 이라는 모듈을 생성한 뒤 복사/붙여넣기 하세요 '########################################## Option Explicit Public Function FileExists(ByVal path_ As String) As Boolean FileExists = (Dir(path_, vbDirectory) <> "") End Function Public Function GetDesktopPath(Optional BackSlash As Boolean = True) Dim oWSHShell As Object Set oWSHShell = CreateObject("WScript.Shell") If BackSlash = True Then GetDesktopPath = oWSHShell.SpecialFolders("Desktop") & "\" Else GetDesktopPath = oWSHShell.SpecialFolders("Desktop") End If Set oWSHShell = Nothing End Function Function FileSequence(FilePath As String, Optional Sequence As Long = 1) Dim Ext As String: Dim Path As String: Dim newPath As String Dim Pnt As Long Pnt = InStrRev(FilePath, ".") Path = Left(FilePath, Pnt - 1) Ext = Right(FilePath, Len(FilePath) - Pnt + 1) newPath = Path & Sequence & Ext Do Until FileExists(newPath) = False Sequence = Sequence + 1 newPath = Path & Sequence & Ext Loop FileSequence = newPath End Function Function ValidFileName(ByVal FileName As String) As Boolean Dim Arr As Variant: Dim Val As Variant Dim Pnt As Long Arr = Array("/", "\", ":", "*", "?", """", "<", ">", "|") If InStr(1, FileName, ":\") > 0 Then Pnt = InStrRev(FileName, "\") FileName = Right(FileName, Len(FileName) - Pnt) Debug.Print FileName End If ValidFileName = True For Each Val In Arr If InStr(1, FileName, Val) > 0 Then ValidFileName = False: Exit Function Next End Function
B. 페이지 레이아웃 설정을 위한 보조 모듈 (Page_Setup)
'########################################## 'z_PageSetup 이라는 모듈을 생성한 뒤 복사/붙여넣기 하세요 '########################################## Public Enum ePrintMargin xlNone = 0 xlNarrow = 1 xlNormal = 2 xlWide = 3 End Enum Public Enum ePaperSize xlA4 = 9 xlA3 = 8 xlLetter = 1 xlA5 = 11 End Enum Function getPrintMargin(eValue As ePrintMargin) As Variant '// 설정된 eNum 값으로 페이지 여백설정을 위한 값을 배열로 나열합니다. Select Case eValue Case 0 getPrintMargin = Array(0.05, 0.05, 0.05, 0.05, 0.1, 0.1) Case 1 getPrintMargin = Array(0.25, 0.25, 0.75, 0.75, 0.3, 0.3) Case 2 getPrintMargin = Array(0.7, 0.7, 0.75, 0.75, 0.3, 0.3) Case 3 getPrintMargin = Array(1, 1, 1, 1, 0.5, 0.5) End Select End Function Sub Page_setup(WS As Worksheet, Optional LHead As String = "", Optional RHead As String = "&D / &T", _ Optional LFoot As String = "본 페이지의 무단복제를 금합니다.", Optional RFoot As String = "&P / &N 페이지", _ Optional eMargin As ePrintMargin = xlNarrow, _ Optional HFit As Boolean = True, Optional VFit As Boolean = False, _ Optional HCenter As Boolean = True, Optional VCenter As Boolean = False, _ Optional eOrient As XlPageOrientation = xlPortrait, Optional eSize As ePaperSize = xlA4) Dim pSetup As String Dim varMargin As Variant Dim lngOrient As Integer '// 인쇄설정 업데이트 중단 (속도증가) Application.PrintCommunication = False '// 인쇄여백값을 받아옵니다. varMargin = getPrintMargin(eMargin) '// 인쇄용지 방향을 설정합니다. If eOrient = xlPortrait Then lngOrient = 1 Else lngOrient = 2 End If '// ExecuteExcel4Macro 의 Page.Setup 명령문 실행을 위한 문구를 입력합니다. Head = """&L" & LHead & "&R" & RHead & """" '// 페이지 머릿말입니다. Foot = """&L" & LFoot & "&R" & RFoot & """" '// 페이지 꼬릿말입니다. pLeft = varMargin(0) '// 왼쪽여백 pRight = varMargin(1) '// 오른쪽여백 Top = varMargin(2) '// 윗여백 Bot = varMargin(3) '// 아래여백 Head_margin = varMargin(4) '// 머릿말여백 Foot_margin = varMargin(5) '// 꼬릿말여백 Hdng = 0 '// 행/열반복 출력여부 0 = 반복출력안함 1 = 반복출력 Grid = False '// 눈금선출력여부 Notes = False '// 메모출력여부 H_cntr = HCenter '// 가운데정렬 V_cntr = VCenter '// 중앙정렬 Orient = lngOrient '// 문서방향, 1 = 세로 2 = 가로 Paper_size = eSize '// 용지크기 Pg_num = 1 '// 페이지 시작번호 Pg_order = 1 '// 페이지번호 순서, 1 = 위-아래-우 2 = 좌-우-아래 Quality = "" '// 인쇄품질 (dot-per-inch로 입력) (공백 = 자동) bw_cells = False '// 흑백인쇄여부, TRUE = 글자/테두리 검정,배경 흰색 FALSE = 색깔 pScale = 100 '// 축소/확대비율 또는 TRUE (Fit to Page) '// 여백을 없음으로 설정할 경우 머릿말/꼬릿말을 삭제하여 인쇄영역과 겹치지 않도록 합니다. If eMargin = xlNone Then Head = """""" Foot = """""" End If '// ExecuteExcel4Macro 명령문을 실행합니다. pSetup = "PAGE.SETUP(" & Head & ", " & Foot & ", " & pLeft & ", " & pRight & ", " & Top & ", " & Bot & ", " pSetup = pSetup & Hdng & ", " & Grid & "," & H_cntr & "," & V_cntr & "," & Orient & "," pSetup = pSetup & Paper_size & "," & pScale & "," pSetup = pSetup & Pg_num & "," & Pg_order & "," & bw_cells & "," & Quality & "," pSetup = pSetup & Head_margin & "," & Foot_margin & "," & Notes & ")" Application.ExecuteExcel4Macro pSetup '// ExecuteExcel4Macro에서는 '한 페이지에 행/열 맞추기' 기능이 지원되지 않습니다. '// 따라서 시트의 PageSetup 속성으로 '페이지 행/열 맞추기 기능을 설정합니다. With WS.PageSetup If HFit = True Then .FitToPagesWide = 1 Else .FitToPagesWide = False End If If VFit = True Then .FitToPagesTall = 1 Else .FitToPagesTall = False End If End With '// 인쇄설정 업데이트 Application.PrintCommunication = True End Sub
C. 선택범위 PDF 저장 모듈 (Rng_To_PDF)
'#################################################### '모듈을 추가한 뒤 복사/붙여넣기 하세요. '#################################################### Sub Rng_To_Pdf(rngSelect As Range, _ Optional FileName As String = "pdf출력", _ Optional SavePath As String = "", _ Optional DocProperty As Boolean = True, _ Optional PrintArea As Boolean = False, _ Optional OpenPdf As Boolean = False, _ Optional AddSequence As Boolean = True) Dim WS As Worksheet Dim FilePath As String Set WS = rngSelect.Parent If SavePath = "" Then SavePath = GetDesktopPath FilePath = SavePath & FileName & ".pdf" If ValidFileName(FilePath) = False Then MsgBox ("올바른 파일명을 사용하세요"): Exit Sub If AddSequence = True Then FilePath = FileSequence(FilePath, 1) End If rngSelect.ExportAsFixedFormat xlTypePDF, FilePath, xlQualityStandard, DocProperty, PrintArea, , , OpenPdf End Sub
2. 메일 보내기 본 명령문 작성 (Send_Email 명령문)
이번 강의에서는 엑셀을 아웃룩을 연동하여 이메일을 보내는 방법을 알아봅니다. 새로운 모듈을 추가한 뒤, 모듈의 이름을 “Email_Module”로 변경합니다.
A. Outlook 라이브러리 추가
VBA 편집창 상단 ‘도구’ – ‘참조’ 에서 Outlook 라이브러리(Microsoft Outlook 16.0 Object Library) 를 추가합니다.

아웃룩을 참조하기 위해 Outlook 라이브러리를 추가합니다 B. 명령문 인수 작성
명령문에 들어갈 인수를 작성합니다. Send_Email 명령문에는 총 8개의 인수가 들어갑니다.
인수 설명 MailTo
[String]받는 사람의 메일 주소입니다. Subject
[String]메일 제목입니다. HTMLString
[String]HTML 형식의 메일 본문입니다. PasteSelection
[Boolean, 선택인수]TRUE일 경우 선택 범위를 메일 본문에 붙여넣기합니다. 기본값은 FALSE 입니다. CCTo
[String, 선택인수]참조 메일 주소입니다. BCCTo
[String, 선택인수]숨은참조 메일 주소입니다. AttachFilePath
[String, 선택인수]첨부파일의 파일 경로입니다. PathDelimiter
[String, 선택인수]여러 개의 첨부파일이 있을 시, 파일 경로를 구분할 구분자입니다. C. 명령문 변수 작성 및 설정
명령문에 들어갈 변수를 작성한 뒤 각 변수를 설정합니다.
- 변수 중 wdPasteDefault 는 워드에디터에서 복사한 값을 붙여넣기 할 방식을 결정하는 WdRecoveryType 의 한 항목이며, 원칙적으로 wdRecoveryType 항목은 Word Object Library를 참고하여 지정하는 것이 맞습니다.
- 하지만 아웃룩에서 사용하는 워드에디터는 기본 워드 프로그램으로 참조하는 Library와 별개로 작성되므로, Word Object Library를 사용할 수 없습니다. 따라서 Variant(임의값) 으로 변수를 지정하여 명령문을 작성해주세요.
변수명 설명 AppOutlook
[Outlook.Application]실행할 아웃룩 프로그램입니다. newEmail
[Outlook.MailItem]아웃룩에서 작성할 메일입니다. pageInspector
[Outlook.Inspector]아웃룩 워드에디터를 불러오기 위한 Inspector 항목입니다. pageEditor
[Object]아웃룩에서 메일을 편집할 워드 에디터입니다. varFilePath
[Variant]String 형태로 받아온 첨부파일 주소를 배열형태로 변환합니다. FileCount
[Long]첨부파일의 개수입니다. i
[Long]For 반복문의 연번입니다. wdPasteDefault
[Variant]엑셀에서 선택한 범위를 메일에 붙여넣기 할 방식입니다. Dim AppOutlook As Outlook.Application Dim newEmail As Outlook.MailItem Dim pageInspector As Outlook.Inspector Dim pageEditor As Object Dim varFilePath As Variant Dim FileCount As Long Dim i As Long Dim wdPasteDefault As Variant Set AppOutlook = New Outlook.Application Set newEmail = AppOutlook.CreateItem(olMailItem)
D. 메일항목 설정 #1
보낼 메일의 각 항목을 설정합니다. 설정에 사용되는 모든 항목은 명령문의 인수/변수에서 받아왔으므로, 각 항목을 호출해주면 됩니다.
- To : 받는 사람의 메일 주소입니다.
- CC : 참조 메일 주소입니다.
- BCC : 숨은 참조 메일 주소입니다.
- Subject : 메일 제목입니다.
- Attachments.Add : 첨부파일을 추가합니다.
- HTMLBody : HTML 형식의 메일 본문을 작성합니다.
- DefferedDeliveryTime : 예약발송 또는 지연발송을 위한 시간을 설정합니다.
- DateSerial 함수 - 연/월/일로 입력한 날짜에 해당하는 일련번호를 반환합니다.
- TimeSerial 함수 - 시간/분/초로 입력한 시간에 해당하는 일련번호를 반환합니다.
- DateAdd 함수 - 지정한 시간/날짜로부터 선택한 ‘단위’ 만큼 지연된 값을 반환합니다.
예약발송 설정 예제
- 예제1) 2019년 12월 25일 오후 9시에 발송 : DateSerial(2019, 12, 25) + TimeSerial(9,0,0)
- 예제2) 현재시간으로부터 30분 뒤에 발송 : DateAdd(“n”, 30, Now)
With newEmail .To = MailTo .CC = CCTo .BCC = BCCTo .Subject = Subject If AttachFilePath <> "" Then For i = 1 To UBound(varFilePath) + 1 .Attachments.Add varFilePath(i - 1), 1, i Next End If .HTMLBody = HTMLString '.DeferredDeliveryTime = DateAdd("n", 5, Now) .DeferredDeliveryTime = DateSerial(2030, 1, 1) + TimeSerial(8, 0, 0) End With
E. 메일항목 설정 #2
엑셀 시트에서 선택한 범위를 메일 본문에 붙여넣기 할 경우, 아웃룩 워드에디터에서 추가 설정이 필요합니다. 본 강의에서는 엑셀의 선택한 범위를 메일 본문 마지막 부분에 기본 표 형식으로 붙여넣기 하는 방법을 알아봅니다.
- pageEditor.Application.Selection.Start : 엑셀에서 복사한 범위를 붙여넣기 할 시작지점입니다.
- pageEditor.Application.Selection.PasteAndFormat : 붙여넣기 할 방식입니다. 본 강의에서는 붙여넣기 기본값을 사용하였습니다.
- 워드에디터 붙여넣기 형식 전체목록 보러가기 :
https://docs.microsoft.com/en-us/office/vba/api/word.wdrecoverytype
If PasteSelection = True Then .Display Set pageInspector = newEmail.GetInspector Set pageEditor = pageInspector.WordEditor pageEditor.Application.Selection.Start = Len(.Body) Selection.Copy pageEditor.Application.Selection.PasteAndFormat wdPasteDefault Else .Display End If
F. 메일 보내기 및 변수 초기화
Send 함수를 통해 메일을 발송합니다. 여러 개의 메일을 발송할 경우, 할당된 변수를 초기화하여 매크로 동작속도를 더욱 빠르게 합니다. 변수 초기화는 마지막으로 할당된 변수부터 역순으로 하는 것에 주의하세요.
'.Send '// 메일을 보내려면 주석처리를 해제하세요. Set pageEditor = Nothing Set pageInspector = Nothing Set newEmail = Nothing Set AppOutlook = Nothing
G. Send_Email 전체 명령문
더 개선된 Send_Email 전체 마스터 코드 및 실전 예제파일은 여기에서 확인하실 수 있습니다.
'###################################################################### ' 명령문 : Send_Email ' 설명 : 아웃룩과 연동하여 메일보내기를 자동화하는 모듈입니다. '###################################################################### Sub Send_Email(MailTo As String, _ Subject As String, _ HTMLString As String, _ Optional PasteSelection As Boolean = False, _ Optional CCTo As String = "", _ Optional BCCTo As String = "", _ Optional AttachFilePath As String = "", _ Optional PathDelimiter As String = "|") Dim AppOutlook As Outlook.Application '// 아웃룻 프로그램 Dim newEmail As Outlook.MailItem '// 아웃룻 새로 메일을 보내기 위해 생성한 메일 Dim pageInspector As Outlook.Inspector '// 아웃룩 워드에디터 가져오기위한 항목 Dim pageEditor As Object '// 아웃룩 이메일 편집창 Dim varFilePath As Variant '// 파일경로를 배열형태로 만들어준 변수 Dim FileCount As Long '// 첨부파일의 개수 Dim i As Long '// For문 반복문의 변수 Dim wdPasteDefault As Variant Set AppOutlook = New Outlook.Application Set newEmail = AppOutlook.CreateItem(olMailItem) If AttachFilePath <> "" Then varFilePath = Split(AttachFilePath, PathDelimiter) End If With newEmail .To = MailTo .CC = CCTo .BCC = BCCTo .Subject = Subject If AttachFilePath <> "" Then For i = 1 To UBound(varFilePath) + 1 .Attachments.Add varFilePath(i - 1), 1, i Next End If .HTMLBody = HTMLString '.DeferredDeliveryTime = DateAdd("n", 5, Now) .DeferredDeliveryTime = DateSerial(2030, 1, 1) + TimeSerial(8, 0, 0) If PasteSelection = True Then .Display Set pageInspector = newEmail.GetInspector Set pageEditor = pageInspector.WordEditor pageEditor.Application.Selection.Start = Len(.Body) Selection.Copy pageEditor.Application.Selection.PasteAndFormat wdPasteDefault Else .Display End If '.Send '// 메일을 보내려면 주석처리를 해제하세요. End With Set pageEditor = Nothing Set pageInspector = Nothing Set newEmail = Nothing Set AppOutlook = Nothing End Sub
3. 이메일 보내기 명령문 테스트
작성한 메일 보내기 명령문을 테스트하기 위한 명령문을 작성합니다. 아래 명령문을 복사/붙여넣기 한 뒤 명령문을 실행해주세요. 테스트 명령문은 아래 동작을 수행합니다.
- 직원명_부서명_년도-월 의 파일명으로 PDF 파일을 바탕화면에 저장
- 저장된 PDF 파일을 메일에 첨부 (파일경로를 세로바(|)로 구분, 2개 동시첨부 가능)
- HTML 형식으로 작성된 메일 본문 및 급여명세서의 B2:E18 범위를 메일 본문에 붙여넣기
엑셀 범위를 HTML 형식으로 바꾸는 방법은 관련 포스트에서 자세히 설명드렸습니다. - test@oppadu.com 로 메일 발송
테스트 명령문에서 받는 사람 및 메일 본문, PDF변환 범위 등은 필요에 따라 변경 후 사용 가능합니다.
'########################################################## ' 오빠두엑셀 퀵 VBA 7강, 메일 보내기 자동화 완성파일 ' 명령문에 대한 자세한 설명은 아래 링크에서 확인하세요. ' https://www.oppadu.com/엑셀-메일-보내기-아웃룩-매크로/ '########################################################## Sub Test() Dim FileName As String Dim SavePath As String FileName = Sheet4.Range("E3").Value & "_" & Sheet4.Range("C4").Value & "_" & Sheet4.Range("H3").Value & "년 " & Sheet4.Range("H4").Value & "월" SavePath = GetDesktopPath Rng_To_Pdf Sheet4.Range("B2:E18"), FileName, SavePath, OpenPdf:=False, AddSequence:=False '// Rng_To_Pdf 명령문의 첫번째 인수를 Selection으로 변경하면 선택한 범위를 PDF파일로 추출하여 메일에 첨부합니다. Sheet4.Range("B2:E18").Select '// 선택된 범위가 아닌 원하는 부분을 지정해서 메일에 첨부하는 방법이 궁금하신분은 Send_Email 명령문 관련 포스트를 참고하세요. Send_Email "test@oppadu.com", _ FileName, _ "
오빠두 대리 님께
귀하의 2019년 10월 급여명세서를 송부드립니다.
오빠두엑셀을 위한 귀하의 노고에 깊은 감사드리며 더욱 발전된 모습으로 귀하에 노고에 보답하겠습니다.
", _ True, _ "", , _ SavePath & FileName & ".pdf" & "|" & SavePath & FileName & ".pdf" End Sub
4. 시트에 매크로 실행 버튼 추가
작성한 매크로를 쉽게 실행하기 위한 버튼을 시트위에 추가합니다. 시트에 도형을 생성한 뒤, 원하는 문구/아이콘을 추가합니다. 생성한 도형을 우클릭한 뒤 매크로지정을 선택합니다.

도형을 우클릭 한 뒤, [매크로지정]을 선택합니다. 매크로 지정을 선택하면 새로운 팝업창이 나타납니다. 팝업창에서 방금 추가 한 ‘Test’ 명령문을 선택합니다.

팝업창에서 Test 명령문을 선택한 뒤, 확인을 눌러 마무리합니다. 이후 도형을 클릭하면 메일 보내기 명령문이 실행됩니다.

추가한 도형을 클릭하면 메일이 아웃룩으로 자동 발송됩니다. 자주묻는질문
질문1. 메일 아래에 서명을 추가하고 싶습니다.
메일 아래에 서명을 추가하려면 Send_Email 의 With newEmail ~ With 부분을 아래 명령문으로 변경합니다.
- 이메일 서명을 받아오기 위해 .Display 로 이메일 창을 우선 실행합니다.
- HTML 형식의 서명을 Signature 로 받아온 뒤, 메일 작성이 끝나면 메일 끝 부분에 붙여넣기 합니다.
With newEmail .To = MailTo .CC = CCTo .BCC = BCCTo .Subject = Subject If AttachFilePath <> "" Then For i = 1 To UBound(varFilePath) + 1 .Attachments.Add varFilePath(i - 1), 1, i Next End If '------------------------------- ' 서명 추가를 위해 변경된 부분 '------------------------------- .Display Dim Signature As String Signature = .HTMLBody .HTMLBody = HTMLString '.DeferredDeliveryTime = DateAdd("n", 5, Now) .DeferredDeliveryTime = DateSerial(2030, 1, 1) + TimeSerial(8, 0, 0) If PasteSelection = True Then .Display Set pageInspector = newEmail.GetInspector Set pageEditor = pageInspector.WordEditor pageEditor.Application.Selection.Start = Len(.Body) Selection.Copy pageEditor.Application.Selection.PasteAndFormat wdPasteDefault '------------------------------- ' 서명 추가를 위해 변경된 부분 '------------------------------- .HTMLBody = .HTMLBody & Signature Else .Display End If '.Send '// 메일을 보내려면 주석처리를 해제하세요. End With

FileName, _
"", _
True, _ <-- 이부분에서 컴파일 오류 형식이 일치 하지 않습니다 라고 나옵니다
"", , _
SavePath & FileName & ".pdf" & "|" & SavePath & FileName & ".pdf"
적어주신 내용만으로는 정확한 답변을 드리기가 어렵습니다.
로 우선 실행해보신 뒤, 잘 동작하는지 확인해보시겠어요?^^
만약 잘 동작한다면, 이후에 들어가는 인수는 모두 선택인수이므로 하나씩 지정해서 테스트해보시길 바랍니다.
감사합니다.
테스트를 해보니 강의에서처럼 메일보내기 창도 잘 뜨고 첨부도 잘 됩니다.
그런데 지연 발송을 하든 그 부분을 삭제하든 보내기를 누르면 창이 닫히고 보낼편지함으로 가는 것 같습니다.
그게 계속 발송이 안되다가 아웃룩을 수동으로 켜면 그제서야 발송이 됩니다.
(아웃룩 켜면 그 사이 실험해봤던것이 우수수 오는 상황)
저의 컴퓨터 환경의 문제인지.... 여러가지로 시도 하다가 해결이 되지 않아 문의드립니다.
저도 예전 업무볼때 불편했던 사항 중 하나인데요.
아웃룩의 경우 PC의 '실행프로그램'으로 동작해서, 예약발송을 걸었을 때 해당 메일을 서버에 전송한 뒤 PC가 꺼진 상태에서도 발송되는 시스템이 아니라, PC에 프로그램이 계속 실행된 상태에서 예약한 시간이 되면 그때 발송이 되는.. 시스템이라고 합니다. (그래서 예약발송 걸어놓고 아웃룩 프로그램을 종료하면 메일이 발송되지 않는다는 안내메세지가 출력되죠..)
이 문제는 Outlook 계정을 사용하면 해결가능하다고 예전 MS 블로그에서 본적이 있는데요.
이게 사실상 해결이 어려운 부분이, 대게 많은 회사가 각자 도메인주소를 따서 회사 고유의 메일서버를 이용하는게 대부분이라.. 근본적인 해결책이 어떻게 있을지는 정확히 모르겠습니다. ^^;
가장 쉬운 방법은 '아웃룩' 프로그램이 실행된 상태에서 예약발송을 걸어두는 것이고, 이는 매크로와는 별개로.. 아웃룩으로 예약발송을 구현하시려면 어쩔 수 없는 문제일듯 합니다.
만약 업무상 정말 필요한 기능이라면, 전산팀에 문의해서 해결해보시는 것도 하나의 방법일듯 합니다.
제시해드린 답변이 도움이 되셨길 바랍니다.
감사합니다 ^^
아래 문구(바로가기를 실행)를 껴넣어서 아웃룩을 켜놓는 방법으로 해결했습니다.
그런데 Shell 을 사용하지 않고 아웃룩 본체를 띄울수는 없을까요?
다른 컴퓨터환경에서는 경로가 다를 수 있어서요.
Shell "rundll32.exe url.dll,FileProtocolHandler " & "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Outlook 2016.lnk", vbNormalFocus
아웃룩은 아래 Shell 명령문으로 아주 간단하게 실행할 수 있습니다.
답변이 도움이 되셨길 바랍니다.
감사합니다.
그런데 아웃룩 내에서는 와꾸(?)가 복사한대로 이쁘게 나오는데, 네이버 메일 상에서는 표의 가로 세로 길이가 이상하게 보이게 전송됩니다.
이런건 어떻게 해결해야할까요..
아래 내용을 같이 확인주시겠어요?
- 매크로를 사용하지 않고 직접 작성하신 메일에서도 같은 문제가 발생하나요?
만약 위 두 질문에 대한 답변이 모두 YES일 경우, 메일을 보내기 전 HTML 코드를 수정해주셔야 하는데요 ^^;
Table 태그의 Width 를 100% 로 변경해주시고, Tr 태그의 Min-Height 값을 2em ~ 3em 정도로 수정해주시면 해결되실듯 합니다..
제시해드린 답변이 도움이 되셨길 바랍니다.
감사합니다.
넘 관심 있는 주제인데, 파일 생성까지만 되고, 메일은 보내지지 않네요 ㅠㅠ
a) Tool-Reference - Microsoft word 16.0 의 체크박스는 해지하고 매크로 실행이 맞지요? (Object로 받기 때문에?)
b) 회사도메인이 등록되어 있는 Outlook 메일로는 이 메크로가 사용 불가한가요? 코딩하고 보니 보내는 사람정보(ID/PW) 등은 설명에 없는 것 같아서 궁금하네요.
c) sub Test()를 실행하면 파일 생성후 에러 팝업 'Compile error / User-defined type not defined' 가 뜨며 메일은 발송 안됩니다.
모듈(Email_Module) 에서 Optional Pathdelimiter as string = "|") 부분에서 계속 디버깅이 발생하는데 이유를 찾을수가 없네요.
몇번 하다가 안되서, 사이트에서 코드를 그대로 복사 해왔는데도 자꾸 오류가 납니다.
오빠두님의 명쾌한 조언 부탁 드릴게요!
덕분에 정말 많이 배우고 있습니다.
감사드립니다. 🙂
문제가 해결되셨다니 너무나도 다행입니다!^_^*
이후에도 어려움이 있을경우 언제든지 댓글이나 커뮤니티에 글을 올려주시면 확인 후 최대한 도움이 되는 답변 드리도록 노력하겠습니다.
감사합니다.
엑셀-아웃룩 매크로의 메커니즘은 기존의 엑셀 아웃룩 간 작성/복사/붙여넣기 작업을 자동화해주는 것입니다.
아웃룩에서 메일전송이 안되는 것은 '아웃룩'쪽 설정을 확인하셔야 할듯 한데요.
https://www.oppadu.com/%ec%97%91%ec%85%80-%eb%a9%94%ec%9d%bc-%eb%b3%b4%eb%82%b4%ea%b8%b0-%ec%95%84%ec%9b%83%eb%a3%a9-%eb%a7%a4%ed%81%ac%eb%a1%9c/#comment-2376
위 댓글에서도 말씀드렸지만, 아웃룩은 '아웃룩' 계정을 사용하지 않는한, 예약발송 기능은 '아웃룩이 실행된 상태'여야만 정상적으로 동작합니다.
따라서 아래 1가지를 확인하시면 될듯 합니다.
만 확인 후, Outbox에 메일이 정상적으로 들어간다면 아웃룩을 항시 실행시켜놓는 방법으로 문제를 해결하실 수 있을듯 합니다 ^^
아래 명령문은 아웃룩을 실행하는 명령문입니다.
답변이 도움이 되셨길 바랍니다.
감사합니다.
아웃룩 계정 로그인 한 상태에서 아웃룩 메일을 항시 실행시켜놓은 상태입니다
아웃룩 자체에서 메일 보내고 받고의 기능은 정상적으로 작동됩니다
그리고 추가적으로 작업창 안내 메시지에
"(~~~@메일주소)의 구독된 폴더를 동기화하는 중입니다."
"(~~~@메일주소)에 있는 구독된 폴더에서 새 메일을 검사합니다."
라는 문구가 확인 됩니다.
이 상태에서 진행률이 시간이 흘러도 막대바가 채워지지 않는데.....
관련해서 아웃룩 오류를 해결하기 위해 검색중이기는 하지만
혹시 조언 주실 내용이 있을까요:)
아무것도 모르고 무작정 강의보고 사이트 보고 어설프게 따라하고 있습니다.
최종 엑셀 내용을 pdf으로 저장되며 자동으로 첨부파일로 등록이 되어 메일 발송까지는 됩니다.
하지만 엑셀에 한 부분을 메일에 붙여넣기가 안되는데
사이트에 올라온 내용을 그대로 따라 붙여넣기도 해보고 다해봐도 자동으로 붙여넣기가 안됩니다..
도와주세요..
흑흑
우선 도움을 드리고 싶으나, 적어주신 내용만으로는 제가 답변을 드리기 어렵습니다.
간단한 디버깅을 해보시겠어요?
만약 코드를 그대로 사용하셨다면,
위 부분에 마우스 커서를 두신 뒤, 키보드 F9키를 눌러 중단점을 설정해주세요.
그리고 메일보내기 매크로를 실행하면 해당 지점에서 명령문이 스톱됩니다.
그 상태에서 키보드 F8키로 단계별로 실행하면서, 복사/붙여넣기 하는 동작이 잘 되는지 확인해보세요.
위 명령문을
로 수정해서 선택한 범위의 셀 주소가 제대로 출력되는지도 확인해보시구요.
직접 디버깅하시다보면 문제점을 찾으실 수 있을겁니다 ^^
답변이 도움이 되셨길 바랍니다.
복사해서 붙여넣은 selection 항목의 사이즈 조절이 가능할까요?
applicaion.selection property 에서 사이즈 속성은 못찾겠네요.
행/열 높이크기는 EntireRow / EntireColumn 에서 RowHeight/ColumnWidth 속성을 변경해주시면 됩니다.
행/열 개수는 Resize 속성을 변경해보세요 ^^
노란음영의 커서는 아래 명령문을 가르키고, Dim AppOutlook As Outlook.Application 이 자동 선택됩니다.
Sub Send_Email(MailTo As String, _
Subject As String, _
HTMLString As String, _
Optional PasteSelection As Boolean = False, _
Optional CCTo As String = "", _
Optional BCCTo As String = "", _
Optional AttachFilePath As String = "", _
Optional PathDelimiter As String = "|")
제가 변경한 것은 test()에서 동일한 내용에 sheet4를 sheet3으로 변경한 것 밖에 없는데 왜 오류가 나는 걸까요.ㅜㅜ?
A. Outlook 라이브러리 추가
이부분을 확인해보시겠어요?^^
본 예제에 추가 기능을 넣고 싶은데, 쉽지가 않네요... ㅜㅜ 아래와 같은 추가 기능을 넣으려면
어떻게 해야하나요....?
[원하는 추가기능]
sheet1의 A열에 수신인 별 일련번호, B열에 수신인 이름, C열에 이메일 주소 (약 120명) 가 있고,
한 폴더에 각 수신인 별로 보낼 파일이 2 개 또는 4개가 존재합니다.
(파일명 :
① 수신인일련번호_단체명_수신인명_AAA_XXX
② 수신인일련번호_단체명_수신인명_AAA_YYY
③ 수신인일련번호_단체명_수신인명_BBB_XXX
④ 수신인일련번호_단체명_수신인명_BBB_YYY
YYY 파일 (즉, ②와 ④)는 수신인별로 존재하는 수신인이 있고, 존재하지 않는 수신인이 있습니다.
MailTo를 Range로 지정하고, 반복문(For)을 돌려야 할 것 같고
AttachmentFilePath는 YYY 존재유무를 먼저 확인하고 Attach하는 명령문이
필요한 것은 알겠지만 코드 작성이 어렵네요 ... ㅜㅜ
염치불구하고 여쭤봅니다. ㅜㅜ
파일을 첨부하신 뒤, 해당 파일을 메일 본문에 삽입할 수 있습니다.
예를들어 첨부한 파일명이 '이미지.jpg' 일 경우, 아래 코드를 메일 본문에 넣어보세요.