안녕하세요! 😊
이번 포스팅에서는 Outlook VBA를 활용하여 매월 정기적으로 이메일을 자동으로 발송하는 방법을 소개해드릴게요. 특히 주말 및 공휴일을 고려하여 발송 날짜를 정확하게 계산하는 방법을 다룹니다. 🚀
🔹 Outlook VBA로 정기 메일을 보내는 이유
Microsoft Outlook은 강력한 이메일 관리 기능을 제공하지만, 자동 이메일 발송 기능은 기본적으로 제공되지 않습니다. 하지만 **VBA(Visual Basic for Applications)**를 활용하면 원하는 주기에 맞춰 이메일을 자동으로 보낼 수 있어요!
이 블로그에서는 "working day +4일"에 이메일을 발송하고, "working day +7일"을 본문에 표시하는 방법을 다룰 예정입니다. 😊
🛠️ Step 1: Outlook 일정에서 공휴일 가져오기
먼저, Outlook 일정에서 대한민국 법정 공휴일을 가져와 자동으로 반영하는 코드를 작성해 볼게요.
📌 Outlook 일정에서 공휴일을 가져오는 코드:
Function IsHoliday(checkDate As Date) As Boolean
Dim olApp As Object
Dim olNamespace As Object
Dim olCalendar As Object
Dim olItems As Object
Dim olItem As Object
IsHoliday = False ' 기본값 (공휴일 아님)
' Outlook 객체 생성
Set olApp = CreateObject("Outlook.Application")
Set olNamespace = olApp.GetNamespace("MAPI")
Set olCalendar = olNamespace.GetDefaultFolder(olFolderCalendar)
Set olItems = olCalendar.Items
' 일정 항목 검색
For Each olItem In olItems
If olItem.Start >= checkDate And olItem.Start < checkDate + 1 Then
IsHoliday = True
Exit For
End If
Next olItem
' 객체 해제
Set olItem = Nothing
Set olItems = Nothing
Set olCalendar = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
End Function
📌 설명:
이 함수는 Outlook 일정에서 특정 날짜에 공휴일이 있는지 확인하는 역할을 합니다.
🛠️ Step 2: 주말 및 공휴일을 제외한 날짜 계산
이제 주말과 공휴일을 제외하고, 특정 개수만큼 영업일을 계산하는 함수를 작성해볼게요.
📌 working day를 계산하는 코드:
Function GetNextWorkingDay(baseDate As Date, offset As Integer) As Date
Dim tempDate As Date
Dim i As Integer
tempDate = baseDate
i = 0
Do While i < offset
tempDate = tempDate + 1
' 주말 확인 (토요일 = 7, 일요일 = 1)
If Weekday(tempDate, vbMonday) <> 6 And Weekday(tempDate, vbMonday) <> 7 Then
' Outlook 일정에서 공휴일 확인
If Not IsHoliday(tempDate) Then
i = i + 1
End If
End If
Loop
GetNextWorkingDay = tempDate
End Function
📌 설명:
- 주말(토, 일)과 공휴일을 자동으로 제외하고 영업일 기준 +N일을 계산하는 기능입니다.
- offset 값을 조정하면 원하는 날짜를 얻을 수 있습니다.
🛠️ Step 3: 자동 이메일 발송 코드
이제 매월 자동으로 이메일을 보내는 VBA 코드를 작성해볼게요.
📌 📩 자동 이메일 발송 코드:
Sub ScheduleMonthlyEmail()
Dim objMail As Outlook.MailItem
Dim sendDate As Date
Dim displayDate As Date
' 📨 이메일 발송 날짜: working day +4
sendDate = GetNextWorkingDay(Date, 4)
' 📅 본문에 표시할 날짜: working day +7
displayDate = GetNextWorkingDay(Date, 7)
Set objMail = Application.CreateItem(olMailItem)
With objMail
.To = "example@example.com"
.Subject = "월간 보고서"
' 본문 내용 설정
.Body = "안녕하세요, 차장님," & vbCrLf & vbCrLf _
& "25년3월 Cash Flow forecasting 자료 및 한독 주식 투자주체현황 자료, 부채현황표 자료 요청 드립니다." & vbCrLf & vbCrLf _
& "월요일 (" & Format(displayDate, "mm/dd") & ") 까지 회신 부탁드립니다." & vbCrLf & vbCrLf _
& "관련하여 문의사항이 있으시면 언제든 연락 부탁드립니다." & vbCrLf & vbCrLf _
& "감사합니다."
' 🚀 이메일 발송 날짜 (working day +4) 설정
.DeferredDeliveryTime = sendDate + TimeSerial(9, 0, 0)
.Send
End With
End Sub
📌 설명:
1️⃣ 본문에 표시되는 날짜는 working day +7일 기준으로 출력
2️⃣ 실제 이메일 발송 날짜는 working day +4일 기준으로 설정
3️⃣ Outlook 일정에서 공휴일을 확인하여 조정
🎯 마무리 및 활용 방법
이제 코드가 완성되었으니 VBA 편집기에 저장하고 실행하면 Outlook에서 자동으로 정기 이메일이 발송됩니다!
✔️ Outlook에서 공휴일을 먼저 추가하세요 (파일 → 옵션 → 캘린더 → 공휴일 추가)
✔️ VBA 편집기에서 코드 저장 (Alt + F11)
✔️ 테스트 실행 (F5) 후 정상 작동 확인
✔️ Windows 작업 스케줄러를 활용해 자동 실행 가능
이제 Outlook VBA를 활용해 정확한 영업일 기준으로 이메일을 자동 발송할 수 있어요! 🚀