【連載】#25 バッチファイル や Access ツールをリファクタリングしよう

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
【連載】#24 Access VBA の関数ライブラリを使いExcel のブック間で 指定セル領域をコピーしよう
【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
しらかば堂

いつも記事を読んで頂きありがとうございます~
今日の調子はいかがですか?

 

バッチファイル や Access ツールをリファクタリングしよう


本記事ではバッチファイル や Access ツールで作成してきたツールに
「Ⅰ. 東京都コロナウイルスによる 入院者数と退院者数比率推移」
に続き
「Ⅱ.東京都コロナウイルス 男女別 入院者数推移」

「Ⅲ.東京都コロナウイルス世代別入院者数推移」

というグラフを追加作成するに先立ち、ここまでに作成してきたツールの内容を以下の観点

  • 外観
  • ユーザーインターフェース
  • ツール展開
  • 機能分担

で課題抽出し、リファクタリングするやり方を紹介したいと思います。

リファクタリングとは、ソフトウェアの挙動を変えることなく、その内部構造を整理することです。

ところでなぜリファクタリングが必要なんでしょうか?

それは以下の記事

【連載】#06 めんどくさい仕事を楽にするツールをAccess VBAを使ってどう作るのか

でも紹介しているように業務改善のアプローチは課題を分解可能な小さなピースに分解し、このピースごとに少しずつ解決、実装していくことで

  • 日々効果を実感できる
  • 作業の効率化を図るモチベーションが維持できる

といったメリットが得られるのですが、一方でこれらのピースを組み立てていく中でこれはこうしたほうがより効果的といったことが普通にあるわけです。

そこで適切なタイミングで作成済のツールをリファクタリングし、業務改善プロセスをより効果的なものにしていきましょう。

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
しらかば堂

今回はデスクトップ上にアイコンが散らかってきたことや
以下のグラフ作成用の機能追加を行うにあたり
機能分担に課題があることに気が付いたこと等が
直接的なリファクタリングのきっかけになっています。
「Ⅱ.東京都コロナウイルス 男女別 入院者数推移」や
「Ⅲ.東京都コロナウイルス世代別入院者数推移」

それでは早速現状のツールの課題を考えてみましょう。

外観上の課題

デスクトップ

まずデスクトップに注目してみましょう。

読者の皆さんが

【連載】#23 バッチファイル で CSVダウンロード Access データ処理 Excel グラフ描画 を統合する

を含めた記事を順番に読んで頂き、自分のPCで実際に動かしながら遊んで頂いているとすると皆さんのデスクトップは次のような感じになっているのではないでしょうか。

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう

つまり 東京都_新型コロナウイルス陽性患者発表詳細 に掲載された
URL: https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv

を用いて次の 「Ⅰ. 東京都コロナウイルスによる 入院者数と退院者数比率推移」という2軸グラフを自動描画するまでに計10個のファイルをデスクトップ上に追加しています。

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう

 

この連載では続いて以下の「Ⅱ.東京都コロナウイルス 男女別 入院者数推移」や「Ⅲ.東京都コロナウイルス世代別入院者数推移」というグラフを作って行くわけですが

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
【連載】#25 バッチファイル や Access ツールをリファクタリングしよう

読者の方でこう思われた方はいないでしょうか?

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
みなみ

あの~しらかば堂さ~ん
この調子でいったら
デスクトップがファイルだらけになっちゃいませんかぁ~?

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
しらかば堂

ぎくっ!

じつは

【Windows業務効率化】バッチファイルでツールのフォルダ環境を自動生成しよう

の記事でも紹介されているようにデスクトップにファイルをいっぱい置いておくと

  • PCの起動時間がだんだん遅くなる
  • ファイルを探すのに無駄な時間がかかり業務効率が落ちる
  • たくさんのアイコンで気が散る

など、あまりいいことはありません。

つまりPCのデスクトップには次のようにツールへのショートカットのみを置くようにしたほうが美しいですよね。

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう

ツール名称

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
しらかば堂

その他何か気が付いたことはありますか?

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
みなみ

しらかば堂さ~ん
じゃあこの際だから言わせて頂きますけど
大体、16_01.accdb とか 18_02.accdb とか 23_01.accdb とかって
何ですかぁ~?
意味わかんないんですけどぉ~

