語学学校やプログラミングのイベントに出席するためには、残業せずに帰宅できるように全力で仕事をする必要がある。別にダラダラと仕事をしているわけじゃない。これまでだって、PhraseExpressを使ってテンプレートを作ってみたり、マクロを活用する仕組みを考えて効率化を進めてきたくらいだ。それでも、定時帰宅するには努力が足りないっぽい。(人員不足じゃなかろうかとも思えるけど、補充される気配はない。)
あまり大きな変更をする時間的余裕はないので、これまで効率化を進めてきた業務をほんのちょっとだけ改良をしてみることにした。(本当にちょっとだけ)
Contents
業務概要
当該業務は以前も書いているが、「毎月自動配信されてくるCSVデータを集計する」という業務で、これまでは以下の流れで対応していた。
以前の記事
- 自動配信されたメールの添付ファイルをSharePoint上の指定のフォルダに格納。
- 集計用エクセルファイルを開き、データの更新をして保存。
- 営業チームへ共有。(了)
これでも十分なほどにシンプルな流れを作ることが出来たと思っている。
改善ポイント
以前から改良の余地には気がついていたものの「それなりに動くしいいっか」と放って置いたものも含め、ほんのちょっとずつ変更してみた。
- 自動配信メールの添付ファイルを自動でSharePointに格納。
- 集計ファイルをマクロで作り、ファイルを開いたらピボットテーブルが更新され、閉じると同じフォルダに、【YYMMDD_[ファイル名].xlsx】という名前のファイルが追加される。
- 2.のファイルを営業チームへ送信(→残念ながらまだマニュアル処理)。(了)
それでは、順に説明していく。
Microsoft Flowを使って実現する。このタスクに限らず、私がよく使っているフロー。
受信フォルダに入ってきたメールをそのまま指定することも可能だが、Inbox Zeroを目指しているので、別にフォルダに仕分ける。
仕分けのルールはよく知られた機能だけど、念の為、以下が設定方法。
次に、Flowで指定のフォルダに条件に当てはまるメールが追加されたら、添付ファイルをSharePointに保存する設定をする。
フローを最初から作るのも良いが、MS Flowのページで、EmailとかSharePointなどとキーワードを入力すると、サンプルのフローがヒットするので、それを少し修正して使うのがミスなく簡単に出来ると思う。
下図が、サンプル。私はメールの詳細設定で、送信者アドレス、件名に含まれる文字、添付の有無を指定している。(前述のメールの仕分け部分でしているので本来は不要だが、念には念を。)
簡単。
最新版のデータファイルを作成する《マクロ》
PowerQueryを使っているのでデータファイルが指定したフォルダに格納された時点で、タスクの8〜9割は完了している。残りの1〜2割がピボットテーブル・作成日の更新。
今回は、これをマクロで解決。マクロ有効ファイルを開いたら、ピボットテーブルを更新し、日付を入力。マクロ有効ファイルを閉じたら、ファイル名に日付の入ったxlsxファイル(マクロなし)を作成する。
■ファイルを開けた時
Private Sub Workbook_Open() | |
'refresh all the pivot tables in the workbook | |
Dim PT As PivotTable | |
Dim WS As Worksheet | |
For Each WS In Me.Worksheets | |
For Each PT In WS.PivotTables | |
PT.RefreshTable | |
Next PT | |
Next WS | |
End Sub |
■ファイルを閉じる時
右上の【☓】をクリックして閉じて問題ない。
Private Sub Workbook_BeforeClose(Cancel As Boolean) | |
Dim fso As Object | |
Dim fName As String | |
Dim fPath As String | |
Set fso = CreateObject("Scripting.FileSystemObject") | |
Me.Worksheets(1).Cells("B4").Value = "Updated on " & Format(Now, "dd mmm yyyy") | |
'セルに表示形式を設定しておくなら日付のデータを入力するだけでいい。 | |
fName = fso.GetBaseName(Me.Name) | |
fPath = Me.Path | |
Application.DisplayAlerts = False | |
Me.SaveAs Filename:=fPath & "\" & Format(Now, "yymmdd") & "_" & fName, FileFormat:=xlWorkbookDefault | |
Application.DisplayAlerts = True | |
End Sub |
おまけ
実は、データの更新に関しては、マクロを使用しない方法もある。設定で「ファイルを開いたら更新」という機能をオンにすればいい。
ただ、この方法を取ると、当該ファイルだけでなく、どのエクセルファイルを開いても即座にデータが更新されてしまうので、あんまり嬉しくない。今回、マクロでの解決策を選択したのはこういう理由。