こんにちは
セカンドセレクションのMuramatsuです。
今回は「Excelを使った業務効率化」について記事を書きたいと思います。
Excelを使ったデータの集計や分析を、日次、週次、あるいは月次で行っている人は多いのではないでしょうか?その集計結果や分析結果はその後の業務に重要な役割を果たしますよね。
しかし、その結果を得る為の「集計作業」や「分析作業」に多大な時間を費やしていないでしょうか?この時間は決して無駄ではありませんが、出来れば少なくしたいものです。これらの作業を効率的に進める究極の手段の1つに「作業の自動化」があります。
今回は、Excelに用意されているVBAを用いたプログラミングによる「自動化(マクロ)」の事例を解説します。これをマスターし上手に活用すれば、手間のかかる集計作業、分析作業を自動的に効率良く実施し、重要な結果をあっという間に手に入れる事が出来ます。
ExcelのマクロとVBAって何でしょうか?
マクロとは、エクセルの操作を自動化する機能です。
しかしそのマクロの実体は、プログラムコードです。↓こんなやつです。
所で、皆さんはJavascript、Python、PHPなどを聞いたことがありますか?
これらは、プログラミングで使われる言語ですが、Excelのマクロ機能で使われているプログラミング言語がVBA(Visual Basic for Applications)です。
VBAで作成したプログラムは、Excel上にて実行が可能です。ちなみに、VBAもそしてExcel自身もマイクロソフトが開発しているので、Excelの操作の自動化には、VBAがうってつけです。
マクロをつかってできること
マクロを使えば、Excelの面倒な作業を自動化できる!これだけ覚えてください。
たとえば「取得済みのデータを集計しなおし、これらをグラフ化して、そしてそれをメールで配信する」といった一連の定型作業を、ボタン1つクリックするだけで実行する事ができます。すなわち、VBAでプログラム化したマクロを活用すれば、数時間かけていた作業を一瞬で終わらせることが可能になります。
Excelの入力や編集、集計を手作業で行っていて労力も時間も結構かかり、これらを何とか効率よく作業できないか…、こんなお悩みを抱えたことはありませんか?
Excelを使っての、仕入れデータ・売上データの集計や分析、顧客管理表へのデータ追加・更新といった顧客データの管理、請求書の作成と印刷……。こういった日常的な作業に一日数時間、場合によっては丸一日費やしてしまってはいないでしょうか。
これらの作業から得られる結果は、業務にとってどれも非常に大切なものばかりです。従って、結果が必要である以上、これらの作業自身をなくすことは難しいと思います。ですが、これらの作業を効率良く実施する事は出来ます。
重要なのは「作業をする事ではなく、結果を得る事」だからです。
本稿ではExcelを活用した作業の効率化の具体的な事例を紹介します。
これを応用すれば、これらの作業の全部もしくは一部を自動化し、作業の効率を大幅に上げる事が可能になります。
まとめると、マクロを用いることで以下のようなことができます
- 手作業で実施したExcelの操作を記録し、これを再実行できます。
- Excelでの一連の操作全てを、自動実行出来ます。
- Windowsの設定やインターネットのデータ収集といったExcel外の操作も自動実行できます。
※3番目の自動化については、本稿ではここで項目だけ触れるに留めます。
「マクロ記録」について
実はExcelには、「マクロ記録」という機能が元から搭載されていて、手動で行った操作をExcelがVBAコードとして残す事が出来ます。そして、この記録されたVBA コードをマクロとして再実行することでき、これにより操作を自動化できます。この「マクロ記録」を使うだけでも、それなりの自動化は実現できるので非常に便利です。
とはいえ、この「マクロ機能を使ったVBAコード」は、どうしても無駄が多く非効率的なコードとなってしまいます。さらに、「マクロ記録」機能には、適切に記録されない操作も多々あり、そもそも、記録しようにも手動での操作が出来ない場合も多くあります。
例えば同じ操作を何回か繰り返したり、条件により操作内容を切り替える「条件分岐」は、プログラムとして重要な機能ですが、これらは「マクロ記録」では記録する事ができません。
そのため、私たちエンジニアがプログラムをコーディングしていく仕事が生まれます。
実際にVBAを書いて、マクロ(自動化)してみよう
Excelを用いて日常の業務を進める際に、ありがちな作業でありながら、いざ手作業で行おうとすると結構煩わしい作業の1つに、「複数のブックからデータを集めて来る」作業があります。
例えば…
- 日次でブック化されている売上なり発注なりのデータを1か月分集計する。
- 部署別にブック化されているその日のお弁当の注文を1つにまとめる。
これを手作業で行おうとしますと…
- 1つ1つのブックを順に開く。
- 各ブックの所定の領域のデータを、集める先のブックにコピーする。
という2つの作業を、元のブックの数だけ繰り返す事となります。どのブックまでコピーが終わったのか、抜けや重複が出ない様にチェックしながら、さらにコピーする範囲もブック毎にまちまちだったり…、煩わしい事この上ありません。
ここで、VBAを実際に活用してみます。全体像としては以下の通りです。
- Excelファイルの準備する
- マクロの作成環境構築
- 1つ1つのブックを順に開く(マクロの作成…その1)
- ブックの内容を集約先のブックにコピーする(マクロの作成…その2)
- マクロを実行する
Excelファイルの準備
ここでは、各部署から集まって来たお弁当の注文を1つのブックにまとめる作業をVBA化してみます。部署が2か所の場合ですと、こんな具合でしょうか。
(左上と左下のファイルをC:¥Work¥今日の分¥今日のお弁当_総務.xlsx、弁当注文(経理).xlsmで作成してください)
※上記ではわかりやすくするために「集計」は行わず、ただ単に集めてまとめるだけにしています。
ではここで、各ブックの配置=フォルダ構成を決めておきます。
ルートとなるフォルダを「C:¥Work¥弁当注文¥」として、以下の様にします。
①と②のブックは、各部署(ここでは、総務、経理、の2部署)から来た注文のブックです。
そして、③の「弁当注文表.xlsm」は、注文を集める先のブックで、VBAもこのブックに記述する事にします。ここで、③の「弁当注文表.xlsm」は未だブックそのものがありません。ですので、まっさらな状態からブックを作成して行く事になります。
先ず、Excelを起動して「空白のブック」を選択します。
左上の「ファイル」から、「その他」→「名前を付けて保存」→「その他の場所」の「参照」
をクリックします。すると、以下の様なウィンドウが表示されますので、
[1] C:¥Work¥弁当注文
[2] 弁当注文表.xlsm と入力 ※ファイルタイプは「.xlsm」とします。
[3] Excelマクロ有効ブック(*.xlsm)を選択
[4]「保存」をクリックします。
さらに、集める先のシート(左下)をシート名「今日の注文」として、見出しを付けて用意しておきます。
マクロの作成環境構築
先ず、マクロの作成環境を開きます。
[1]「開発」タブを選択(タブがない方はこちら)[2]「マクロ」をクリックします。
以下のウィンドウが開きますので、
[3]「マクロ名」の欄に「CollectOrder」と入力し、
[4]「作成」をクリックします。
以下のウィンドウが開きましたら、マクロの作成環境構築は完了です。ではVBAでプログラムを書いてみましょう。
1つ1つのブックを順に開く(マクロの作成…その1)
・フォルダ内のブックを網羅する
先ず、「C:¥Work¥弁当注文¥今日の分¥」というフォルダの中にあるブック名を「Dir」という便利な関数で、順番に取得します。
※「Sub CollectOrder()」と「End Sub」の間に以下の記述を行います。細かい意味は割愛します。
BookName = Dir(ThisWorkbook.Path & “\今日の分\*.xls*”)
Do
If BookName = “” Then Exit Do
BookName = Dir()
Loop
• ブックを開く
ブック名が順番に取得されましたら、次は、その都度ブックを開きます。
※「If BookName = “” Then Exit Do」と「BookName = Dir()」の間に以下の記述を行います。
Set BUSHO_Workbook = Workbooks.Open(ThisWorkbook.Path & “\今日の分\” & BookName)
BUSHO_Workbook.Close SaveChanges:=False
ブックの内容を集約先のブックにコピーする(マクロの作成…その2)
• 開いたブックからコピーする内容を取得する
先ず、1つ目のブック「今日のお弁当‗総務.xlsx」が開きますので、このブックに対して「集約処理」を行います。2つ目以降のブックも同様に、繰り返し処理の中で実施されます。
「Set BUSHO_Workbook = Workbooks.Open(ThisWorkbook.Path & “\今日の分\” & BookName)」と「BUSHO_Workbook.Close SaveChanges:=False」の間に以下の記述をさらに追加します。
With BUSHO_Workbook.Sheets(“Sheet1”)
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
.Range(.Cells(2, 1), .Cells(LastRow, 2)).Copy
End With
• 取得した内容を集約先に貼り付ける
クリップボードに元のデータがコピーされましたら、集約先にこれを貼り付けます。
先ほど記載した「End With」の下に、さらに以下を追加します。
With ThisWorkbook.Sheets(“今日の注文”)
LastCurrent = .Cells(Rows.Count, 1).End(xlUp).Row
.Paste Destination:=.Range(.Cells(LastCurrent + 1, 1), .Cells(LastCurrent + LastRow – 1, 2))
End With
以上でVBAの作成は終わりです。
マクロを実行する
では自動化するためのVBA作成が終わりましたので、早速実行してみます。
上部にある緑色の「▶」マークをクリックしますと、実行する事が出来ます。
2つのブックに記載されている各部署の注文内容は、「今日の注文」シートに集約されますので、「今日の注文」シートを選択して、集約結果を見てみます。
うまく集約する事が出来ました。
作成したVBAの記述は、「2.マクロの作成環境を立ち上げる」で起動した作成環境を右上の「×」で閉じて、ブックを上書き保存すれば、保存されます。
※再度実行するには、
1)「今日のお弁当.xlsm」ブックを開く
2)「2.マクロの作成環境を立ち上げる」のと同様に、「開発」タブ→「マクロ」とクリック
3)「CollectOrder」を選択し、「実行」をクリック
以上で、ブックの内容を集約する仕組みを作成し、実行する事ができました!
これで、毎日の煩わしい一覧の作業を全てコピー&ペーストする連続作業から解放されます。
VBAをさらに進化させる
ここまで出来ますと欲が出るもので、自動化する範囲を拡張したくなります。
- メニュー毎に集計したい。
- 部署毎に特徴のある書式に対応したい。
- お弁当屋さんへの注文書にしたい。
- 月次で、注文を個人単位で集計したい。
……
上記の様なさらなる処理は、紙面の都合で具体例を示すことは出来ませんが、どれも作成したVBAを改良し進化させる事で対応が可能な処理ばかりです。従って、一つの目標に留まらず順次VBA化にトライする事により、より一層の作業の効率化を進める事が出来ます。
所感
ここまで長文読んでいただきありがとうございました。
日々の作業を少しずつ自動化し短縮していくことがこれからの時代には必要だと思いました。今回はExcelでの自動化でしたが、クラウド上にWebアプリケーションを作成したり、データベースを構築しデータを整理する作業も必要になってくると思います。
日々、業務を進めて行く上で「不毛に感じている作業」はありませんか?
もしありましたら、弊社HPよりご相談下さい。
VBAによるマクロ化を始め、様々な手段による自動化を実現させることが可能です。無料で見積もりをすることができるので、自動化が可能かどうかも含めご相談いただけると嬉しいです。
もしよろしければ他の記事もご覧ください。
SSブログではいろんな情報を発信しています!