エクセルファイルを順次開き、ファイルの指定列(B列)の最終行へ値を代入したいのですがどのように記述していいかがわかりません。ファイルにより最終行が異なるため、ファイルを開くたびに最終行を取得し、その値をrowに指定しなければいけませんが、その方法がわかりません。
ws.cell(row=i,column=2).value=('ガス料金')の部分のrowの値にB列の最終行の値を代入するにはどのように記述したらよろしいでしょうか。
お手数おかけしますがご教授お願いいたします。
Python
1for key, value in so_dict2.items():#コピー先ファイル取得 2 for v in value: 3 wb = openpyxl.load_workbook(f'C:\Users\個別表2\{key}\{v}.xlsx') 4 ws = wb[sheet_name]#コピー先シート取得 5 Sheet_Max = ws1.max_row + 1#シート最終行を取得 6 for i in (range(1,Sheet_Max)):#一行目から順次最終行までを取得する 7 if ws.cell(row=i,column=2).value == None:#B列がNoneだったら 8 ws.cell(row=i,column=2).value = ('ガス料金')#品名のカラムに品名追加 9 wb.save(f'C:\Users\個別表2\{key}\{v}.xlsx')
ws と ws1 の二つのシートはどういう関係にあるのでしょうか?
ここで答えずに質問に追記してください。
Sheet_Max の値や、if ws1.cell(row=i,column=2).value == None など、条件判断は ws1 シートを使って行っているのに、値を書き込むときはいきなり ws シートに書き込んでいる(しかも row の値も column の値も ws1 と同じものを使っている)ので、その二つがどういう関係にあるのかわかりません。
> ファイルの指定列(B列)の最終行へ値を代入したい
このB列は ws シートのB列でしょうか?
> rowの値にB列の最終行の値を代入する
このB列は ws1 シートのB列でしょうか?
etherbeg様
先日はお世話になりました。また、よろしくお願いいたします。
ご指摘ありました部分ですが、私の記述ミスです。
wsシートのB列が正しいので、質問内容を修正いたしました。
お手数おかけしますが、ご確認お願いいたします。
ひとつのワークシート内での話ということですね。了解しました。
しかし「rangeで1から回しているため、値も1行目から入力されてしまいます」というのがわかりません。
値を書き込む前に
if ws.cell(row=i,column=2).value == None
と条件判断をしているので、すでにB列に値が書き込まれている行のB列には何も書き込まない(上書きしない)と思うのですが…
もしかして1〜3行目のB列は空欄だけど、4〜8行目のB列には入力済というパターンもあって、この場合は1〜3行のB列には何も入力することなく、9行目のB列のみに入力したいということでしょうか?
etherbeg様
説明不足で申し訳ありません。
おっしゃる通りです。空白行もあるため、その部分はスルーして最終行を取得したいです。
なるほど…。
空白行があって、入力行があって、また空白行があって、入力行がある、みたいな歯抜けパターンも考慮する必要がありますか?
あと、ws.max_row の値はB列の最終入力行と一致すると無条件に考えていいですか? 次のような場合は、ws.max_row の値は、B列の最終入力行の番号よりも大きくなってしまいますが…。
① B列以外の列で、B列の最終入力行より下の行に値が入力されている列がある
② B列の最終入力行より下の行に、罫線が引かれたり、スタイル(背景色など)が設定されている箇所がある
この①②のパターンも、それぞれ考慮する必要がありますか?
etherbeg様
返信ありがとうございます。
先ほど、空白があるといいましたが、空白の無いように設定できそうですので、B列の値に空白はないという設定でお願いできますでしょうか。1行目から値の入った最終行までに空白はないという設定でお願いいたします。
①は、B列が必ず最終行になるような表になっているので問題ありません。
②は、罫線が引かれていますのでその部分を考慮する必要があります。
実は、罫線が引かれていない最終行の取得方法はネット上で沢山見かけるのですが、罫線が入っている値の最終行取得方法は情報がすくなく困っていました。
ファイルを取り込んだ後、罫線を消す処理をしてから、最終行を取得する方法ができれば試してみようかと考えていたところです。
罫線を一度消して、あとから罫線を引きなおして保存するという方法でも問題ありません。
お手数おかけしますが、ご確認お願いいたします。
回答1件
あなたの回答
tips
プレビュー