経理のExcel作業の効率化。シート集計プログラムを作ってExcelVBAとPythonの違いを体感してみました。
3/92021
カテゴリー:プログラミング
経理業務にExcelは切っても切れない課題です。
特にデジタル時代において、Excelデータを効率的に扱うスキルは必要です。
Excel関数を駆使することも大事ですが、
それでは対応できない処理(繰り返し処理など)はプログラミングに頼ることになります。
そこで、今回Excelを効率化する2つのプログラミング
- Excel VBA
- Python
の2つを使って同じプログラムを作ってみました。
そこで感じた2つの違いを書いてみたいと思います。
Excel VBA、Pythonに興味ある方の参考になれば幸いです。
ExcelとPythonの違い
簡単に、2つの違いを簡単にまとめてみました。
Excel VBA | Python | |
ソフト | 必要なし | 必要 |
エディタ | 必要なし | 必要 |
ライブラリ | 必要なし | 必要 |
コードの長さ | 普通 | 短め |
処理の速さ | 普通 | 早い |
Excelのバージョン | 関係あり | 関係なし |
OS | 関係あり | 関係なし |
用途の拡張性 | なし | あり |
難易度 | やや高め | 高め |
複数のシートをまとめるプログラムを作ってみました
今回、複数のシート(月別の売上実績)を集計シートにまとめる、
というプログラムをExcel VBAとPythonで作ってみました。
実務ではよく使う処理かな、と思います。
Excel VBAで作ったコード
Sub SheetTotal()
' ①変数の宣言
Dim wsTotal As Worksheet ' 集計シートの変数
Dim wsData As Worksheet '各月のシートの変数
Dim FirstRow As Long '書き込む最初の行の変数
Dim LastRow As Long ' 書き込む最後の行の変数
Dim r As Long '初期の行の変数
Dim i As Long '通し番号
'wsTotal 変数にTotalシートをセット
Set wsTotal = Worksheets("Total")
'集計シートを初期化
wsTotal.Rows("2:" & Rows.Count).ClearContents
'書き込みの最初の行を2にする
FirstRow = 2
'②各月のシートの値を集計シートに転記する
For Each wsData In Worksheets
With wsData
If .Name <> "Total" Then
For r = 2 To Cells(1, 1).End(xlDown).Row
If .Cells(r, 1) <> "" Then
wsTotal.Cells(FirstRow, 2) = .Cells(r, 2)
wsTotal.Cells(FirstRow, 3) = .Cells(r, 3)
wsTotal.Cells(FirstRow, 4) = .Cells(r, 4)
wsTotal.Cells(FirstRow, 5) = .Cells(r, 5)
FirstRow = FirstRow + 1
End If
Next
End If
End With
Next
' ③通し番号を入力
With wsData
i = 1
Do While i <= Cells(2, 2).End(xlDown).Row - 1
wsTotal.Cells(i + 1, "A") = i
i = i + 1
Loop
End With
End Sub
大きく分けて、
- 変数の宣言
- 各月のシートの値を集計シートに転記
- 通し番号を入力
という形で処理しました。
処理はこんな感じでうごきます。(3秒程度)
(3秒かかったのは私の書き方の下手さも影響あるかもです)
ExcelVBAの特徴
Excel VBAとは、Excel内で動く自動化のプログラムです。
マクロ機能を使うと操作記録がVBAとして記録されます。ただマクロでは変数や繰り返し処理などができないので
自動化をしたい場合は、VBAを直接記述していくことが基本です。
そのメリットは、「始めやすさ」だと思っています。
ExcelVBAはExcelに付随していきますので、あらたにソフトは必要ありません。
コードを記述する「VBE」というエディタも付随してきます。
↓このような画面です
このへんが最初にソフトが必要なPythonと比較して楽だと思います。
ただ、Excelのバージョン、OS(WIndows、Mac OSなど)によっては
動作しない場合もあり互換性の面でデメリットがあります。
また用途は、基本的にはExcelに限られます。
難易度ですが、上記のプログラムのように
変数、条件分岐(If)、繰り返し処理(for EachとDo Loop)を理解すれば
大抵のことはできると考えています。
とはいえ、マクロやRPAのように視覚的に操作して
記録するのではなく、直接プログラミングするということで、やや難易度は高めと感じます。
したがって、
- いますぐ始めたい
- 自分ひとり又は限られた少人数で効率化できるプログラムを作りたい
- Excel内で完結させたい
- マクロだけでは満足したものが作れない
という人にお勧めです。
Pythonで作ったコード
Pythonで作ったコードは以下のとおりです。
from openpyxl import load_workbook
wb = load_workbook("売上実績.xlsx")
ws_shukei = wb["集計"]
row_list = []
#集計シート以降のシートを一括して取得
for ws in wb.worksheets[1:]:
#3行目からMax行と、3列目からMax列まで1行ずつ取得
for row in ws.iter_rows(min_row=2, max_row=ws.max_row,
min_col=2, max_col=ws.max_column):
#cell_list変数に、セルの値とnumber_format属性をタプルとして要素にしたリストを代入
cell_list = [(cell.value, cell.number_format) for cell in row]
#cell_list変数をrow_list変数に追加していく
row_list.append(cell_list)
#row_list変数のデータを取得する。
for i, row in enumerate(row_list):
#番号列にはi変数を設定して通し番号にする。
row_no = i + 2
ws_shukei.cell(row_no, 1).value = i + 1
for j, cell in enumerate(row):
#列番号を取得
col_no = j + 2
#指定した行、列にrow_listのデータと書式を貼り付けていく。
ws_shukei.cell(row_no, col_no).value = cell[0]
ws_shukei.cell(row_no, col_no).number_format = cell[1]
wb.save('売上実績変更後.xlsx')
処理は大きく分けて
- ライブラリのインポート
- 変数の宣言
- 実績シートのデータを取得、リストを作成
- リストを集計シートに貼り付け
- 新しくファイルを作って保存
という形で行っています。
処理はこんな感じでした(ファイル作成含め1秒くらい)
Pythonの特徴
Pythonは、表でも書いた通りソフトのインストール、コードを記述するエディタがまず必要となります。
また、便利な処理がひとまとめにされている「ライブラリ」という機能も必須です。
ここらへんがExcel VBAと比べて難易度は高いのですが、
メリットはコードを短め(というかスマート?)に書けること、そして処理の速さです。
よりプログラミングをしている気分になれます。
また、ExcelのバージョンやOSに振り回されないため
「誰かが作ったマクロ、VBAが転がっているけど、使えなくなっていた・・」
ということがありません。
また、Excel操作だけでなく
Webやアプリケーション(Eメール送信等)の操作、人工知能など様々な用途にも使えるため拡張性があります。
一方難易度は、
ExcelVBAよりも高いと思います。
ただ、人気のプログラミング言語とも言われている通り
他の言語と比べれば書きやすい部類です。
したがって、
- プログラミングの知識は多少ある
- チーム内で共有できる互換性のあるプログラムを作りたい
- Excelだけでなく、様々な用途にも活用したい
という方にお勧めです。
まとめ
ExcelVBAとPythonでプログラムを書いてみて、
感じたことをまとめてみました。
どちらも慣れるまでは大変ですが、
経理業務にExcel効率化は必須ですので、
興味ある方はぜひお試しください。
編集後記
昨日は、確定申告作業、月次報告作業など。
最近のあたらしいこと
ヨガ
ソニーのノイズキャンセリングイヤホン