みなみさんのご指摘はごもっともです。
つまり今はツール名からその役割が連想できないという課題がありますよね。

ツール名もそのツール名からその役割が連想できるように名称変更し、自分でツールを置くと決めたフォルダに置くようにしたほうが美しいし、ツールの生産効率も格段によくなります。

ユーザーインターフェースの課題

警告ダイアログ

続いて 記事 #23 で見て頂いた以下の動画をもう一度何回か見て頂きましょう。 

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
しらかば堂

何か気がつきませんでした?

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
みなみ

バッチファイルを起動したあと
グラフを表示するまでにずっとPCの前にいて
マウスを10回クリックしてましたぁ~

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
しらかば堂

お疲れ様っす!

つまりこのバッチファイルで作業が自動化され、良かった良かったと言いたい一方で、あなたはPCの前にいて、マウスを連続してクリックしていた訳で、その間お手洗いに席を立つこともできていません。

このバッチファイル中の不要なクリック操作が無くなれば、バッチファイルが仕事をしている間あなたは席を立って休憩することもできるようになりますよね~。

CSVダウンロード方式

また記事 #23  でも紹介した Edge を利用した CSV のダウンロード方式ですが、先ほどの動画の中で確認できたようにバッチファイルが Edge 処理の終了を確認するために処理を中断しましたよね。そして1つ余分にENTERキー入れてバッチファイルが再開していました。

このダウンロード処理はバッチファイルの前半にあるので、実用上の問題はあまりないですが不要な操作を減らし、休憩時間を増やすという意味でもっと改善したいですよね~。

ツール展開上の課題

ここまではいまのツールの使い勝手的の課題でした。

しかし実はこのツールには皆さんにこのツールを展開するにあたっての以下の課題も考える必要があります。

CSVの内部テーブルへのインポート方式

具体的には CSVファイルを Access 内のテーブルにインポートするにあたり

【連載】#15 CSVファイルを直接Accessのテーブルにインポートする方法を説明します

で紹介されているように、Access 内で 事前にこのインポート操作を保存し、これをマクロの中のアクションで呼び出すことでこれを簡単に実現していますが

ここで保存されたインポート操作の中には対象CSVファイルへの絶対パス名が保存されるため、簡単な反面、このツールを他のユーザーに展開したいときにはこのインポート操作をそれぞれのユーザーに再度実行してもらわないといけないという課題がありました。

ツールをグループ内のメンバに展開したいといったことを考えたとき、何とか展開されたユーザーがこのようなインポート作業を繰り返さないでいいようにしたいですよね。

 

外部テーブルのリンク方式

同様に Access のツール内から他の Access ツール内のテーブルへのリンクを作成するにあたり

【連載】#17 他のAccessファイルのテーブルを参照して再利用する方法を説明します

で紹介されているように Access 内のメニューから簡単に他の Access データベースへのリンクが作成できます。

ここで保存されたリンク情報には対象 Access データベースへの絶対パス名が保存されるため、簡単な反面、このツールを他のユーザーに展開したいときにはこのリンク操作をそれぞれのユーザーに再度実行してもらわないといけないという課題がありました。

ツールをグループ内のメンバに展開したいといったことを考えたとき、何とか展開されたユーザーがこのようなリンク作業を繰り返さないでいいようにしたいですよね。

 

テーブルの外部 Excel ブックへのエクスポート方式

さらにテーブルを Excel ブックにエクスポートするにあたり 

【連載】#14 Access のテーブルを Excelブックにエクスポートする方法を説明します


の記事でも紹介されているように、Access 内で 事前にこのエクスポート操作を保存し、これをマクロの中のアクションで呼び出すことでこれを簡単に実現できます。

ここで保存されたエクスポート操作の中には対象 Excel ブックへの絶対パス名が保存されるため、簡単な反面、このツールを他のユーザーに展開したいときにはこのエクスポート操作をそれぞれのユーザーに再度実行してもらわないといけないという課題がありました。

ツールをグループ内のメンバに展開したいといったことを考えたとき、何とか展開されたユーザーがこのようなエクスポート作業を繰り返さないでいいようにしたいですよね。

ツールの機能分担上の課題

次にこのリファクタリングの実行を決意させるに至った最も重要なツールの機能分担という観点での課題をご紹介しましょう。

