書き換え結果
書き換え元のVBAコード
VB
Sub 請求書作成()
Dim cnt
Dim rw
With Worksheets("請求書")
.Range("A3").Value = Range("B3").Value
.Range("E3").Value = Date
rw = 7
.Range("A7:E13").ClearContents
For cnt = 6 To 23
If Range("B" & cnt).Value = Range("B3").Value Then
.Range("A" & rw).Value = Range("A" & cnt).Value
.Range("B" & rw).Value = Range("C" & cnt).Value
.Range("C" & rw).Value = Range("D" & cnt).Value
.Range("D" & rw).Value = Range("E" & cnt).Value
.Range("E" & rw).Value = Range("F" & cnt).Value
rw = rw + 1
End If
Next
End With
End Sub
書き換え後のpythonコード
Python
# Import the required libraries.
import openpyxl
#Specified the excel file path
xl_file = "/content/drive/MyDrive/Excel_Files/売上管理.xlsx"
# Load the Excel workbook from the specified path
wb = openpyxl.load_workbook(filename = xl_file)
# Get the worksheet from the sheet name
sh = wb["売上"]
# Access the cell by ("A1:B1") style ※This is a tuple
cells = sh["A6:F23"]
# Specify target cell
target_cell = sh["B3"]
# filltering cells by target_cell
new_cells = list(filter(lambda x:x[1].value == target_cell.value, cells))
# Delete the column ※Spacyfy the Column to "if i != 1"
new2_cells = [tuple(x for i, x in enumerate(t) if i != 1) for t in new_cells]
# Specify target work sheet
result_sh = wb["請求書"]
# Get today in serial number
today = datetime.now()
excel_date_offset = datetime(1899,12,30)
delta = today - excel_date_offset
# Insert day into cell
result_sh["E3"] = float(delta.days)
# copying cell value
for i,row in enumerate(new2_cells):
for j,cell in enumerate(row):
if j == 4:
result_sh.cell(7+i, 1+j).value = new2_cells[i][j-1].value * new2_cells[i][j-2].value
else:
result_sh.cell(7+i, 1+j).value = cell.value
# save
wb.save(filename = xl_file)
VBAコードをopenpyxlで書き直しに挑戦してみました。書き換え元のVBAコードは立山秀利さんの名著「入門書のexcel vba」から利用させていただいています。エクセルブックは下記のリンクでダウンロードできます。
書き換えてみて
書き換え前はもっとすっきりしたコードで書けるだろうと考えていましたが、実際にやってみると全然そんなことはありませんでした。いかにその理由を考察してみます。
- VBAには用意されているが、openpyxlでは用意されていないメソッドが多い(例:clear contents)
- openpyxlは転記が非常にやりづらい。
- ブックのオープンとセーブを行う必要がある。
マクロは古いとか、python至上主義が目立つ昨今ではあるが、やはりpythonはpython、VBAはVBAでそれぞれ、得て不得手があると思う。Excelに限って自動化したいなら、VBAで作った方が、手っ取り早いしコードも短くて済む。
参考書籍
立山秀利さんの「入門者のExcelVBA」は非常に名著、私がプログラミングを始めるきっかけとなった本です。
プログラミングの知識がゼロの人に向けた書き方がされており、変数の概念説明なども、非常にわかりやすく解説されています。
もしゼロからプログラミングを始めるなら、pythonではなくこの一冊から初めていただきたいですね。
コメント