実現したいこと
★関数が含まれるExcelファイル[main]の特定の列に関数が入ったまま値を入力したい
⇒そのために[main]を値コピーしたクローンファイル[work]を作成する
①openpyxlでクローンファイル[work]を作成
②[work]の特定シート、特定列を読み取る
③②で読み取ったデータを[main]の特定シート、特定列に値貼り付け
[main]の関数を壊さずに、[main]のシート"display"に出力される関数の結果を、[main]のシート"past"に移動させたい
以下は全て自動で行われていることが理想です
①[main] シート”data”にデータが入力される
②[main] シート”display”の関数が更新("data"の値がvlookupで更新されます)
③vlookupで更新された値をシート"past"の右端+1行に記述したい
※ここでは関数を壊さないで関数の値だけシート移動、貼り付けしたいです。
※シート"past"の右端、右端+1行は関数が含まれていないセルになります。
前提
言語:Python
ライブラリ:openpyxl
関数が入ったファイルを用意します
ファイルA 以下のような関数が含まれたファイルです
ファイルAはシートが3枚あります
現状
理想
workが以下のように値が記載されれば、Noneにならずに値が出力されることがわかりました。
しかし、ファイルAをopenpyxlでコピーするとなぜか現状の通りに関数部分が真っ白になってしまうのです。
上書き保存後の該当ファイル
問題箇所
関数が含まれるExcelファイル[main]の特定の列に関数が入ったまま値を入力したいのですが、
②の段階でNoneと表示され、プログラムが評価されません。
該当のソースコード
Python
1import openpyxl 2 3# Excelファイルを開く 4#excel_file_pathは関数が含まれているファイルAです 5excel_file_path = f"\\\\任意のディレクトリ\\ファイルA.xlsx" 6excel_file_copy_path = f"\\\\任意のディレクトリ\\work.xlsx" 7workbookw = openpyxl.load_workbook(excel_file_path, data_only= True) 8workbookw.save(excel_file_copy_path) 9 10# workを開く 11workbook = openpyxl.load_workbook(excel_file_copy_path, data_only=True) 12 13# 過去分シートとレイアウトシートを取得 14past_sheet = workbook['past'] 15layout_sheet = workbook['display'] 16 17# 過去分シートの行数を取得 18row_count = past_sheet.max_row 19 20# 過去分シートの行をループ 21for row in range(2, row_count + 1): 22 # A列にNEWが入っている場合 23 # ----★この下のprintがNoneになっている★----------------------- 24 print(f"past⇒{past_sheet.cell(row=row, column=1).value}") 25 #----------------------------------------------------------------- 26 if past_sheet.cell(row=row, column=1).value == "NEW": 27 # D列の値を取得 28 search_value = past_sheet.cell(row=row, column=4).value 29 print(f"sv⇒{search_value}") 30 31 # レイアウトシートでVlookupを行う 32 for layout_row in range(2, layout_sheet.max_row + 1): 33 if layout_sheet.cell(row=layout_row, column=6).value == search_value: 34 # 取得した値を過去分シートの最後のセルに出力 35 past_sheet.cell(row=row, column=past_sheet.max_column).value = layout_sheet.cell(row=layout_row, column=29).value 36 break 37 38# Excelファイル(work.xlsx)を保存 39workbook.save(excel_file_copy_path) 40 41# workファイルからmainファイルへの転送 42# 転送元ファイルの設定 43sheet_from = workbookw["display"] 44row_from = sheet_from.max_row 45column_from = sheet_from.max_column 46print(column_from) 47 48# 転送先ファイルの設定 49workbook_to= openpyxl.load_workbook(excel_file_path) 50sheet_to = workbook_to["past"] 51row_to = sheet_to.max_row 52column_to = sheet_to.max_column 53 54# 転送のしくみ 55for j in range(1, row_from): 56 print(sheet_from.cell(row=j, column=column_from).value) 57 sheet_to.cell(row=j, column=column_to+1).value = sheet_from.cell(row=j, column=column_from).value 58print("時の流れはフシギダネ")
試したこと
workbook = openpyxl.load_workbook(excel_file_path, data_only=True)の場合、
★の部分が正しく表示されます。
補足情報(FW/ツールのバージョンなど)
もしかして、このサイトが言及する理由が原因ですか?
https://note.com/vanaya/n/nd46b4b7fc55e
よろしくお願いします。
![guest](/img/icon/icnUserSample.jpg)
回答2件
あなたの回答
tips
プレビュー