

元データには、TOKYO・KADOMA・HMR・HSB・KIBI・KOFUの6つの拠点があります。  
取引先TOKYOのファイルに元データから転記したいのですがTOKYO以外の取引先も転記されてしまいます。

エラーなく動きはするのですが、思うように動きません。  
どこが間違っているのか教えていただけないでしょうか？

[code]

    from openpyxl import load_workbook
    from datetime import datetime
    
    #プログラム2｜対象エクセルのファイルパスを指定
    filepath1 = 'Excelbook1.xlsx'
    filepath2 = 'template.xlsx'
    
    #プログラム3｜エクセルを読み込む
    wb1 = load_workbook(filename=filepath1)
    ws1 = wb1['Sheet1']
    
    wb2 = load_workbook(filename=filepath2)
    ws2 = wb2['template']
    
    #プログラム4｜ws1のデータをリスト化
    values1=[[cell.value for cell in row1] for row1 in ws1]
    
    #プログラム5｜取引先のリストを作成
    del values1[0]
    conv_values1 = list(zip(*values1))
    torihiki_list = list(set(conv_values1[0]))
    
    #プログラム6｜取引先ごとに処理
    for torihiki in torihiki_list:
    
        # プログラム7｜空リストを作成
        product_data =[]
    
        # プログラム8｜取引先とマッチングする行をproduct_dataのリストに格納
        for i in range(len(values1)):
            if values1[i][0] == torihiki:
                product_data.append(values1[i])
    
        # プログラム9｜templateシートをコピー               
        ws2.title = torihiki 
    
        # プログラム10｜プログラム8で格納したリストをエクセルへ出力
        for y, row in enumerate(product_data):
            for x, cell in enumerate(row):
                ws2.cell(row= y+2, column= x+1, value=product_data[y][x])
          
        # プログラム11｜エクセルファイルの保存        
        now = datetime.now()
        hiduke = now.strftime('%Y-%m-%d')
        filename = hiduke + '_' + torihiki + '.xlsx'
        wb2.save(filename)
    
[/code]

**元データ**  
[![元データ](https://i.stack.imgur.com/AjxRd.png)](https://i.stack.imgur.com/AjxRd.png)

**取引先TOKYOのファイル**  
[![取引先TOKYOのファイル](https://i.stack.imgur.com/lgshg.png)](https://i.stack.imgur.com/lgshg.png)


CC BY-SA 4.0
2023-06-29T03:03:53.473
95408
2023-07-01T08:15:17.973
2023-07-01T08:15:17.973
3060
58733
question
python
エクセルの列の値に応じて別ファイルに保存したいが、一つのファイルに保存されてしまう


`#プログラム3`以下の下記の2行を`プログラム6`のfor文直下に移動すると直ります。

[code]

    wb2 = load_workbook(filename=filepath2)
    ws2 = wb2['template']
    
[/code]

変更後

[code]

    #プログラム6｜取引先ごとに処理
    for torihiki in torihiki_list:
        wb2 = load_workbook(filename=filepath2)
        ws2 = wb2['template']
    
        #プログラム7｜空リストを作成
    
[/code]

上手く動作しない原因は、ws2を書き換えた結果を取引先ごとにリセットせず保持したままになっているからです。  
ご質問の例では取引先`KOFU`が5件あり、`TOKYO`よりも前に処理しています。  
`#プログラム10`でその結果を`ws2`に転記しておいて取引先ごとのファイル名で保存していますが、`wb2.save`で保存しても変更した行データは消えません。

手っ取り早い解決方法として、`ws2`を上書き保存せずに再度読み直すことで、前のfor文でループ中に変更した行データをリセットすることができます。


CC BY-SA 4.0
2023-06-29T04:29:32.307
95409
2023-06-29T05:21:05.183
2023-06-29T05:21:05.183
9820
9820
95408
answer