1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonでエクエルの行列を挿入したときに式のアドレスを追従機能をChatGPTに作成してもらう

Posted at

openpyxl で エクセル操作
insert_rowsで行を挿入した場合、式のアドレスは追従してくれない
ChatGPTに聞いて作ってもらいました所要時間5分。。。
動作確認用の入力データ作成やこの記事作成のほうが時間かかったよ
ChatGPTに使われる素人なボク

これがあれば、仕様変更になって行列追加になっても対応できる!!!

ChatGPT.質問.txt
(1)
openpyxl で insert_row を実施したさいに 数式があった場合にずれが発生します、ずれが発生した式を矯正する方法、例えば3行目に空白行を挿入した場合、それより下の"="で始まる数式で”[A-Z]+[0-9]+”にマッチするアドレスをずらした分に修正する
(2)
新しいinsert_rowとして関数化してください、また列バージョンの例も提示してください
(3)
挿入行より下だけ修正した場合、挿入行より上の式に対応できないようです、なのですべての行をチェックして式の行番号をチェックして挿入行番号より大きい場合に修正するようにお願いします
参考入力CSV形式.xlsx
11,=A1*C1,19,=C1*E1,27
101,=A2*C2,43,=C2*E2,-15
=A2/A4,=B2/B4,=C2/C4,=D2/D4,=E2/E4
-103,=A4+C4,-101,=C4+E4,-99
-145,=A5+C5,-143,=C5+E5,-141
-187,=A6+C6,-185,=C6+E6,-183

左挿入前<==========>右挿入後
image.png

openxl_insert.py
import openpyxl
import re

def insert_row_and_adjust_formula(sheet, insert_row):
    # 行を挿入
    sheet.insert_rows(insert_row)

    # 修正対象の数式を含むセルを探して修正
    for row in range(1, sheet.max_row + 1):  # 全ての行を対象
        for col in range(1, sheet.max_column + 1):  # 全ての列をチェック
            cell = sheet.cell(row=row, column=col)
            if isinstance(cell.value, str) and cell.value.startswith('='):
                # 数式に含まれるセル参照を修正
                def adjust_reference(match):
                    col_ref, row_ref = match.groups()
                    new_row_ref = int(row_ref) + (1 if int(row_ref) >= insert_row else 0)  # 挿入行以降の行だけ修正
                    return f"{col_ref}{new_row_ref}"

                # 数式のセル参照を正規表現で修正
                new_formula = re.sub(r'([A-Z]+)([0-9]+)', adjust_reference, cell.value)
                cell.value = new_formula  # 修正した数式をセルに再設定

def insert_column_and_adjust_formula(sheet, insert_col):
    # 列を挿入
    sheet.insert_cols(insert_col)

    # 修正対象の数式を含むセルを探して修正
    for row in range(1, sheet.max_row + 1):  # 全ての行を対象
        for col in range(1, sheet.max_column + 1):  # 全ての列をチェック
            cell = sheet.cell(row=row, column=col)
            if isinstance(cell.value, str) and cell.value.startswith('='):
                # 数式に含まれるセル参照を修正
                def adjust_reference(match):
                    col_ref, row_ref = match.groups()
                    new_col_ref = chr(ord(col_ref) + 1) if (ord(col_ref) - 65 + 1) >= insert_col else col_ref
                    return f"{new_col_ref}{row_ref}"

                # 数式のセル参照を正規表現で修正
                new_formula = re.sub(r'([A-Z]+)([0-9]+)', adjust_reference, cell.value)
                cell.value = new_formula  # 修正した数式をセルに再設定

# Excelファイルを読み込み
workbook = openpyxl.load_workbook('a.xlsx')
sheet = workbook.active

# 4列目に空白列を挿入
insert_column_and_adjust_formula(sheet, 4)
# 4行目に空白行を挿入
insert_row_and_adjust_formula(sheet, 4)
# 2列目に空白列を挿入
insert_column_and_adjust_formula(sheet, 2)
# 2行目に空白行を挿入
insert_row_and_adjust_formula(sheet, 2)

# 保存
workbook.save('example_adjusted.xlsx')

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?