LoginSignup
beginbeginner
@beginbeginner

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

xlwingsを使用した行挿入

解決したいこと

xlwingsを使用して、条件に一致した場合に行挿入をするスクリプトを作成したい。

Excelの表データ処理で、A列が1だった場合に1行下に空の行を1行挿入する処理が必要になりました。
本番データをイジる前に、仮の表で試しに以下のようなスクリプトを作成したところ、該当行の直後ではなく最終行にまとめて行挿入されました。
どこを修正したらよいかわからず詰まっています。
お詳しい方ご教授お願いします。
また、C列に入っているようなセル参照する関数は、スクリプトで行挿入することによって参照範囲がずれるのでしょうか

背景としては、会社の方針でpythonを使用した自動化を推奨しており、当方全くの初心者のため苦戦しております。

該当するソースコード

import xlwings as xw
wb = xw.Book("testsave.xlsx")
ws = wb.sheets["new_sheet"]

for a in range(1,100) :
    if ws.range(a,4).value == 1 :
        ws.range(a,1).insert('down')
#wb.save("testsave.xlsx")
#wb.close("testsave.xlsx")

表情報

対象シート「new_sheet」にはA列に数値を入れてあります。
対象シート「new_sheet」にはB列に数値を入れてあります。
対象シート「new_sheet」にはC列に[=SUM(A1,B1)]のように同行のA列とB列の値を合計する関数を入れてあります。

0

1Answer

上のコードを実行するとエラーになりました。

$ python hoge.py
Traceback (most recent call last):
  File "hoge.py", line 6, in <module>
    if ws.range(a,4).value == 1 :
       ^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/xlwings/main.py", line 1439, in range
    return Range(impl=self.impl.range(cell1, cell2))
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/xlwings/_xlmac.py", line 694, in range
    raise ValueError("Invalid parameters")
ValueError: Invalid parameters

sheet.range(int,int)なるシンタックスは存在しないと思われますが、本当にこのコードですか?

0

Comments

  1. 上のコードの問題は、1→100の行を対象にしていることです。
    勝手に想定すると、以下のコードになります。(100→1の行を対象)

    import xlwings as xw
    wb = xw.Book("testsave.xlsx")
    ws = wb.sheets["new_sheet"]
    
    max_col = ws.used_range.columns.count
    
    for a in range(100, 0, -1) :
        if ws.range((a, 4)).value == 1 :    #D列=1
            ws.range((a+1, 1), (a+1, max_col)).insert('down')
    
    #wb.save("testsave.xlsx")
    #wb.close("testsave.xlsx")
    
  2. @beginbeginner

    Questioner

    ご回答ありがとうございます。
    まず質問のコードですが、私の環境では動いてはいるように見えます。

    修正していただいたコードですが、実行したところ想定した動きをすることを確認いたしました。
    また、2点ほど不明点がございます。
    ・max_colは何を定義しているものでしょうか
    ・1→100ではなく100→1にする理由は何でしょうか

    初歩的な質問で申し訳ございませんが、ご教授いただけますでしょうか

  3. ・max_colは何を定義しているものでしょうか

    シートの列方向の最大を求めています。
    xlwingsは、行のrangeが無いようなので、A列からmax_col列までのセルに空セルを挿入しました。

    ・1→100ではなく100→1にする理由は何でしょうか

    1→100だと、例えば、26行目(の下)に行の挿入が発生すると、次の27行目のはずが、そこは挿入した空行のため、28行目になりますね。
    このように、行の挿入が何度も発生すると最終行の100が 何行目になるか分からないですよね。
    100→1にするとなぜうまくいくのかは、ご自身で考えてみてください。

Your answer might help someone💌