Pythonをどのように業務に役立てていけば良いのか考えています。
これまでVBAで行なっていた作業は次の4つに分類できます。
- Excelで入力したものを元に帳票やグラフを作成してExcelで表示するもの(Excel→Excel)
- 他のシステムからCSVファイルで受け取ったものを元にExcelで帳票やグラフを作成してExcelで表示するもの(CSV→Excel)
- Excelで入力したものを元にCSVファイルを作成して他のシステムに渡すもの(Excel→CSV)
- 他のシステムからCSVファイルで受け取ったものを元に別の形式のCSVファイルを作成して他のシステムに渡すもの(CSV→CSV)
このうち1.と2.はVBAの処理時間が長いなどの問題が無い限りそのままExcelで処理すれば良いと思います。Pythonを利用するとすれば3.か4.の場合だと思います。
3.に該当するものとして、以前にExcelで入力したデータを元にVBAで弥生会計にインポートするためのデータを作成する方法を載せたことがありましたが、
今回はそれをPythonでやってみました。
次のような様式のExcelのファイルを読み込みます。
コードは以下のようなものです。
- csv、Decimalモジュールは、標準ライブラリなので追加でインストールする必要はありません。
- openpyxlは事前にインストールが必要です。
- カレントディレクトリにある koguchi_shukei.xlsm を読み込んで koguchi.csv を出力します。
import openpyxl
import csv
from decimal import Decimal, ROUND_HALF_UP
wb = openpyxl.load_workbook('koguchi_shukei.xlsm',data_only = 'True')
ws = wb.worksheets[0]
koguchi_list = []
##ワークシートの2行目、2列目から取り扱う
for row in ws.iter_rows(min_row=2, min_col=2):
col_a = '2000'
col_b = ''
col_c = ''
col_d = row[0].value.strftime('%Y/%m/%d')
col_e = row[3].value
if row[3].value == '買掛金' or row[3].value == '未払金':
col_f = row[2].value
else:
col_f =''
col_g = ''
if row[7].value == '10%':
col_h = '課対仕入内10%'
elif row[7].value == '8%':
col_h = '課対仕入内8%'
elif row[7].value == '軽減8%':
col_h = '課対仕入内軽減8%'
elif row[7].value == '対象外':
col_h = '対象外'
else:
col_j = ''
col_i = row[6].value
##四捨五入の処理
if row[7].value == '10%':
col_j = row[6].value - Decimal(str(row[6].value/1.1)).quantize(Decimal('0'), rounding=ROUND_HALF_UP)
elif row[7].value == '8%':
col_j = row[6].value - Decimal(str(row[6].value/1.08)).quantize(Decimal('0'), rounding=ROUND_HALF_UP)
elif row[7].value == '軽減8%':
col_j = row[6].value - Decimal(str(row[6].value/1.08)).quantize(Decimal('0'), rounding=ROUND_HALF_UP)
elif row[7].value == '対象外':
col_j = ''
else:
col_j = ''
col_k = '小口現金'
col_l = ''
col_m = ''
col_n = '対象外'
col_o = row[6].value
col_p = '0'
col_q = row[2].value
col_r = ''
col_s = ''
col_t = '0'
col_u = ''
col_v = ''
col_w = '0'
col_x = '0'
col_y = 'no'
##リストに配列を追加
koguchi_list.append([col_a,col_b,col_c,col_d,col_e,col_f,col_g,col_h,col_i,col_j,col_k,col_l,col_m,col_n,col_o \
,col_p,col_q,col_r,col_s,col_t,col_u,col_v,col_w,col_x,col_y])
##encoding='cp932'を記述するとエラーになるのでエラーを無視する
with open('koguchi.csv','w',encoding='cp932',errors='ignore',newline = '') as f:
writer = csv.writer(f)
## for i in koguchi_list:
## writer.writerow(i)
writer.writerows(koguchi_list)
他にもっとスマートな記述方法があるのかも知れませんが、今はまだPythonのことがよくわかっていないのでこのような書き方しかできません。少しずつ改良して行こうと思います。