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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

445閲覧

Python for文について if文について

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/07 14:32

編集2021/10/09 06:55

下記内容で、for b in rrr の処理を一つしたらfor文を抜けるように、if b == bb: という処理を付けましたがうまくいきません。特にエラーは出ないのですが、for b in rrr の処理を一周してしまいます。
for bb in range(6,Sheet_Max2,1)= [5]値
for b in rrr = [6]値
if b == bb: = [5] == [6]・・・初期地
= [6] == [6]・・・二週目にてbreak
というイメージなのですが、うまくいきません。
どのようにしたらよろしいでしょうか。

お手数おかけしますがご教授お願いいたします。

Python

1Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート 2rrr = list(range(5,Sheet_Max2,1)) 3 4for bb in range(6,Sheet_Max2,1): 5 for b in rrr: 6 if b == bb:#次の行に移行したら処理終了させたい 7 Sheet_Max1 = ws.max_row#シート最終行を取得 コピー先シート 8 for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 9 if ws.cell(row=a, column=2).value is not None:#rowに最終行からのセル情報が順次代入される、値の入ったセルがあれば、次の処理 10 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 11 kensin = ws1.cell(row=b,column=3).value#セルコピー 12 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 13 break 14 break 15 wb.save('C:\Users\**\OneDrive\デスクトップ\1-1 可茂.xlsx')

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

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

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

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

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

guest

回答1

0

ベストアンサー

インデントがずれているのと、条件判断を間違えているのが原因ではないでしょうか。

下記の箇所は、

python

1for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する・・・この値をrowへ代入したい 2 if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する 3 break 4for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 5 if ws.cell(row=a, column=2).value is not None:#rowに最終行からのセル情報が順次代入される、値の入ったセルがあれば、次の処理 6 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 7 kensin = ws1.cell(row=b,column=2).value#セルコピー 8 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 9 break 10wb.save(f'C:\テスト用\個別表2\{key}\{v}.xlsx')

本当は以下のようにされるつもりだったのではないかと想像します。

python

1for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する・・・この値をrowへ代入したい 2 if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する 3 break 4 for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 5 if ws.cell(row=a, column=2).value is not None:#rowに最終行からのセル情報が順次代入される、値の入ったセルがあれば、次の処理 6 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 7 kensin = ws1.cell(row=b,column=2).value#セルコピー 8 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 9 break 10wb.save(f'C:\テスト用\個別表2\{key}\{v}.xlsx')

あと同じ上記のコードの次の箇所は、コメントと実際にやっていることが一致していません。

python

1if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する 2 break

コメントは「空白セルになったら終了する」となっていますが、実際のコードは「空白セルでなかったら終了する」になっています。

「空白セルになったら終了する」にしたいのなら、コードは

python

1if ws1.cell(row=b, column=3).value is None: 2 break

にしなければなりません。isとかis notとかが分かりにくければ、

python

1if ws1.cell(row=b, column=3).value == None: 2 break

でもいいです。

本番環境で実際に運用するのはまだまだ先でしょうから、今のうちにもっとコードを整理して、処理の対象や目的ごとにコードをまとめたり、変数にもっと分かりやすい名前をつけたりした方がいいと思いますよ。


Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート
はループの中、
for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する
の直前に入れてください。

修正前:

python

1Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート 2Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート 3 41for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する 5 if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する 6 break 7 2for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 8 if ws.cell(row=a, column=2).value is not None: 9 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 10 kensin = ws1.cell(row=b,column=2).value#セルコピー 11 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 12 break 13 wb.save('C:\book1.xlsx')

修正後:

python

1Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート 2 3for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する 4 if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する 5 break 6 Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート 7 for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 8 if ws.cell(row=a, column=2).value is not None: 9 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 10 kensin = ws1.cell(row=b,column=2).value#セルコピー 11 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 12 break 13 wb.save('C:\book1.xlsx')

if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する

if ws1.cell(row=b, column=3).value is None:
もしくは
if ws1.cell(row=b, column=3).value == None:
に修正してください。これはすでに指摘済みです。

修正前:

python

1Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート 2 3for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する 4 if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する 5 break 6 Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート 7 for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 8 if ws.cell(row=a, column=2).value is not None: 9 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 10 kensin = ws1.cell(row=b,column=2).value#セルコピー 11 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 12 break 13 wb.save('C:\book1.xlsx')

修正後:

python

1Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート 2 3for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する 4 if ws1.cell(row=b, column=3).value is None:#空白セルになったら終了する 5 break 6 Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート 7 for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 8 if ws.cell(row=a, column=2).value is not None: 9 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 10 kensin = ws1.cell(row=b,column=2).value#セルコピー 11 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 12 break 13 wb.save('C:\book1.xlsx')

Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート
及び
Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート
から
+ 1
を削除してください。
最終行はws.max_rowで取得できており、+ 1をつける理由がありません。この事例の場合は害にはなりませんが、無駄です。

修正前:

python

1Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート 2 3for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する 4 if ws1.cell(row=b, column=3).value is None:#空白セルになったら終了する 5 break 6 Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート 7 for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 8 if ws.cell(row=a, column=2).value is not None: 9 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 10 kensin = ws1.cell(row=b,column=2).value#セルコピー 11 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 12 break 13 wb.save('C:\book1.xlsx')

修正後:

python

1Sheet_Max2 = ws1.max_row #シートの最終行を取得する コピー元シート 2 3for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する 4 if ws1.cell(row=b, column=3).value is None:#空白セルになったら終了する 5 break 6 Sheet_Max1 = ws.max_row #シート最終行を取得 コピー先シート 7 for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する 8 if ws.cell(row=a, column=2).value is not None: 9 ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加 10 kensin = ws1.cell(row=b,column=2).value#セルコピー 11 ws.cell(row=a+1,column=3,value=kensin)#セル貼付け 12 break 13 wb.save('C:\book1.xlsx')

投稿2021/10/08 14:43

編集2021/10/09 00:33
etherbeg

総合スコア1195

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

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

退会済みユーザー

退会済みユーザー

2021/10/08 17:31

etherbeg様 お世話になっております。 インデントのご指摘ありがとうございます。 修正して実行してみたところ、まだわからない点がありますのでよろしければ教えていただけないでしょうか。 for b in list(range(4,Sheet_Max2,1)): この部分で、コピー元シートを一行ずつ取得しているつもりなのですが、実行して、コピー先エクセルファイルを確認すると、4行目(始点)と、最終行の値しか入っておらず、その間の値がエクセルへ代入されていません。どれだけ、プログラム内容をみても理由がわからず悩んでおります。お時間ありましたらご教授お願いいたします。
退会済みユーザー

退会済みユーザー

2021/10/08 18:12

etherbeg様 お世話になっております。 質問内容を簡潔にわかりやすいよう変更いたしました。 お手数おかけしますが、そちらを見ていただけると先ほど質問した内容がわかりやすいかと思います。 お手数おかけしますがご確認お願いたします。
etherbeg

2021/10/09 00:33

回答に追記しました。
退会済みユーザー

退会済みユーザー

2021/10/09 00:50

etherbeg様 ご返信ありがとうございます。 頂いた回答で繰り返し処理の問題は解決いたしました。 最後にもう一つだけ、ご教授願いたい内容があります。 質問内容をまた、変更いたしますので、よろしければ教えてください。 etherbeg様のようにここにコードを入力できればいいのですが、やり方がわかりませんので、掲示板の質問の方を修正させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問