質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4540閲覧

Python openpyxl セル最終行へ値を代入する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/10/06 12:59

編集2021/10/06 14:06

エクセルファイルを順次開き、ファイルの指定列(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')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

etherbeg

2021/10/06 13:21 編集

ws と ws1 の二つのシートはどういう関係にあるのでしょうか? ここで答えずに質問に追記してください。
etherbeg

2021/10/06 13:29

Sheet_Max の値や、if ws1.cell(row=i,column=2).value == None など、条件判断は ws1 シートを使って行っているのに、値を書き込むときはいきなり ws シートに書き込んでいる(しかも row の値も column の値も ws1 と同じものを使っている)ので、その二つがどういう関係にあるのかわかりません。
etherbeg

2021/10/06 13:33

> ファイルの指定列(B列)の最終行へ値を代入したい このB列は ws シートのB列でしょうか? > rowの値にB列の最終行の値を代入する このB列は ws1 シートのB列でしょうか?
退会済みユーザー

退会済みユーザー

2021/10/06 13:46

etherbeg様 先日はお世話になりました。また、よろしくお願いいたします。 ご指摘ありました部分ですが、私の記述ミスです。 wsシートのB列が正しいので、質問内容を修正いたしました。 お手数おかけしますが、ご確認お願いいたします。
etherbeg

2021/10/06 13:52

ひとつのワークシート内での話ということですね。了解しました。 しかし「rangeで1から回しているため、値も1行目から入力されてしまいます」というのがわかりません。 値を書き込む前に  if ws.cell(row=i,column=2).value == None と条件判断をしているので、すでにB列に値が書き込まれている行のB列には何も書き込まない(上書きしない)と思うのですが…
etherbeg

2021/10/06 14:05

もしかして1〜3行目のB列は空欄だけど、4〜8行目のB列には入力済というパターンもあって、この場合は1〜3行のB列には何も入力することなく、9行目のB列のみに入力したいということでしょうか?
退会済みユーザー

退会済みユーザー

2021/10/06 14:14

etherbeg様 説明不足で申し訳ありません。 おっしゃる通りです。空白行もあるため、その部分はスルーして最終行を取得したいです。
etherbeg

2021/10/06 14:29 編集

なるほど…。 空白行があって、入力行があって、また空白行があって、入力行がある、みたいな歯抜けパターンも考慮する必要がありますか?  あと、ws.max_row の値はB列の最終入力行と一致すると無条件に考えていいですか? 次のような場合は、ws.max_row の値は、B列の最終入力行の番号よりも大きくなってしまいますが…。 ① B列以外の列で、B列の最終入力行より下の行に値が入力されている列がある ② B列の最終入力行より下の行に、罫線が引かれたり、スタイル(背景色など)が設定されている箇所がある この①②のパターンも、それぞれ考慮する必要がありますか?
退会済みユーザー

退会済みユーザー

2021/10/06 15:00 編集

etherbeg様 返信ありがとうございます。 先ほど、空白があるといいましたが、空白の無いように設定できそうですので、B列の値に空白はないという設定でお願いできますでしょうか。1行目から値の入った最終行までに空白はないという設定でお願いいたします。 ①は、B列が必ず最終行になるような表になっているので問題ありません。 ②は、罫線が引かれていますのでその部分を考慮する必要があります。 実は、罫線が引かれていない最終行の取得方法はネット上で沢山見かけるのですが、罫線が入っている値の最終行取得方法は情報がすくなく困っていました。 ファイルを取り込んだ後、罫線を消す処理をしてから、最終行を取得する方法ができれば試してみようかと考えていたところです。 罫線を一度消して、あとから罫線を引きなおして保存するという方法でも問題ありません。 お手数おかけしますが、ご確認お願いいたします。
guest

回答1

0

ベストアンサー

最終行から1行目に向かって確認していって、値のある行を確認でき次第、その次の行に値を書き込んでからループを抜けたらどうでしょうか。これなら間に空行があってもなくても、最終行以降に罫線等があってもなくても、関係ありません。

python

1>>> for i in range(5, 0, -1): 2... print(i) 3... 45 54 63 72 81

python

1Sheet_Max = ws.max_row 2for i in range(Sheet_Max, 0, -1): 3 if ws.cell(row=i, column=2).value is not None: 4 ws.cell(row=i+1, column=2).value = 'ガス料金' 5 break

投稿2021/10/07 00:32

etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/10/07 02:08

etherbeg様 返信ありがとうございます。 いただいた記述内容で私が欲しい結果を得ることが出来ました。 内容もとても分かりやすく、とても感謝しております。 ご親切に私の質問内容に対しても不足情報を細かく聞いていただき、記述内容を教えていただきありがとうございました。 ここで止まっており数日経過しておりましたので本当にありがとうございます。
etherbeg

2021/10/07 03:28

うまくいってよかったです。 主要なロジックを考えるのとその実装はすでにご自分でされてたので…私はそこにちょっと味付けを加えただけです。
退会済みユーザー

退会済みユーザー

2021/10/07 06:43

etherbeg様 自分では全く想像できなかった内容でしたのでとても勉強になりますし、本当に助かりました。 また、これから質問させていただくこともあると思いますので、お時間ありましたらお気に留めていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問