비즈니스 보고 이메일을 VBA로 생성
소개
재택근무로 업무보고적인 것을 매일 메일 하지만 그것을 만드는 것이 귀찮기 때문에, 작업과 시간을 엑셀에 메모해 두면 버튼 1개로 메일로 해 주는 매크로로 했습니다.
자동으로 송신까지 버리는 것은 무섭기 때문에 송신은 문장을 확인하고 나서 수동으로 실시하도록 하고 있습니다.
구현
시트
이런 시트를 준비합니다.
시트: 했던 일 목록
시트:템플
VBA
VBA는 이런 느낌이 들었습니다.
책의 표준 모듈에 저장했지만 시트 오브젝트에 저장해도 좋을 것 같다.
Sub createMail_Click()
'MsgBox "メール作成します"
Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem
Set objOutlook = New Outlook.Application
Set objMail = objOutlook.CreateItem(olMailItem)
objMail.To = getVal("宛先") 'メール宛先
objMail.Subject = getVal("件名") 'メール件名
objMail.BodyFormat = olFormatPlain 'メールの形式
Dim body As String 'メール本文
body = getVal("本文ヘッダ") + vbCrLf
Dim list As String: list = getDidToday() '明細
body = body + list + vbCrLf
body = body + getVal("本文フッタ") + vbCrLf
objMail.body = body
objMail.Display 'メール表示
End Sub
'明細部分を返す
Function getDidToday() As String
Set wsDone = ThisWorkbook.Sheets("やったことリスト")
Dim i As Integer: i = 1
Dim buf As String
Do
'Debug.Printを使うとイミディエイトウィンドウに変数の中身を出せる
Debug.Print wsDone.Cells(i, 2).Value, TypeName(wsDone.Cells(i, 2).Value)
Dim point As String: point = wsDone.Cells(i, 1).Value '箇条書きの「・」
Dim hour As String: hour = CStr(Format(wsDone.Cells(i, 2).Value, "0.0")) '時間
Dim desc As String: desc = wsDone.Cells(i, 3).Value '内容
'合計行まで来たら終わり
If point = "合計" Then
buf = buf + "---------------" + vbCrLf
buf = buf + point + hour + "H" + vbCrLf
Exit Do
End If
'0時間以外は明細に出力する
If point = "・" And hour <> "0.0" Then
buf = buf + point + hour + "H" + " : " + desc + vbCrLf
End If
i = i + 1
Loop While i < 100 '無限ループ怖いので上限
getDidToday = buf 'なぜVBAはこういう仕組みになったのだろう
End Function
'VLOOKUP関数でテンプレシートB列から値を取る
Function getVal(target As String) As String
'Dim buf As String: buf = WorksheetFunction.VLookup(target, Worksheets("テンプレ").Range("A:B"), 2, False)
getVal = WorksheetFunction.VLookup(target, Worksheets("テンプレ").Range("A:B"), 2, False)
End Function
'時間列でフィルタをかける
Sub filterOn_Click()
ActiveSheet.Range(Range("A8"), Cells(Rows.Count, 3).End(xlUp)).AutoFilter Field:=2, Criteria1:=">0"
End Sub
'フィルタを解除する
Sub filterOff_Click()
ActiveSheet.Range(Range("A8"), Cells(Rows.Count, 3).End(xlUp)).AutoFilter
End Sub
이동하기 전에 도구 → 참조 설정에 다음이 추가되어 있는지 확인.
메일 객체를 사용하기 위한 참조 설정입니다.
설정하지 않으면 오류가 발생합니다.
시트
이런 시트를 준비합니다.
시트: 했던 일 목록
시트:템플
VBA
VBA는 이런 느낌이 들었습니다.
책의 표준 모듈에 저장했지만 시트 오브젝트에 저장해도 좋을 것 같다.
Sub createMail_Click()
'MsgBox "メール作成します"
Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem
Set objOutlook = New Outlook.Application
Set objMail = objOutlook.CreateItem(olMailItem)
objMail.To = getVal("宛先") 'メール宛先
objMail.Subject = getVal("件名") 'メール件名
objMail.BodyFormat = olFormatPlain 'メールの形式
Dim body As String 'メール本文
body = getVal("本文ヘッダ") + vbCrLf
Dim list As String: list = getDidToday() '明細
body = body + list + vbCrLf
body = body + getVal("本文フッタ") + vbCrLf
objMail.body = body
objMail.Display 'メール表示
End Sub
'明細部分を返す
Function getDidToday() As String
Set wsDone = ThisWorkbook.Sheets("やったことリスト")
Dim i As Integer: i = 1
Dim buf As String
Do
'Debug.Printを使うとイミディエイトウィンドウに変数の中身を出せる
Debug.Print wsDone.Cells(i, 2).Value, TypeName(wsDone.Cells(i, 2).Value)
Dim point As String: point = wsDone.Cells(i, 1).Value '箇条書きの「・」
Dim hour As String: hour = CStr(Format(wsDone.Cells(i, 2).Value, "0.0")) '時間
Dim desc As String: desc = wsDone.Cells(i, 3).Value '内容
'合計行まで来たら終わり
If point = "合計" Then
buf = buf + "---------------" + vbCrLf
buf = buf + point + hour + "H" + vbCrLf
Exit Do
End If
'0時間以外は明細に出力する
If point = "・" And hour <> "0.0" Then
buf = buf + point + hour + "H" + " : " + desc + vbCrLf
End If
i = i + 1
Loop While i < 100 '無限ループ怖いので上限
getDidToday = buf 'なぜVBAはこういう仕組みになったのだろう
End Function
'VLOOKUP関数でテンプレシートB列から値を取る
Function getVal(target As String) As String
'Dim buf As String: buf = WorksheetFunction.VLookup(target, Worksheets("テンプレ").Range("A:B"), 2, False)
getVal = WorksheetFunction.VLookup(target, Worksheets("テンプレ").Range("A:B"), 2, False)
End Function
'時間列でフィルタをかける
Sub filterOn_Click()
ActiveSheet.Range(Range("A8"), Cells(Rows.Count, 3).End(xlUp)).AutoFilter Field:=2, Criteria1:=">0"
End Sub
'フィルタを解除する
Sub filterOff_Click()
ActiveSheet.Range(Range("A8"), Cells(Rows.Count, 3).End(xlUp)).AutoFilter
End Sub
이동하기 전에 도구 → 참조 설정에 다음이 추가되어 있는지 확인.
메일 객체를 사용하기 위한 참조 설정입니다.
설정하지 않으면 오류가 발생합니다.
움직여 보자
메일 만들기 버튼
메일 만들기 버튼을 누르면 이런 메일을 만들어줍니다.
하지 않는 작업은 제외되고 있군요.
덤
필터 버튼과 필터 해제 버튼은 덤입니다.
각각 내용 1행의 함수 만드는 것만으로 필터해 주었습니다.
필터의 범위 지정에서는 행의 최후를 지정하고 있지 않기 때문에 행 삽입해도 좋은 느낌에 필터 대상이 되어 줍니다.
결론
처음에는 VBA 없이 엑셀 함수의 HYPERLINK()만으로 메일 작성하고 있었습니다.
다만 그것이라고 동적으로 품목 부분을 본문에 삽입할 수 없었기 때문에,
처음에는 VBA 없이 엑셀 함수의 HYPERLINK()만으로 메일 작성하고 있었습니다.
다만 그것이라고 동적으로 품목 부분을 본문에 삽입할 수 없었기 때문에,
라는 조작이 필요해서 귀찮아져 VBA로 했습니다.
그렇지만 엑셀 함수만으로 할 수 있으면 가르쳐 주었으면 합니다. .
Reference
이 문제에 관하여(비즈니스 보고 이메일을 VBA로 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/atmospheri/items/8dd6e8a6bae42c56d5e9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)