비즈니스 보고 이메일을 VBA로 생성

13269 단어 VBAExcel

소개



재택근무로 업무보고적인 것을 매일 메일 하지만 그것을 만드는 것이 귀찮기 때문에, 작업과 시간을 엑셀에 메모해 두면 버튼 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

이동하기 전에 도구 → 참조 설정에 다음이 추가되어 있는지 확인.
메일 객체를 사용하기 위한 참조 설정입니다.
설정하지 않으면 오류가 발생합니다.
  • Microsoft Outlook 1X.0 Object library

  • 움직여 보자



    메일 만들기 버튼



    메일 만들기 버튼을 누르면 이런 메일을 만들어줍니다.
    하지 않는 작업은 제외되고 있군요.




    필터 버튼과 필터 해제 버튼은 덤입니다.
    각각 내용 1행의 함수 만드는 것만으로 필터해 주었습니다.

    필터의 범위 지정에서는 행의 최후를 지정하고 있지 않기 때문에 행 삽입해도 좋은 느낌에 필터 대상이 되어 줍니다.

    결론



    처음에는 VBA 없이 엑셀 함수의 HYPERLINK()만으로 메일 작성하고 있었습니다.
    다만 그것이라고 동적으로 품목 부분을 본문에 삽입할 수 없었기 때문에,
  • HYPERLINK ()로 메일 작성
  • 수동으로 0 시간 이외의 필터링
  • 필터 결과를 복사하여 만든 메일에 값 붙여 넣기

  • 라는 조작이 필요해서 귀찮아져 VBA로 했습니다.
    그렇지만 엑셀 함수만으로 할 수 있으면 가르쳐 주었으면 합니다. .

    좋은 웹페이지 즐겨찾기