[Python] 수식을 셀로 설정합니다.
오늘의 주의(복습)는, 셀의 수식에 관해서입니다.
파이썬에서 Excel을 조작하기 위해 openpyxl이라는 패키지를 사용하고 있습니다.

그리고,

의, 2장의 시트를 가지는 「합계」라고 하는 책을

이런 식을 사용한 시트로 하고 싶습니다.
하고 싶은 것은 이하의 3점입니다.
왠지 점점 정상적인 Excel 업무에 다가온 것 같습니다.
1. 전월 판매 금액을 복사하여 붙여 넣습니다.
f-strings 및 VLOOKUP 함수
단순히 복사하여 붙여 넣은 것은 맛이 없기 때문에 f-srings와
VLOOKUP 함수를 사용해보십시오.
wb = load_workbook('合計.xlsx')
lastmonth = '202101'
month = '202102'
ws_lastmonth = wb[lastmonth]
ws = wb[month]
for row in ws.iter_rows(min_row=6, max_row=ws.max_row):
row_count = row[0].row
row[5].value = f'=VLOOKUP(C{row_count},{lastmonth}!$C$6:$E$15,3,FALSE)'
VLOOKUP 함수는 편리합니다만 제4 인수의 「TRUE」 「FALSE」가 아무래도 미묘한 이해로
「TRUE」의 근사치 검색이 숫자라면 아직 알 수 있습니다만 문자열이 되면・・・.
우선 나는, 「FALSE」밖에 사용한 적이 없습니다.
2. 상대 참조로 수식을 세로 방향으로 복사합니다.
Translator 객체
f-srings를 사용하여 수식을 만들려고 생각했습니다.
openpyxl은 기존 수식을 상대 참조로 복사하는 기능을 제공했기 때문에
여기를 사용해 보겠습니다.
# コピー元の数式をセルG6に設定
cell = Translator(コピーする数式,
origin=相対参照の元となるセル番地).translate_formula(コピーする方向のセル番地)
왠지 Excel의 수식을 드래그하여 복사해 가는 방법과 비슷하네요.
# コピー元の数式をセルG6に設定
ws['G6'] = '=E6-F6'
for row_no in range(7, ws.max_row + 1):
cell_no = f'G{row_no}'
ws[cell_no] = Translator(ws['G6'].value,origin='G6').translate_formula(cell_no)
이번은 세로 방향이므로 이런 느낌입니까?
3. 상대 참조로 수식을 가로로 복사합니다.
이쪽은 가로 방향으로 상대 참조이므로
ws['E3'] = '=SUM(E6:E15)'
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws['E3'].value, origin='E3').translate_formula(f'{col_alphabet}3')
이런 느낌입니까?
마지막으로 위의 설명을 모아
from openpyxl import load_workbook
from openpyxl.formula.translate import Translator
wb = load_workbook('合計.xlsx')
lastmonth = '202101'
month = '202102'
ws_lastmonth = wb[lastmonth]
ws = wb[month]
origin_cell_no_col = 'E3'
ws[origin_cell_no_col] = '=SUM(E6:E15)'
origin_cell_no_row = 'G6'
ws[origin_cell_no_row] = '=E6-F6'
# 202101シートのデータを張り付ける
for row in ws.iter_rows(min_row=6, max_row=ws.max_row):
row_count = row[0].row
row[5].value = f'=VLOOKUP(C{row_count},{lastmonth}!$C$6:$E$15,3,FALSE)'
# 各数値の合計を表示
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws[origin_cell_no_col].value, origin=origin_cell_no_col).translate_formula(f'{col_alphabet}3')
# 前月販売分との差額を表示
for row_no in range(7, ws.max_row + 1):
cell_no = f'G{row_no}'
ws[cell_no] = Translator(ws[origin_cell_no_row].value,
origin=origin_cell_no_row).translate_formula(cell_no)
wb.save('合計_集計後.xlsx')
할 수 있었습니다!
어떻게 든 재사용성을 높이기 위해 함수로 만들고 싶었습니다.
자신에게는 아직도 문턱이 높았던 것 같습니다・・・. 특히 네이밍 센스.
그 밖에도 f-srings와 Translator 객체의 사용소를 구분하는 방법이나
【1】의 처리와 【2】의 처리는 모두 동일하므로, 하나로 정리할 수 없을까.
2020/02/17 추가
나름대로 해소책을 생각해 보았습니다.
from openpyxl import load_workbook
from openpyxl.formula.translate import Translator
wb = load_workbook('合計.xlsx')
lastmonth = '202101'
month = '202102'
ws_lastmonth = wb[lastmonth]
ws = wb[month]
# 起点となるセルの数式を設定
ws['E3'] = '=SUM(E6:E15)'
ws['F6'] = f'=VLOOKUP(C6,{lastmonth}!$C$6:$E$15,3,FALSE)'
ws['G6'] = '=E6-F6'
# 行で相対参照
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws['E3'].value, origin='E3').translate_formula(f'{col_alphabet}3')
# 列で相対参照
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
for row_no in range(7, ws.max_row + 1):
cell_no = f'{col_alphabet}{row_no}'
ws[cell_no] = Translator(ws[f'{col_alphabet}6'].value,
origin=f'{col_alphabet}6').translate_formula(cell_no)
wb.save('合計_集計後.xlsx')
그리고 설명을 해 보는 것이 좋습니다.
아직도 기술을 정리할 수 있을 것 같습니다. 숙제는 변함없이 산적입니다!
공부를 진행해 나가는 가운데 하나씩 해결해 나가고 싶네요!
Reference
이 문제에 관하여([Python] 수식을 셀로 설정합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rihu-do/items/6f264984d1d1a7cbd33c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
wb = load_workbook('合計.xlsx')
lastmonth = '202101'
month = '202102'
ws_lastmonth = wb[lastmonth]
ws = wb[month]
for row in ws.iter_rows(min_row=6, max_row=ws.max_row):
row_count = row[0].row
row[5].value = f'=VLOOKUP(C{row_count},{lastmonth}!$C$6:$E$15,3,FALSE)'
Translator 객체
f-srings를 사용하여 수식을 만들려고 생각했습니다.
openpyxl은 기존 수식을 상대 참조로 복사하는 기능을 제공했기 때문에
여기를 사용해 보겠습니다.
# コピー元の数式をセルG6に設定
cell = Translator(コピーする数式,
origin=相対参照の元となるセル番地).translate_formula(コピーする方向のセル番地)
왠지 Excel의 수식을 드래그하여 복사해 가는 방법과 비슷하네요.
# コピー元の数式をセルG6に設定
ws['G6'] = '=E6-F6'
for row_no in range(7, ws.max_row + 1):
cell_no = f'G{row_no}'
ws[cell_no] = Translator(ws['G6'].value,origin='G6').translate_formula(cell_no)
이번은 세로 방향이므로 이런 느낌입니까?
3. 상대 참조로 수식을 가로로 복사합니다.
이쪽은 가로 방향으로 상대 참조이므로
ws['E3'] = '=SUM(E6:E15)'
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws['E3'].value, origin='E3').translate_formula(f'{col_alphabet}3')
이런 느낌입니까?
마지막으로 위의 설명을 모아
from openpyxl import load_workbook
from openpyxl.formula.translate import Translator
wb = load_workbook('合計.xlsx')
lastmonth = '202101'
month = '202102'
ws_lastmonth = wb[lastmonth]
ws = wb[month]
origin_cell_no_col = 'E3'
ws[origin_cell_no_col] = '=SUM(E6:E15)'
origin_cell_no_row = 'G6'
ws[origin_cell_no_row] = '=E6-F6'
# 202101シートのデータを張り付ける
for row in ws.iter_rows(min_row=6, max_row=ws.max_row):
row_count = row[0].row
row[5].value = f'=VLOOKUP(C{row_count},{lastmonth}!$C$6:$E$15,3,FALSE)'
# 各数値の合計を表示
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws[origin_cell_no_col].value, origin=origin_cell_no_col).translate_formula(f'{col_alphabet}3')
# 前月販売分との差額を表示
for row_no in range(7, ws.max_row + 1):
cell_no = f'G{row_no}'
ws[cell_no] = Translator(ws[origin_cell_no_row].value,
origin=origin_cell_no_row).translate_formula(cell_no)
wb.save('合計_集計後.xlsx')
할 수 있었습니다!
어떻게 든 재사용성을 높이기 위해 함수로 만들고 싶었습니다.
자신에게는 아직도 문턱이 높았던 것 같습니다・・・. 특히 네이밍 센스.
그 밖에도 f-srings와 Translator 객체의 사용소를 구분하는 방법이나
【1】의 처리와 【2】의 처리는 모두 동일하므로, 하나로 정리할 수 없을까.
2020/02/17 추가
나름대로 해소책을 생각해 보았습니다.
from openpyxl import load_workbook
from openpyxl.formula.translate import Translator
wb = load_workbook('合計.xlsx')
lastmonth = '202101'
month = '202102'
ws_lastmonth = wb[lastmonth]
ws = wb[month]
# 起点となるセルの数式を設定
ws['E3'] = '=SUM(E6:E15)'
ws['F6'] = f'=VLOOKUP(C6,{lastmonth}!$C$6:$E$15,3,FALSE)'
ws['G6'] = '=E6-F6'
# 行で相対参照
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws['E3'].value, origin='E3').translate_formula(f'{col_alphabet}3')
# 列で相対参照
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
for row_no in range(7, ws.max_row + 1):
cell_no = f'{col_alphabet}{row_no}'
ws[cell_no] = Translator(ws[f'{col_alphabet}6'].value,
origin=f'{col_alphabet}6').translate_formula(cell_no)
wb.save('合計_集計後.xlsx')
그리고 설명을 해 보는 것이 좋습니다.
아직도 기술을 정리할 수 있을 것 같습니다. 숙제는 변함없이 산적입니다!
공부를 진행해 나가는 가운데 하나씩 해결해 나가고 싶네요!
Reference
이 문제에 관하여([Python] 수식을 셀로 설정합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rihu-do/items/6f264984d1d1a7cbd33c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ws['E3'] = '=SUM(E6:E15)'
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws['E3'].value, origin='E3').translate_formula(f'{col_alphabet}3')
from openpyxl import load_workbook
from openpyxl.formula.translate import Translator
wb = load_workbook('合計.xlsx')
lastmonth = '202101'
month = '202102'
ws_lastmonth = wb[lastmonth]
ws = wb[month]
origin_cell_no_col = 'E3'
ws[origin_cell_no_col] = '=SUM(E6:E15)'
origin_cell_no_row = 'G6'
ws[origin_cell_no_row] = '=E6-F6'
# 202101シートのデータを張り付ける
for row in ws.iter_rows(min_row=6, max_row=ws.max_row):
row_count = row[0].row
row[5].value = f'=VLOOKUP(C{row_count},{lastmonth}!$C$6:$E$15,3,FALSE)'
# 各数値の合計を表示
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws[origin_cell_no_col].value, origin=origin_cell_no_col).translate_formula(f'{col_alphabet}3')
# 前月販売分との差額を表示
for row_no in range(7, ws.max_row + 1):
cell_no = f'G{row_no}'
ws[cell_no] = Translator(ws[origin_cell_no_row].value,
origin=origin_cell_no_row).translate_formula(cell_no)
wb.save('合計_集計後.xlsx')
from openpyxl import load_workbook
from openpyxl.formula.translate import Translator
wb = load_workbook('合計.xlsx')
lastmonth = '202101'
month = '202102'
ws_lastmonth = wb[lastmonth]
ws = wb[month]
# 起点となるセルの数式を設定
ws['E3'] = '=SUM(E6:E15)'
ws['F6'] = f'=VLOOKUP(C6,{lastmonth}!$C$6:$E$15,3,FALSE)'
ws['G6'] = '=E6-F6'
# 行で相対参照
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
ws[f'{col_alphabet}3'] = Translator(
ws['E3'].value, origin='E3').translate_formula(f'{col_alphabet}3')
# 列で相対参照
for col_no in range(6, ws.max_column + 1):
col_alphabet = ws.cell(row=1, column=col_no).column_letter
for row_no in range(7, ws.max_row + 1):
cell_no = f'{col_alphabet}{row_no}'
ws[cell_no] = Translator(ws[f'{col_alphabet}6'].value,
origin=f'{col_alphabet}6').translate_formula(cell_no)
wb.save('合計_集計後.xlsx')
Reference
이 문제에 관하여([Python] 수식을 셀로 설정합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rihu-do/items/6f264984d1d1a7cbd33c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)