まず再度これから紹介する「Ⅱ.東京都コロナウイルス 男女別 入院者数推移」や「Ⅲ.東京都コロナウイルス世代別入院者数推移」というグラフを再掲しますね。

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
【連載】#25 バッチファイル や Access ツールをリファクタリングしよう

これらのグラフは「Ⅰ. 東京都コロナウイルスによる 入院者数と退院者数比率推移」という2軸グラフ同様グラフを書くのに必要なデータを作成しなければいけません。つまり

【連載】#18 Access を使ってグラフ作成用データをどのように作るか一緒に考えよう

でもご紹介の通り

Ⅰ. 東京都コロナウイルスによる 入院者数と退院者数比率推移」

を描くのに必要なデータは

  1. グラフの横軸となる日付(400日分)
  2. 日付毎の退院者数(退院済フラグの合計)
  3. 日付毎の入院者数
  4. 退院率=日付毎の退院数÷日付毎の入院率

でした。

同様に

Ⅱ.東京都コロナウイルス 男女別 入院者数推移」では

  1. グラフの横軸となる日付(400日分)
  2. 日付毎の女性入院者数
  3. 日付毎の男性入院者数

というデータが必要で

Ⅲ.東京都コロナウイルス世代別入院者数推移」では

  1. グラフの横軸となる日付(400日分)
  2. 日付毎の入院者数(10歳未満)
  3. 日付毎の入院者数(10代)
  4. 日付毎の入院者数(20代)
  5. 日付毎の入院者数(30代)
  6. 日付毎の入院者数(40代)
  7. 日付毎の入院者数(50代)
  8. 日付毎の入院者数(60代)
  9. 日付毎の入院者数(70代)
  10. 日付毎の入院者数(80代)
  11. 日付毎の入院者数(90代)
  12. 日付毎の入院者数(100歳以上)

というデータが必要になると予測されます。

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
みなみ

あれ?
もしかして
グラフの横軸となる日付(400日分)
日付毎の入院者数

って3つのグラフで一緒?

【連載】#25 バッチファイル や Access ツールをリファクタリングしよう
しらかば堂

すごいっ!
良く気が付きましたね~

そうなんです。
記事 #23 の中では今まで作成した Access ツールの機能分担について以下のように紹介していますが

ファイルの紹介記事 ファイル名 機能
【連載】#16 Accessのマクロを細かく調整し、おしゃれに自動化する方法を説明します
16_01.accdb ダウンロードフォルダ配下に保存された 130001_tokyo_covid19_patients.csv
をもとに 16_01.accdb 内に T0000_東京都コロナ発症状況_マスタ テーブルを作成します
【連載】#22 Accessの選択クエリでテーブルの フィールド間計算をしよう
18_02.accdb 16_01.accdb 内の T0000_東京都コロナ発症状況_マスタ テーブルを参照し
デスクトップ上に T1040_日付_退院者数_入院者数_退院率.xlsx を作成します

この

  • グラフの横軸となる日付(400日分)
  • 日付毎の入院者数

の部分は上の例でいうと T0000_東京都コロナ発症状況_マスタ テーブル作成のときに一緒にやってしまった方が機能分担、ツール作成の効率化の観点で望ましいですよね。

 

リファクタリングの実際

リファクタリングの方針

抽出された課題を元に、この連載記事で紹介しているツールのリファクタリングの方針を以下のようにしましょう。

項番 解決したい課題 リファクタリングの方針
1 デスクトップの整理とツールの名称変更

記事 【Windows業務効率化】バッチファイルでツールのフォルダ環境を自動生成しよう を参照してツール構築用の正式フォルダを定義します。

このフォルダ定義によって以降のアクションやバッチファイル中で登場する

  • %USERPROFILE%\Tools\bat
  • %USERPROFILE%\Tools\accdb
  • %USERPROFILE%\Tools_Data_Static\xlsx
  • %USERPROFILE%\Tools_Data_Temp\xlsx

といったフォルダが利用可能になります。

2 デスクトップ上に配置されているツールを以下のフォルダに移動し名称変更します。

3

23_01.bat ⇒
%USERPROFILE%\Tools\bat\作成_東京都コロナウイルス_発症者推移グラフ.bat

そしてこのバッチファイルへのショートカット
 作成_東京都コロナウイルス_発症者推移グラフ.bat – ショートカット
