비즈니스 보고 이메일을 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로 했습니다.
    그렇지만 엑셀 함수만으로 할 수 있으면 가르쳐 주었으면 합니다. .

    좋은 웹페이지 즐겨찾기