python|VBAをopenpyxlで書き直す。

書き換え結果

書き換え元の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ではなくこの一冊から初めていただきたいですね。

コメント

タイトルとURLをコピーしました