インデントがずれているのと、条件判断を間違えているのが原因ではないでしょうか。
下記の箇所は、
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
41⃣for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する
5 if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する
6 break
7 2⃣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 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 17:31
退会済みユーザー
2021/10/08 18:12
2021/10/09 00:33
退会済みユーザー
2021/10/09 00:50