をデスクトップ上に配置します。

4 16_01.accdb
%USERPROFILE%\Tools\accdb\作成_T0000_東京都コロナ発症状況_マスタ.accdb
5 18_02.accdb
%USERPROFILE%\Tools\accdb\作成_T1040_日付_退院者数_入院者数_退院率_xlsx.accdb
6 23_01.accdb
%USERPROFILE%\Tools\accdb\更新_東京都コロナ感染者分析グラフ_xlsx.accdb
7

T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx
%USERPROFILE%\Tools_Data_Static\xlsx\T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx

8 不要な警告ダイアログの抑制 未使用につき
16_01.accdb から T0000_東京都コロナ発症状況_マスタ.xlsx エキスポート処理、および関連ダイアログを削除します。
9 18_02.accdb から 
T1040_日付_退院者数_入院者数_退院率.xlsx が作成された メッセージダイアログの出力を削除します。
10 23_01.accdb から
T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx へのデータコピーがされた旨のッセージダイアログの出力を削除します。
11 ツールからの絶対パス情報を相対パス情報に変更 16_01.accdb
ダウンロードフォルダからの
130001_tokyo_covid19_patients.csv インポート処理を
しらかば堂のユーザー定義関数(VBA) ImportCSVFileによる相対パス指定に変更します。
12 18_02.accdb
16_01.accdb 内 T0000_東京都コロナ発症状況_マスタ テーブルへのリンク処理を
しらかば堂のユーザー定義関数(VBA) LinkExternalDbTable による相対パス指定に変更します。
13 18_02.accdb
T1040_日付_退院者数_入院者数_退院率 テーブルの
T1040_日付_退院者数_入院者数_退院率.xlsx への エクスポート処理を
しらかば堂のユーザー定義関数(VBA) ExortTableToBook による相対パス指定に変更します。
14

23_01.accdb内のアクション内で

しらかば堂のユーザー定義関数(VBA) ExportInputBookToOutputBook によるExcel ブック内シートのコピー元とコピー先を%USERPROFILE%からの相対パス指定

Desktop\xlsx\T1040_日付_退院者数_入院者数_退院率.xlsx
Desktop\xlsx\T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx
から
Tools_Data_Static\xlsx\T1040_日付_退院者数_入院者数_退院率.xlsx
Tools_Data_Static\xlsx\T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx
に修正します。

15

日付(400日分)、日付毎の入院者数抽出機能の移動

16_01.accdb の
T0000_東京都コロナ発症状況_マスタ テーブル
に日付(400日分)、日付毎の入院者数抽出機能を移動します。

16 CSVのダウンロード方式の変更 23_01.bat 内で
Microsoft Edge を使用して実行していたインターネットからの
130001_tokyo_covid19_patients.csv ダウンロード処理を
しらかば堂のユーザー定義関数(VBA) DownloadCsvFromUrl による直接ダウンロード方式に変更します。
17 バッチファイルの調整 ここまでの各種修正に対応することを目的として
23_01.bat の内容を調整し、
%USERPROFILE%\Tools\bat\作成_東京都コロナウイルス_発症者推移グラフ.bat
として保存します。

 

リファクタリング後のバッチファイル

記事作成の構成上、新機能である「Ⅱ.東京都コロナウイルス 男女別 入院者数推移」や「Ⅲ.東京都コロナウイルス世代別入院者数推移」に対するグラフ用データ作成処理、同グラフ描画処理を含んでしまいますが、上記のリファクタリングを実施後のバッチファイルは以下のようなものになります。


@echo off

setlocal

rem スリープタイマ値を設定する
set wait_time=2

echo 01.%USERPROFILE%\Downloadsに移動
timeout /t %wait_time% > nul
cd %USERPROFILE%\Downloads

if exist 130001_tokyo_covid19_patients.csv (
  echo 02.旧 130001_tokyo_covid19_patients.csv ファイルを削除
  timeout /t %wait_time% > nul
  del 130001_tokyo_covid19_patients*.*
  del /Q %USERPROFILE%\Tools_Data_Temp\xlsx\*.*
)

echo 03.新 130001_tokyo_covid19_patients.csv ファイルをダウンロード
timeout /t %wait_time% > nul
cd %USERPROFILE%\Tools\accdb
入手_130001_tokyo_covid19_patients_csv.accdb

