質問編集履歴
6
説明文追加
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Python for文について
|
1
|
+
Python for文について if文について
|
test
CHANGED
@@ -1,71 +1,53 @@
|
|
1
|
-
下記
|
1
|
+
下記内容で、for b in rrr の処理を一つしたらfor文を抜けるように、if b == bb: という処理を付けましたがうまくいきません。特にエラーは出ないのですが、for b in rrr の処理を一周してしまいます。
|
2
2
|
|
3
|
-
2
|
3
|
+
for bb in range(6,Sheet_Max2,1)= [5]値
|
4
4
|
|
5
|
-
|
5
|
+
for b in rrr = [6]値
|
6
6
|
|
7
|
-
|
7
|
+
if b == bb: = [5] == [6]・・・初期地
|
8
8
|
|
9
|
-
|
9
|
+
= [6] == [6]・・・二週目にてbreak
|
10
10
|
|
11
|
-
|
11
|
+
というイメージなのですが、うまくいきません。
|
12
12
|
|
13
|
-
|
13
|
+
どのようにしたらよろしいでしょうか。
|
14
14
|
|
15
|
-
【1-1 加茂 プログラム実行後】
|
16
15
|
|
17
|
-
![イメージ説明](c1bc6bf6cd4a6adf307c0d342bddc1e3.jpeg)
|
18
16
|
|
19
|
-
|
17
|
+
お手数おかけしますがご教授お願いいたします。
|
20
|
-
|
21
|
-
![イメージ説明](0120833259ee0dc5de4f0462197bbf68.jpeg)
|
22
|
-
|
23
|
-
「コピー元シート↓↓ 」
|
24
|
-
|
25
|
-
![イメージ説明](f96b9d2bdde69ebcf74a2d0bdc89bcee.jpeg)
|
26
|
-
|
27
|
-
【私が欲しい内容↓↓】
|
28
|
-
|
29
|
-
![![イメージ説明](2cb9653a381ecf0de6759b9f58a2f7d0.jpeg)](3d126a580a1ba0d0948cd225e8d11573.jpeg)
|
30
18
|
|
31
19
|
|
32
20
|
|
33
21
|
```Python
|
34
22
|
|
35
|
-
|
23
|
+
Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート
|
36
24
|
|
37
|
-
|
25
|
+
rrr = list(range(5,Sheet_Max2,1))
|
38
26
|
|
39
|
-
for v in value:
|
40
27
|
|
41
|
-
wb = openpyxl.load_workbook(f'C:\Users\個別表2\{key}\{v}.xlsx')
|
42
28
|
|
43
|
-
|
29
|
+
for bb in range(6,Sheet_Max2,1):
|
44
30
|
|
45
|
-
|
31
|
+
for b in rrr:
|
46
32
|
|
47
|
-
#
|
33
|
+
if b == bb:#次の行に移行したら処理終了させたい
|
48
34
|
|
49
|
-
|
35
|
+
Sheet_Max1 = ws.max_row#シート最終行を取得 コピー先シート
|
50
36
|
|
51
|
-
|
37
|
+
for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する
|
52
38
|
|
53
|
-
|
39
|
+
if ws.cell(row=a, column=2).value is not None:#rowに最終行からのセル情報が順次代入される、値の入ったセルがあれば、次の処理
|
54
40
|
|
55
|
-
|
41
|
+
ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加
|
56
42
|
|
57
|
-
|
43
|
+
kensin = ws1.cell(row=b,column=3).value#セルコピー
|
58
44
|
|
59
|
-
|
45
|
+
ws.cell(row=a+1,column=3,value=kensin)#セル貼付け
|
60
46
|
|
61
|
-
|
47
|
+
break
|
62
48
|
|
63
|
-
|
49
|
+
break
|
64
50
|
|
65
|
-
ws.cell(row=a+1,column=3,value=kensin)#セル貼付け
|
66
|
-
|
67
|
-
break
|
68
|
-
|
69
|
-
|
51
|
+
wb.save('C:\Users\**\OneDrive\デスクトップ\1-1 可茂.xlsx')
|
70
52
|
|
71
53
|
```
|
5
追加説明
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
下記プログラム内容ですが、1⃣で個別表2のフォルダ1,2を回して、2⃣でコピー元のファイルから一行ずつ抽出、3⃣でセルへ追加、コピーをしているつもりです。
|
1
|
+
下記プログラム内容ですが、for文1⃣で個別表2のフォルダ1,2を回して、for文2⃣でコピー元のファイルから一行ずつ抽出、for文3⃣でセルへ追加、コピーをしているつもりです。
|
2
2
|
|
3
3
|
2⃣で一行取得し、3⃣でコピー先へ代入、上書き保存をし、一行のデータのみそれぞれのファイルに転記、値追加、したいのですが、2⃣で一周した値が各ファイルに代入されてしまいます。
|
4
4
|
|
4
コードの挿入やり直し
test
CHANGED
File without changes
|
test
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
ws = wb[sheet_name]#コピー先シート取得
|
44
44
|
|
45
|
-
Sheet_Max2 = ws1.max_row
|
45
|
+
Sheet_Max2 = ws1.max_row#シートの最終行を取得する コピー元シート
|
46
46
|
|
47
47
|
#コピー元ファイルの列行を取得する
|
48
48
|
|
@@ -52,7 +52,7 @@
|
|
52
52
|
|
53
53
|
continue
|
54
54
|
|
55
|
-
Sheet_Max1 = ws.max_row
|
55
|
+
Sheet_Max1 = ws.max_row#シート最終行を取得 コピー先シート
|
56
56
|
|
57
57
|
3⃣for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する
|
58
58
|
|
3
追加説明
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Python for文にて
|
1
|
+
Python for文について
|
test
CHANGED
@@ -1,55 +1,71 @@
|
|
1
|
-
下記内容で、1⃣
|
1
|
+
下記プログラム内容ですが、1⃣で個別表2のフォルダ1,2を回して、2⃣でコピー元のファイルから一行ずつ抽出、3⃣でセルへ追加、コピーをしているつもりです。
|
2
2
|
|
3
|
-
|
3
|
+
2⃣で一行取得し、3⃣でコピー先へ代入、上書き保存をし、一行のデータのみそれぞれのファイルに転記、値追加、したいのですが、2⃣で一周した値が各ファイルに代入されてしまいます。
|
4
4
|
|
5
|
-
|
5
|
+
これを解消する方法があれば教えてください。
|
6
6
|
|
7
|
+
【key = フォルダ↓↓】
|
8
|
+
|
7
|
-
|
9
|
+
![イメージ説明](9237facf47fe5830b9db5a2a24ff8add.jpeg)
|
10
|
+
|
11
|
+
【value = ファイル↓↓】
|
12
|
+
|
13
|
+
![イメージ説明](8375ebc8aa857101d905f8b2e4614aa2.jpeg)
|
14
|
+
|
15
|
+
【1-1 加茂 プログラム実行後】
|
16
|
+
|
17
|
+
![イメージ説明](c1bc6bf6cd4a6adf307c0d342bddc1e3.jpeg)
|
18
|
+
|
19
|
+
【1-2 寺内 プログラム実行後】
|
20
|
+
|
21
|
+
![イメージ説明](0120833259ee0dc5de4f0462197bbf68.jpeg)
|
8
22
|
|
9
23
|
「コピー元シート↓↓ 」
|
10
24
|
|
11
|
-
![
|
25
|
+
![イメージ説明](f96b9d2bdde69ebcf74a2d0bdc89bcee.jpeg)
|
12
26
|
|
13
|
-
|
27
|
+
【私が欲しい内容↓↓】
|
14
28
|
|
15
|
-
![イメージ説明](
|
29
|
+
![![イメージ説明](2cb9653a381ecf0de6759b9f58a2f7d0.jpeg)](3d126a580a1ba0d0948cd225e8d11573.jpeg)
|
16
30
|
|
17
31
|
|
18
32
|
|
19
33
|
```Python
|
20
34
|
|
21
|
-
|
35
|
+
#key=フォルダ value=ファイル名
|
22
36
|
|
23
|
-
|
37
|
+
1⃣for key, value in so_dict2.items():#コピー先ファイル取得
|
24
38
|
|
25
|
-
|
39
|
+
for v in value:
|
26
40
|
|
27
|
-
w
|
41
|
+
wb = openpyxl.load_workbook(f'C:\Users\個別表2\{key}\{v}.xlsx')
|
28
42
|
|
29
|
-
|
43
|
+
ws = wb[sheet_name]#コピー先シート取得
|
30
44
|
|
31
|
-
Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート
|
45
|
+
Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート
|
32
46
|
|
47
|
+
#コピー元ファイルの列行を取得する
|
33
48
|
|
49
|
+
2⃣for b in range(4,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する
|
34
50
|
|
35
|
-
|
51
|
+
if ws1.cell(row=b, column=3).value is None:#空白セルになったら飛ばす
|
36
52
|
|
37
|
-
|
53
|
+
continue
|
38
54
|
|
39
|
-
|
55
|
+
Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート
|
40
56
|
|
41
|
-
|
57
|
+
3⃣for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する
|
42
58
|
|
43
|
-
if ws.cell(row=a, column=2).value is not None:
|
59
|
+
if ws.cell(row=a, column=2).value is not None:
|
44
60
|
|
45
|
-
ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加
|
61
|
+
ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加
|
46
62
|
|
47
|
-
kensin = ws1.cell(row=b,column=
|
63
|
+
kensin = ws1.cell(row=b,column=3).value#セルコピー
|
48
64
|
|
49
|
-
ws.cell(row=a+1,column=3,value=kensin)#セル貼付け
|
65
|
+
ws.cell(row=a+1,column=3,value=kensin)#セル貼付け
|
50
66
|
|
51
|
-
break
|
67
|
+
break
|
52
68
|
|
53
|
-
wb.save('C:\
|
69
|
+
wb.save(f'C:\Users\個別表2\{key}\{v}.xlsx')
|
54
70
|
|
55
71
|
```
|
2
説明文追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,107 +1,55 @@
|
|
1
|
-
|
1
|
+
下記内容で、1⃣for文で値を一つとってきてから、2⃣for文が一周すると思っていますが、実際出力された内容を確認すると、指定した開始行の文字(可)と最終行の文字(土屋)
|
2
2
|
|
3
|
-
下記内容で、プログラム中に印をした1⃣、2⃣、3⃣の部分を除いた状態で実行すると、各フォルダ(1,2)の中にあるエクセルファイルへ4⃣の値('料金')を指定セルへ代入することができています。1⃣、2⃣、3⃣は別シートの値をコピーし、その値を代入するために記述した内容となります。
|
4
|
-
|
5
|
-
下記内容のプログラムを実行すると、添付画像の(row=8,column=2('田'))の文字がコピー先の全ファイルにコピーされてしまいます。1⃣で(5,Sheet_Max2,1)とrowの値を指示しているのになぜそうなるのかがわかりません。
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
1⃣、2⃣、3⃣で何をしたいかというと、コピー元シートws1の値(行番号)を1⃣で順番に取得し、2⃣のrowの値に代入し、3⃣で別シートへ貼付けしたいという内容になります。
|
10
|
-
|
11
|
-
下記エクセルシート画像がコピー元のシートの一部となります。5行目から5.6.7行と回して2⃣で指定した値を順次取得したいです。添付画像の氏名がフォルダ名となっているため、⑤でファイルを開くたびに一行ずつ取得しコピー先のファイルに上書き保存したいという内容です。
|
12
|
-
|
13
|
-
※ファイル名は、1-1 可.1-2 寺内.1-3 土屋.1-4 田、としており、添付画像のセル順と同じ並びになるよう保存しております。また、コピー元のデータ数と、エクセルファイル数も同じ数です。コピー先ファイルを順次開いて、コピー元シートにあるエクセルの行データを上から一行ずつ順番に回してあげることで、保存先のエクセルファイルと、コピー元の氏名を結び付けたいと考えています。
|
14
|
-
|
15
|
-
|
3
|
+
)だけが出力されており、間の文字が抜けております。なぜこのような結果になるかがわかりません。どのように記述したらすべての値を出力できるでしょうか。
|
16
|
-
|
17
|
-
⑤のfor文を一回まわすのに対して、二つのfor文をその処理の中で回したいのですがどのように記述したらよろしいでしょうか。そもそもやろうとしていることが可能なのかもよくわかっておりません。
|
18
4
|
|
19
5
|
お手数おかけしますがご教授お願いいたします。
|
20
6
|
|
7
|
+
※実際は、コピー先シートは複数あり、それぞれ最終行がことなるため、最終行の値を拾って最終行にコピーするような内容になっています。ですので、コピー元の値をまとめてコピー貼り付けでなくfor文で一行ずつ取得したいです。
|
8
|
+
|
21
|
-
コピー元シート↓↓
|
9
|
+
「コピー元シート↓↓ 」
|
22
10
|
|
23
11
|
![コピー元シート](096100d3ee2b041cb38a5a19b6dca842.jpeg)
|
24
12
|
|
13
|
+
「コピー先シート↓↓」
|
25
14
|
|
15
|
+
![イメージ説明](0ad31e1d89838a97ac52fc31c21222a3.jpeg)
|
26
16
|
|
27
17
|
|
28
18
|
|
29
19
|
```Python
|
30
20
|
|
31
|
-
|
21
|
+
wb1 = openpyxl.load_workbook('C:\Users\本番1.xlsm',data_only=True)
|
32
22
|
|
33
|
-
|
23
|
+
ws1 = wb1['検針表 (2)']#コピー元シート読込
|
34
24
|
|
35
|
-
|
25
|
+
wb = openpyxl.load_workbook('C:\book1.xlsx')
|
36
26
|
|
37
|
-
|
27
|
+
ws = wb['29期']#コピー先シート取得
|
38
28
|
|
39
|
-
|
29
|
+
Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート
|
40
30
|
|
41
|
-
|
31
|
+
Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート
|
42
|
-
|
43
|
-
so_dict2 = dict(zip(folder_list2,all_list2))#keyをフォルダ名(folder_list2)、valueをファイル名(all_list2)
|
44
32
|
|
45
33
|
|
46
34
|
|
47
|
-
#
|
35
|
+
1⃣for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する
|
48
36
|
|
49
|
-
|
37
|
+
if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する
|
50
38
|
|
51
|
-
|
39
|
+
break
|
52
40
|
|
53
|
-
|
41
|
+
2⃣for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する
|
54
42
|
|
55
|
-
ws
|
43
|
+
if ws.cell(row=a, column=2).value is not None:
|
56
44
|
|
45
|
+
ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加
|
57
46
|
|
47
|
+
kensin = ws1.cell(row=b,column=2).value#セルコピー
|
58
48
|
|
59
|
-
#
|
49
|
+
ws.cell(row=a+1,column=3,value=kensin)#セル貼付け
|
60
50
|
|
61
|
-
|
51
|
+
break
|
62
52
|
|
63
|
-
for i in reversed(range(1,Sheet_Max)):#最終行から逆ループ
|
64
|
-
|
65
|
-
if ws1.cell(row=i, column=3).value == None:#C列がNoneだったら
|
66
|
-
|
67
|
-
ws1.delete_rows(i)#行削除
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
#コピー先ファイル取得。コピー元からセルコピー後、貼付け
|
72
|
-
|
73
|
-
⑤for key, value in so_dict2.items():#コピー先ファイル取得
|
74
|
-
|
75
|
-
for v in value:
|
76
|
-
|
77
|
-
wb = openpyxl.load_workbook(f'C:\テスト用\個別表2\{key}\{v}.xlsx')
|
78
|
-
|
79
|
-
ws = wb[sheet_name]#コピー先シート取得
|
80
|
-
|
81
|
-
Sheet_Max1 = ws.max_row + 1#シート最終行を取得 コピー先シート
|
82
|
-
|
83
|
-
#コピー元ファイルの列行を取得する
|
84
|
-
|
85
|
-
Sheet_Max2 = ws1.max_row + 1#シートの最終行を取得する コピー元シート
|
86
|
-
|
87
|
-
1⃣for b in range(5,Sheet_Max2,1):#最初の行から順番に一行ずつ確認する・・・この値をrowへ代入したい
|
88
|
-
|
89
|
-
if ws1.cell(row=b, column=3).value is not None:#空白セルになったら終了する
|
90
|
-
|
91
|
-
break
|
92
|
-
|
93
|
-
for a in range(Sheet_Max1, 0, -1):#最終行から順番に一行ずつ確認する
|
94
|
-
|
95
|
-
if ws.cell(row=a, column=2).value is not None:#rowに最終行からのセル情報が順次代入される、値の入ったセルがあれば、次の処理
|
96
|
-
|
97
|
-
4⃣ws.cell(row=a+1,column=2).value = ('料金')#品名のセルに品名追加
|
98
|
-
|
99
|
-
2⃣kensin = ws1.cell(row=b,column=2).value#セルコピー
|
100
|
-
|
101
|
-
3⃣ws.cell(row=a+1,column=3,value=kensin)#セル貼付け
|
102
|
-
|
103
|
-
break
|
104
|
-
|
105
|
-
|
53
|
+
wb.save('C:\book1.xlsx')
|
106
54
|
|
107
55
|
```
|
1
内容が伝わりずらいため
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,15 +8,17 @@
|
|
8
8
|
|
9
9
|
1⃣、2⃣、3⃣で何をしたいかというと、コピー元シートws1の値(行番号)を1⃣で順番に取得し、2⃣のrowの値に代入し、3⃣で別シートへ貼付けしたいという内容になります。
|
10
10
|
|
11
|
-
下記エクセルシート画像がコピー元のシートの一部となります。5行目から5.6.7行と回して2⃣で指定した値を順次取得したいです。添付画像の氏名がフォルダ名となっているため、
|
11
|
+
下記エクセルシート画像がコピー元のシートの一部となります。5行目から5.6.7行と回して2⃣で指定した値を順次取得したいです。添付画像の氏名がフォルダ名となっているため、⑤でファイルを開くたびに一行ずつ取得しコピー先のファイルに上書き保存したいという内容です。
|
12
12
|
|
13
|
-
※フ
|
13
|
+
※ファイル名は、1-1 可.1-2 寺内.1-3 土屋.1-4 田、としており、添付画像のセル順と同じ並びになるよう保存しております。また、コピー元のデータ数と、エクセルファイル数も同じ数です。コピー先ファイルを順次開いて、コピー元シートにあるエクセルの行データを上から一行ずつ順番に回してあげることで、保存先のエクセルファイルと、コピー元の氏名を結び付けたいと考えています。
|
14
14
|
|
15
15
|
添付画像row=5,column=2 の値をrow=5,6,7・・・と回していき、各ファイルを開いたときにセルを代入するにはどのように記述したらよろしいでしょうか。
|
16
16
|
|
17
|
-
|
17
|
+
⑤のfor文を一回まわすのに対して、二つのfor文をその処理の中で回したいのですがどのように記述したらよろしいでしょうか。そもそもやろうとしていることが可能なのかもよくわかっておりません。
|
18
18
|
|
19
19
|
お手数おかけしますがご教授お願いいたします。
|
20
|
+
|
21
|
+
コピー元シート↓↓
|
20
22
|
|
21
23
|
![コピー元シート](096100d3ee2b041cb38a5a19b6dca842.jpeg)
|
22
24
|
|
@@ -68,7 +70,7 @@
|
|
68
70
|
|
69
71
|
#コピー先ファイル取得。コピー元からセルコピー後、貼付け
|
70
72
|
|
71
|
-
|
73
|
+
⑤for key, value in so_dict2.items():#コピー先ファイル取得
|
72
74
|
|
73
75
|
for v in value:
|
74
76
|
|