エクセルの申請フォームを使って、データを蓄積していく仕組みを作っていきます。
このページで紹介する内容は、たとえば社内申請(稟議など)を想定しています。
まず申請者がエクセルにデータを入力したらボタンを押します。
そうするとそのデータ(申請情報)が管理表に自動で蓄積され、同時に申請情報を上司にOutlookメールで通知します。
このような仕組みはVBAで構築できるので、使い方とプログラムを紹介していきます。
・申請情報の内容をもとにメールを自動作成し、確認者(上司)へ通知
・VBAプログラム入りのエクセルをダウンロード可能
上記について紹介します。ファイルダウンロードだけではなくコード解説もしていきます。
目次
- 1 エクセルVBAで社内申請の仕組みを作成して情報共有を仕組み化
- 2 VBA入りのエクセルファイルをダウンロード
- 3 VBAプログラム作成前の準備
- 4 エクセルマクロVBAで社内申請業務を仕組み化する
- 4.1 プログラム0|変数宣言の指定
- 4.2 プログラムA-1|プログラム開始
- 4.3 プログラムA-2|FileSystemObjectを設定
- 4.4 プログラムA-3|シート設定
- 4.5 プログラムA-4|データを配列として取得
- 4.6 プログラムA-5|データのチェック
- 4.7 プログラムA-6|flagがTrue(未記入欄があれば、プログラム強制終了)
- 4.8 プログラムA-7|申請IDを作成
- 4.9 プログラムA-8|フォルダ作成
- 4.10 プログラムA-9|申請リストのエクセルを開く
- 4.11 プログラムA-10|申請リストのエクセルの最終行を取得
- 4.12 プログラムA-11|申請内容をリストへ出力
- 4.13 プログラムA-12|申請リストのエクセルを上書き保存して閉じる
- 4.14 プログラムA-13|申請フォームをフォルダ保存
- 4.15 プログラムA-14|プログラムBの実行(mydataを渡す)
- 4.16 プログラムA-15|オブジェクト解放
- 4.17 プログラムA-16|作成したフォルダを最前面へ
- 4.18 プログラムA-17|プログラム終了
- 4.19 プログラムB-1|プログラム開始
- 4.20 プログラムB-2|Outlookを起動してメールを作成
- 4.21 プログラムB-3|メール本文と宛先を設定
- 4.22 プログラムB-4|メール内容を設定
- 4.23 プログラムB-5|メール表示・送信
- 4.24 プログラムB-6|オブジェクト解放
- 4.25 プログラムB-7|プログラム終了
- 5 Excel VBAについて詳しく理解したいなら
エクセルVBAで社内申請の仕組みを作成して情報共有を仕組み化
このページで紹介するVBAプログラムは以下の流れで使用することを想定しています。
手順2. VBAプログラム実行
手順3. 必要資料をフォルダに保存
以下で詳しく説明します。
手順1. エクセル一覧表に必要情報を入力
セルC3~C12に必要項目を入力します。
C4は日付で入力
セルC4は申請完了予定日としていて、日付型「yyyy/mm/dd」で入力します。
ショートカットキー[Ctrl]+[;]で日付を入力可能です。
選択式にすると間違いを少なくできる
ダウンロードできるエクセルでは、上記のようにプルダウンリストを活用しています。
これにより入力ミスを出来る限り減らすように対策を取っています。
ちなみに、サンプルエクセルでは所属部署(セルC6)、申請種類(セルC7)、確認者のメールアドレス(C10,C11,C12)はプルダウンリストで選択できるようにしています。
プルダウンリストの設定は、上記の画像とおり「設定」シートを参照しています。
C10の確認者メールアドレス1は必須
確認者のメールアドレスは3つ準備していますが、確認者のメールアドレス1のみ入力必須としています。
この事例では、会社やチームによっては、通知したい相手が3人いることを予測して3つのメールアドレスを入力可能としています。
しかし3つすべてを入力必須にすると、通知先が1つでいいときに余分な2つのメールアドレスを入力しないといけません。
それを避けるために、確認者のメールアドレス1のみ入力必須で、2と3は省略可としています。
編集後の修正
入力必須かどうかが分かりづらいので、D列にメモを追記しました。
手順2. VBAプログラム実行
VBAプログラムを実行すると、以下の3つが自動で実行されます。
2. 申請ごとに専用フォルダを作成
3. 申請データを関連者(上司や管理者など)へ自動通知
VBAプログラムを実行すると上記の3つが処理されます。
以下で解説します。
1. 管理台帳へ申請データを蓄積
申請フォームのエクセルと同じフォルダに存在する申請情報管理台帳「20_2_データ一覧.xlsm」にデータを自動で蓄積させます。
このB列にはハイパーリンクを付与しており、後述するフォルダにアクセス可能です。
管理者はこの管理台帳からすべての申請情報にアクセスできるようになります。
これによりデータが行方不明になるような不具合を事前に回避できます。
2. 申請ごとに専用フォルダを作成
申請フォームのエクセルと同じフォルダに存在する「00_申請リスト」のフォルダ直下に新しいフォルダを自動作成させます。
申請ごとに新規フォルダを作成し、この新規フォルダは管理台帳エクセルからアクセスできます。
この新規フォルダには、申請ごとに添付したい情報(補足資料や説明資料)などを保管します。
必要資料の保管先を指定することで、よりスムーズに申請作業を行うことができます。
3. 申請データを関連者(上司や管理者など)へ自動通知
確認先メールアドレスで指定した相手に、申請情報を通知します。
メールにはフォルダリンクを設定し、メールから専用フォルダにアクセス可能です。
これにより、申請者と確認者とのやりとりを減らすことができます。
「あの資料を送ってほしい」や「あの申請情報を再送してほしい」というような確認者からの要望を減らすことで、申請作業の負担が減ります。
手順3. 必要資料をフォルダに保存
VBAプログラムを実行後、新規作成したフォルダがPCの最前面に表示されるようにしています。
これにより必要資料をフォルダに保管するのを忘れないように実施してもらえます。
申請者がフォルダを探す手間を省くことで、申請作業を少しでも簡略化します。
ボタンにVBAプログラムを登録
VBAプログラムをボタンに登録することもできます。
ボタンにVBAプログラムを登録することで、ボタンを押下しプログラムを実行することができます。
ボタンをVBAプログラムを設定したい場合は、以下で動画も交えて設定方法を紹介しているので、そちらをご覧ください。
VBA入りのエクセルファイルをダウンロード
以下で紹介しているVBAプログラムをそのまま使いたい人は、以下のフォームからダウンロードできます。
登録したメールアドレスへ「VBAプログラムが含まれたエクセル」を送信します。
本プログラムの内容をそのまま使用可能です。ぜひお仕事にお役立てください。
それでは、以下でプログラムについて詳細を説明します。
VBAプログラム作成前の準備
エクセルVBAでoutlookのメールを操作するためのプログラミングに入る前に、準備しておくことがあります。
具体的には以下です。
準備2. Outlookを操作するための準備
準備3. フォルダを操作するための準備
上記の関して、以下で説明します。
準備1. ExcelでVBAを使うための事前準備
エクセルVBAを使うためには、保存ファイルの拡張子変更、Excelの基本設定変更の2つをしておきます。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下の記事で解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
準備2. VBEで外部ライブラリへの参照設定でOutlook型を追加
Outlookメールを送信できるように、以下のVBEの参照設定を変更します。
詳細の設定方法は以下のページで紹介しています。
準備3. フォルダを扱うための事前準備
この事例ではフォルダを操作するために、FileSystemObjectを活用します。
FileSystemObjectを使用するために、以下のVBEの参照設定を変更します。
これでフォルダを操作できるようになります。
設定方法の詳細は以下のページで紹介しています。
それでは以下でプログラムを詳しく解説します。
エクセルマクロVBAで社内申請業務を仕組み化する
今回紹介するプログラムの概要は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
'プログラム0|変数設定の指定 Option Explicit 'プログラムA-1|プログラム開始 Sub RegisterApplication() 'プログラムA-2|FileSystemObjectを設定 Dim fs As FileSystemObject Set fs = New Scripting.FileSystemObject 'プログラムA-3|シート設定 Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("フォーム") 'プログラムA-4|データを配列として取得 Dim mydata As Variant mydata = ws1.Range("B3:C12").Value 'プログラムA-5|データのチェック Dim flag As Boolean Dim i As Long For i = LBound(mydata) To UBound(mydata) - 2 If mydata(i, 2) = "" Then: flag = True Next If IsDate(mydata(2, 2)) = False Then: flag = True 'プログラムA-6|flagがTrue(未記入欄があれば、プログラム強制終了) If flag = True Then MsgBox "再入力をお願いします" Exit Sub End If 'プログラムA-7|申請IDを作成 Dim shinsei_id As String shinsei_id = Format(Now, "yyyyMMddhhmmdd") 'プログラムA-8|フォルダ作成 Dim folderpath As String, newfolderpath As String folderpath = ThisWorkbook.path & "\00_申請リスト" newfolderpath = folderpath & "\" & shinsei_id & "_" & mydata(1, 2) If fs.FolderExists(folderspec:=newfolderpath) = False Then fs.Createfolder newfolderpath End If 'プログラムA-9|申請リストのエクセルを開く Dim listbook As Workbook, listsheet As Worksheet Set listbook = Workbooks.Open(Filename:=ThisWorkbook.path & "\" & "20_2_データ一覧.xlsm") Set listsheet = listbook.Worksheets("申請リスト") 'プログラムA-10|申請リストのエクセルの最終行を取得 Dim cmax As Long cmax = listsheet.Range("A65536").End(xlUp).Row 'プログラムA-11|申請内容をリストへ出力 'A列~C列に値を出力 With listsheet.Range("A1") .Offset(cmax, 0) = cmax .Offset(cmax, 1) = shinsei_id .Offset(cmax, 2) = Date End With 'D列以降に値を出力 Dim k As Long For k = LBound(mydata) To UBound(mydata) listsheet.Range("A1").Offset(cmax, k + 2) = mydata(k, 2) Next 'B列の申請IDにハイパーリンクを付与 listsheet.Hyperlinks.Add anchor:=listsheet.Range("B1").Offset(cmax, 0), Address:=newfolderpath 'プログラムA-12|申請リストのエクセルを上書き保存して閉じる With listbook .Save .Close End With 'プログラムA-13|申請フォームを作成したフォルダ保存 Dim path As String path = newfolderpath & "\" & shinsei_id & "_フォーム.xlsm" ThisWorkbook.SaveAs Filename:=path 'プログラムA-14|プログラムBの実行(mydataを渡す) Call SendMail(mydata, shinsei_id, newfolderpath) 'プログラムA-15|オブジェクト解放 Set fs = Nothing 'プログラムA-16|作成したフォルダを最前面へ Shell "C:\Windows\Explorer.exe " & newfolderpath, vbNormalFocus 'プログラムA-17|プログラム終了 End Sub 'プログラムB-1|プログラム開始 Sub SendMail(mydata, shinsei_id, newfolderpath) 'プログラムB-2|Outlookを起動してメールを作成 Dim OutlookObj As Outlook.Application Set OutlookObj = New Outlook.Application Dim mymail As Outlook.MailItem Set mymail = OutlookObj.CreateItem(olMailItem) 'プログラムB-3|メール本文と宛先を設定 Dim mailaddress As String, mailbody As String mailbody = "■" & shinsei_id & "<br>" mailbody = vbCrLf & mailbody & "<a href=""" & newfolderpath & """>" & newfolderpath & "</a><br>" Dim i As Long For i = LBound(mydata) To UBound(mydata) If i < 8 Then mailbody = mailbody & "<br>" & "■" & mydata(i, 1) & "<br>" & mydata(i, 2) & "<br>" Else mailaddress = mailaddress & ";" & mydata(i, 2) End If Next 'プログラムB-4|メール内容を作成 mymail.BodyFormat = 2 mymail.To = mailaddress mymail.cc = "fastclassinfo@gmail.com" '管理者のメールアドレスを入れる mymail.subject = "【申請】件名:" & mydata(1, 2) & " 期限:" & mydata(2, 2) mymail.HTMLBody = mailbody 'プログラムB-5|メール表示・送信 'mymail.Display mymail.Send 'プログラムB-6|オブジェクト解放 Set mymail = Nothing Set OutlookObj = Nothing 'プログラムB-7|プログラム終了 End Sub |
それでは、以下でプログラムを詳しく説明していきます。
プログラム0|変数宣言の指定
1 |
Option Explicit |
「Option Explicit」とは、変数宣言を強制するためのものです。
予期しないエラーを防止できるため「Option Explicit」を入力することを習慣化することを推奨しています。
詳しい説明は以下のページで紹介しています。
プログラムA-1|プログラム開始
1 |
Sub RegisterApplication() |
「Sub RegisterApplication()」のプログラムを開始することを意味します。
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
1 2 3 |
Sub プロシージャ名() '実行プログラム End Sub |
「Sub」で始まり「End Sub」で終わります。
プロシージャに関連するmoduleの話については以下で説明しています。
プログラムA-2|FileSystemObjectを設定
1 2 |
Dim fs As FileSystemObject Set fs = New Scripting.FileSystemObject |
FileSystemObjectは、ファイルやフォルダを操作するときに使うオブジェクトです。
本事例ではFileSystemObjectをfsという変数として扱います。
変数fsは定義するだけではなく、「Set fs = New Scripting.FileSystemObject」と記入して使えるようになります。
これを忘れてしまうことが多いので、注意が必要です。
FileSystemObjectに関する注意点
FileSystemObjectを使用するためには、参照設定でMicrosoft Scripting Runtimeを設定に入れておく必要があります。
設定を忘れると動作しませんので、事前に設定を変更しておく必要があります。
なお、FileSystemObject以外にもフォルダを操作する方法はあります。しかしFileSystemObjectを使えば、ファイルとフォルダを両方操作できるので、覚えることが少なくて済みます。
細かいことを覚えるのが面倒な人は、ファイルやフォルダを操作するときはFileSystemObjectを使うと覚えておくといいです。
FileSystemObjectに関しては、以下で詳しく解説しています。
プログラムA-3|シート設定
1 2 |
Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("フォーム") |
「フォーム」をws1として扱います。
なお「ThisWorkbook.Worksheets(“フォーム”)」とすることで、VBAプログラムが含まれるエクセルファイルの「フォーム」シートと指定することができます。
プログラムA-4|データを配列として取得
1 2 |
Dim mydata As Variant mydata = ws1.Range("B3:C12").Value |
セルB3からセルC12までをmydataとして二次元配列で取得します。
二次元配列として格納される
B3:C12は二次元配列として、以下のような形で取り出すことができます。
B列の項目
セルB4:mydata(2,1)
・
・
・
セルB12:mydata(10,1)
C列の入力情報
セルC4:mydata(2,2)
・
・
・
セルC12:mydata(10,2)
プログラムA-5|データのチェック
1 2 3 4 5 6 7 |
Dim flag As Boolean Dim i As Long For i = LBound(mydata) To UBound(mydata) - 2 If mydata(i, 2) = "" Then: flag = True Next If IsDate(mydata(2, 2)) = False Then: flag = True |
データの入力ミスがないかどうかをチェックします。
入力ミスがあれば、変数flagをTrueにします。
なおBoolean型で定義した変数の初期値はFalseとなっているので、Trueを入力ミスのフラグにします。
値の入力漏れがないかどうかチェック
1 2 3 |
For i = LBound(mydata) To UBound(mydata) - 2 If mydata(i, 2) = "" Then: flag = True Next |
上記の画像の部分に入力漏れがあれば、flagをTrueにします。
Trueになっていれば、プログラムA-6でプログラムを強制終了させます。
確認者のメールアドレスが1つだけあれば良い
ここでは「For i = LBound(mydata) To UBound(mydata) – 2」としています。
これは確認者のメールアドレスが1つだけあれば良いからです。
3つの項目がありますが、少なくとも「確認者のメールアドレス1」は入力必須としています。
しかし確認者のメールアドレス2と3は省略可能のため、-2としています。
日付の入力欄に日付が記述されているかどうかチェックk
1 |
If IsDate(mydata(2, 2)) = False Then: flag = True |
上記の画像の部分が日付データになっていなければ、flagをTrueにします。
たとえば、文字列や数値が入力されていれば、flag=Trueとなります。
Trueになっていれば、プログラムA-6でプログラムを強制終了させます。
プログラムA-6|flagがTrue(未記入欄があれば、プログラム強制終了)
1 2 3 4 |
If flag = True Then MsgBox "再入力をお願いします" Exit Sub End If |
プログラムA-5でflagがTrueになっていれば、メッセージを表示します。
たとえば、セルC6を未入力のままVBAプログラムを実行すると、以下のようにメッセージ表示されます。
メッセージ表示後にプログラムを強制終了させます。
なおflag=Falseであれば、プログラムA-6をスキップします。
プログラムA-7|申請IDを作成
1 2 |
Dim shinsei_id As String shinsei_id = Format(Now, "yyyyMMddhhmmdd") |
申請IDを生成します。
申請IDは、登録フォームのVBAプログラムを実行した日時を「yyyyMMddhhmmss」として取得し、件名であるmydata(1,2)を結合させます。
mydata(1,2)の値は、セルC3の値のことなので、検証してみると以下のようになります。
Debug.Printでの検証結果
1 2 3 4 5 6 |
Dim shinsei_id As String shinsei_id = Format(Now, "yyyyMMddhhmmdd") Debug.Print shinsei_id >>>20210611225700 |
たとえばVBAプログラムを実行した日時が、2021年6月11日22時57分00秒のとき、上記のように出力されます。
プログラムA-8|フォルダ作成
1 2 3 4 5 6 |
Dim folderpath As String, newfolderpath As String folderpath = ThisWorkbook.path & "\00_申請リスト" newfolderpath = folderpath & "\" & shinsei_id & "_" & mydata(1, 2) If fs.FolderExists(folderspec:=newfolderpath) = False Then fs.Createfolder newfolderpath End If |
エクセルと同じフォルダに「00_申請リスト」というフォルダを事前に準備しておきます。
その「00_申請リスト」の中に、「申請ID_件名」で設定した名前で新しいフォルダを作成します。
Debug.Printでの検証結果
1 2 3 4 5 6 7 |
Dim folderpath As String, newfolderpath As String folderpath = ThisWorkbook.path & "\00_申請リスト" newfolderpath = folderpath & "\" & shinsei_id & "_" & mydata(1, 2) Debug.Print newfolderpath >>>D:\(省略)\00_申請リスト\20210611213611_取引先Aへの依頼 |
なお、ここではフォルダの存在チェックをして、フォルダ作成をしています。
そのプログラムについては、以下のページで詳しく説明しています。
プログラムA-9|申請リストのエクセルを開く
1 2 3 |
Dim listbook As Workbook, listsheet As Worksheet Set listbook = Workbooks.Open(Filename:=ThisWorkbook.path & "\" & "20_2_データ一覧.xlsm") Set listsheet = listbook.Worksheets("申請リスト") |
「20_2_データ一覧.xlsm」を開き、listbookとして扱います。
またlistbookの「申請リスト」シートをlistsheetとして扱います。
このエクセルブック(listbook)は、申請情報を蓄積する管理台帳(エクセル)として使います。
プログラムA-10|申請リストのエクセルの最終行を取得
1 2 |
Dim cmax As Long cmax = listsheet.Range("A65536").End(xlUp).Row |
listsheet(管理台帳エクセルのシート)のA列の最終行をcmaxとして扱います。
Debug.Printでの検証結果
1 2 3 4 5 6 |
Dim cmax As Long cmax = listsheet.Range("A65536").End(xlUp).Row Debug.Print cmax >>>1 |
ここでは1行目までデータが入力されているため、cmax=1となります。
プログラムA-11|申請内容をリストへ出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'A列~C列に値を出力 With listsheet.Range("A1") .Offset(cmax, 0) = cmax .Offset(cmax, 1) = shinsei_id .Offset(cmax, 2) = Date End With 'D列以降に値を出力 Dim k As Long For k = LBound(mydata) To UBound(mydata) listsheet.Range("A1").Offset(cmax, k + 2) = mydata(k, 2) Next 'B列の申請IDにハイパーリンクを付与 listsheet.Hyperlinks.Add anchor:=listsheet.Range("B1").Offset(cmax, 0), Address:=newfolderpath |
A列~C列に値を出力
2 3 4 5 6 |
With listsheet.Range("A1") .Offset(cmax, 0) = cmax .Offset(cmax, 1) = shinsei_id .Offset(cmax, 2) = Date End With |
B列:申請ID
C列:申請日
上記のA列~C列に入力する値は、プログラム側で自動生成する値です。
D列以降に値を出力
9 10 11 12 |
Dim k As Long For k = LBound(mydata) To UBound(mydata) listsheet.Range("A1").Offset(cmax, k + 2) = mydata(k, 2) Next |
D列以降の値は、配列mytdataを出力していきます。
配列の出力に関しては、以下の配列のページで紹介しています。
B列の申請IDにハイパーリンクを付与
15 |
listsheet.Hyperlinks.Add anchor:=listsheet.Range("B1").Offset(cmax, 0), Address:=newfolderpath |
B列はハイパーリンクを付与して、プログラムA-8で作成したフォルダへのリンクさせます。
これにより、管理台帳である「20_2_データ一覧.xlsm」からフォルダにアクセスできるようにします。
プログラムA-12|申請リストのエクセルを上書き保存して閉じる
1 2 3 4 |
With listbook .Save .Close End With |
申請リストのエクセルを上書き保存して閉じます。
プログラムA-13|申請フォームをフォルダ保存
1 2 3 |
Dim path As String path = newfolderpath & "\" & shinsei_id & "_フォーム.xlsm" ThisWorkbook.SaveAs Filename:=path |
プログラムA-8で作成した新しいフォルダに、当該エクセル(申請情報を入力したエクセル)を保存します。
保存する名前は、「00_申請リスト」の中に「申請ID_件名」という名前で新しいフォルダを作成します。
プログラムA-14|プログラムBの実行(mydataを渡す)
1 |
Call SendMail(mydata, shinsei_id, newfolderpath) |
プログラムBを実行して、通知メールを生成します。
引数として、以下の3つを渡します。
2. shinsei_id:プログラムA-7で生成した申請ID
3. newfolderpath:プログラムA-8で作成した新しいフォルダのパス
上記の3つの引数をプログラムBに渡して、メール作成を行います。
プログラムA-15|オブジェクト解放
1 |
Set fs = Nothing |
オブジェクトを解放します。
プログラムA-16|作成したフォルダを最前面へ
1 |
Shell "C:\Windows\Explorer.exe " & newfolderpath, vbNormalFocus |
最後にプログラムA-8で新しく作成したフォルダをPCウィンドウの最前面に表示します。
フォルダをPCウィンドウの最前面に表示するプログラムは以下で詳しく説明しています。
プログラムA-17|プログラム終了
1 |
End Sub |
プログラムAを終了させます。
プログラムB-1|プログラム開始
1 |
Sub SendMail(mydata, shinsei_id, newfolderpath) |
プログラムA-14から3つの引数を受け取って、処理を行います。
プログラムB-2|Outlookを起動してメールを作成
1 2 3 4 |
Dim OutlookObj As Outlook.Application Set OutlookObj = New Outlook.Application Dim myMail As Outlook.MailItem Set myMail = OutlookObj.CreateItem(olMailItem) |
「Dim OutlookObj As outlook.Application」で、outlook起動用の変数をOutlookObjとして変数定義を行います。
「Set outlookObj = New Outlook.Application」でOutlookを起動します。
Outlookメールを作成し、myMailとします。
ここで作成したOutlookメールはPCの裏側で動いているので、PC画面上には出てきません。
Outlookに関するオブジェクト生成については、以下で詳しく紹介しています。
プログラムB-3|メール本文と宛先を設定
1 2 3 4 5 6 7 8 9 10 11 |
Dim mailaddress As String, mailbody As String mailbody = "■" & shinsei_id & "<br>" mailbody = vbCrLf & mailbody & "<a href=""" & newfolderpath & """>" & newfolderpath & "</a><br>" Dim i As Long For i = LBound(mydata) To UBound(mydata) If i < 8 Then mailbody = mailbody & "<br>" & "■" & mydata(i, 1) & "<br>" & mydata(i, 2) & "<br>" Else mailaddress = mailaddress & ";" & mydata(i, 2) End If Next |
HTMLメールを生成していきます。
newfolderpathで設定したフォルダリンクをクリックできるようにするために、HTMLメールを採用しています。
HTMLメールの生成に必要なタグの付与に関する説明は以下のページで行っています。
プログラムB-4|メール内容を設定
1 2 3 4 5 |
mymail.BodyFormat = 2 mymail.To = mailaddress mymail.cc = "fastclassinfo@gmail.com" '管理者のメールアドレスを入れる mymail.subject = "【申請】件名:" & mydata(1, 2) & " 期限:" & mydata(2, 2) mymail.HTMLBody = mailbody |
メール内容を設定します。
mymail.BodyFormat=2とすることで、HTMLメールを生成することが可能です。
メール内容の設定については、以下のページで説明しています。
プログラムB-5|メール表示・送信
1 2 |
'mymail.Display mymail.Send |
HTMLメールを作成することで、以下のようにリンクからフォルダにアクセスすることができます。
メールで自動生成されたリンクが関連者に通知されるので、フォルダリンクを別途連絡する必要はありません。
ムダな連絡を減らせることで、効率化できます。
メール自動通知は切り替え可能
「mymail.Display」でメール表示、「mymail.Send」でメール送信が可能です。
今回は「’mymail.Display」のとおり、コメントアウトしています。
コメントアウトすることにより、メール表示をスキップしてメール送信だけを実行させるようにしています。
そうすることで、自動でフォームで設定したメールアドレスに申請情報が通知されます。
なおコメントアウト「’」を削除して「mymail.Display」とすれば、メール表示をさせることも可能です。
お好みの設定に合わせて変更するとよいです。
プログラムB-6|オブジェクト解放
1 2 |
Set mymail = Nothing Set outlookObj = Nothing |
メール作成で使用したOutlookのオブジェクト解放を行います。
プログラムB-7|プログラム終了
1 |
End Sub |
プログラムBを終了させます。
今回の事例では、プログラムB-7が完了したら、プログラムA-15から処理を続けます。
プログラム説明はここまでです。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
成長の過程は以下で紹介しています。
学習の過程では、意識すべきポイントがあります。
特に独学の場合だと、勉強を優先してしまい、肝心な実践を疎かにしがちです。
私の経験では、実践から逆算した勉強が必要だと考えています。
目指すべきは会社でお金をもらいながら勉強することです。
要はVBAを仕事の一つとして上司に認めてもらうのです。
そうすればわざわざ高いお金を払って勉強をする必要がなくなります。
しかも作業を自動化して、会社やチームに貢献しつつ、自らのスキルアップできます。
そのために必要な考え方を以下で紹介しています。
とはいえ、プログラミング初心者でVBAについて知識ゼロの人もいるはずです。
いきなり会社でVBAで使うことさえ、とてつもなくハードルが高く見えてしまうものです。
その場合は、VBAの基本について学ぶ必要があります。
たとえば車の運転も慣れてしまえば、たいしたことではありません。
しかし教習所で運転の基本を学び、免許を取得することで、公道で運転できるようになります。
VBAも同じです。VBAに免許はありませんが、まずは基本を学ばないことには会社で使えるレベルにはなりません。
実際に私もプログラミング初心者のときは、動画を見たり書籍を読んだりして勉強しました。
今はオンラインの教材で無料で学習できるものも多いです。
上記のリンクでは、私の経験から勉強にオススメの教材を紹介しています。
興味がある人はご覧ください。