echo 04.%USERPROFILE%\Tools\accdbに移動
timeout /t %wait_time% > nul
cd %USERPROFILE%\Tools\accdb

echo 05.130001_tokyo_covid19_patients.csv から T0000_東京都コロナ発症状況_マスタ を作成
timeout /t %wait_time% > nul
作成_T0000_東京都コロナ発症状況_マスタ.accdb

echo 06.T0000_東京都コロナ発症状況_マスタ から T1040_日付_退院者数_入院者数_退院率.xlsx を作成
timeout /t %wait_time% > nul
作成_T1040_日付_退院者数_入院者数_退院率_xlsx.accdb

echo 07.T0000_東京都コロナ発症状況_マスタ から T2040_日付_女性入院者数_男性入院者数.xlsx を作成
timeout /t %wait_time% > nul
作成_T2040_日付_女性入院者数_男性入院者数_xlsx.accdb

echo 08.T0000_東京都コロナ発症状況_マスタ から T3200_日付_年代別入院者数.xlsx を作成
timeout /t %wait_time% > nul
作成_T3200_日付_年代別入院者数_xlsx.accdb

echo 09.3つのグラフ描画用データをそれぞれのグラフ描画用テンプレートにコピー
timeout /t %wait_time% > nul
copy %USERPROFILE%\Tools_Data_Static\xlsx\*_グラフ.xlsx %USERPROFILE%\Tools_Data_Temp\xlsx

更新_東京都コロナ感染者分析グラフ_xlsx.accdb

echo 10.T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx を起動
timeout /t %wait_time% > nul
%USERPROFILE%\Tools_Data_Temp\xlsx\T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx

echo 11.T2040_日付_女性入院者数_男性入院者数_グラフ.xlsx を起動
timeout /t %wait_time% > nul
%USERPROFILE%\Tools_Data_Temp\xlsx\T2040_日付_女性入院者数_男性入院者数_グラフ.xlsx

echo 12.T3200_日付_年代別入院者数_グラフ.xlsx を起動
timeout /t %wait_time% > nul
%USERPROFILE%\Tools_Data_Temp\xlsx\T3200_日付_年代別入院者数_グラフ.xlsx

endlocal

pause
explorer /e ./root,%USERPROFILE%\Tools_Data_Temp\xlsx

 

リファクタリング後の動作デモ

同様に記事作成の構成上、新機能である「Ⅱ.東京都コロナウイルス 男女別 入院者数推移」や「Ⅲ.東京都コロナウイルス世代別入院者数推移」に対するグラフ用データ作成処理、同グラフ描画処理を含んでしまいますが

このデスクトップにある 作成_東京都コロナウイルス_発症者推移グラフ.bat – ショートカット をダブルクリックしたあとのツールの動きを 記事 #23 の動画との差も意識しながら次の動画を何回かご覧頂いて確認ください。

画面をフルスクリーンにしたり、再生スピードを変更して何回か見て頂くことをお勧めします。

まとめ

本記事ではここまでに作成してきたバッチファイル、 Access ツールの内容を以下の観点

  • 外観
  • ユーザーインターフェース
  • ツール展開
  • 機能分担

で課題抽出し、リファクタリングしていくやり方を紹介しました。

さらにリファクタリングの方針を示したうえで

  • 具体的バッチファイルの内容
  • リファクタリング後のバッチファイルのデモ画像

についてもざっくりと紹介しました。

次回以降は本記事の中で紹介した変更内容について具体的に紹介していき

そして新機能である「Ⅱ.東京都コロナウイルス 男女別 入院者数推移」や「Ⅲ.東京都コロナウイルス世代別入院者数推移」に対するグラフ用データ作成処理、同グラフ描画処理について順次紹介していきたいと思います。

さてこの記事全体の目標は

  • 今の状況から抜け出してもっと前向きな仕事に取り組みたい
  • さっさと仕事を切り上げて充実したアフターファイブを過ごしたい

でしたよね。

あなたの解決したい問題は何ですか?

次回はまた

【連載】#26 リファクタリング後のフォルダ構成とバッチファイル を確認しよう


で Access VBA の新しい窓を開きましょう。


Microsoft Access 関連教材は次のリンクからどうぞ。

Access VBA 関連教材の紹介