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

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

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

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

Q&A

解決済

1回答

1706閲覧

1つのシート内のデータを分割して複数のシートに展開したい。

so_men

総合スコア4

Python

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

0グッド

0クリップ

投稿2021/05/29 14:09

編集2021/05/30 13:08

前提・実現したいこと

google colaboratoryを使用しています。
Excelの自動化で下記内容に取り組んでいるのでいて、検索してできるところまではやってみましたが、違う結果が返ってくるため質問させてください。

■内容:wb1'リスト'のデータを2行目から10行ごと別シートに展開していきたいです。
展開するシート名は'Seet1','Seet2'...'Seet100'となっています。
また、リストのデータは2~11行目に格納されるようにしたいです。

例:'Seet1'には'リスト'の2~11行目が格納、'Seet2'には'リスト'の12~21行目が格納されます。
⇩イメージ画像になります
イメージ説明

wb1'リスト'横6列:縦1001行
イメージ説明

試したこと

import openpyxl wb = openpyxl.load_workbook('data.xlsx') ws1 = wb['リスト'] ws2 = wb['Sheet1'] idx = wb.index(ws2) for i in range(2,1002): if A == 11: idx = idx + 1 ws2 = wb.worksheets[idx] t1 = 'A' A = t1 + str(i) t2 = 'B' B = t2 + str(i) t3 = 'C' C = t3 + str(i) t4 = 'D' D = t4 + str(i) t5 = 'E' E = t5 + str(i) t6 = 'F' F = t6 + str(i) ws2.cell(i, 1).value = ws1[A].value ws2.cell(i, 2).value = ws1[B].value ws2.cell(i, 3).value = ws1[C].value ws2.cell(i, 4).value = ws1[D].value ws2.cell(i, 5).value = ws1[E].value ws2.cell(i, 6).value = ws1[F].value wb.save('teratail.xlsx')

上記が実際のコードです。
if文でAの値が11になったら次のシートに転記するように書いてみたのですが、11番目以降が反映されないのでif文がおかしいのに加え、下部の転記のコードも修正する必要があると思うのですがどう修正すればよいかわからず困っています。

わかりにくければ情報追加いたしますので、コメントいただければと思います。

【追記】
実行結果
イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/29 14:22 編集

・wb1(「リスト」シート)のキャプチャも記載してください。 ・wb1(「リスト」シート)のデータは、横6列、縦1000行のデータ、という理解でよろしいでしょうか? ・ワークブックには、名前が「seet1」「seet2」...となっているシートが、「seet100」まで100個存在し、各々の「seet◎◎」シートの2行目から11行目に、wb1(「リスト」シート)内のデータを10行×6列ずつ順次コピーしたい、という理解でよろしいでしょうか?
so_men

2021/05/29 14:31 編集

qnoirさん コメントありがとうございます!! wb1(「リスト」シート)のキャプチャ記載しました。データ部分は横6列、縦1000行の認識で合っております。(1行目は項目名のため転記不要) >・ワークブックには、名前が「seet1」「seet2」...となっているシートが、「seet100」まで100個存在し、各々の「seet◎◎」シートの2行目から11行目に、wb1(「リスト」シート)内のデータを10行×6列ずつ順次コピーしたい、という理解でよろしいでしょうか? ⇒はい!その認識で合っております。
guest

回答1

0

ベストアンサー

[現状の問題点]

「A==11」で切り替え判定しようとしていますが、
Aには「A1」「A2」「A3」・・・というように、セル番地を表す文字列が入るので、
数字と比較できません。

このため、10行読み取る度にシートを切り替えるには、たとえば、下記のように、
「i から 2 を引いた数を10で割った余りが0のとき」というようにすれば、
意図したとおりにシートを切り替えることができます。
(余りを求める->「%」演算子)

・書き込み先の行番号に、読み取り元の行番号である同じ「i」を使用してしまっているため。
このままだと、書き込み先シートに意図した行に書き込まれません。

下記修正例では、シートを切り替えるごとに書き込み先が2行目から始まるように、
同じように余りを求める式を使っています。
[追記]
・数値を貼り付けるには、load_workbookでdata_only=Trueを指定します。
・書式が文字列となっている数字を、数値として貼り付ける場合は、float()で囲ってください。

import openpyxl wb = openpyxl.load_workbook('data.xlsx', data_only=True) ws1 = wb['リスト'] ws2 = wb['Sheet1'] idx = 0 for i in range(2, 1002): # 10行読み取るごとにシートを切り替える if (i - 2) % 10 == 0: idx = idx + 1 try: ws2 = wb.worksheets[idx] except IndexError: print(f"エラー:存在しないシートインデックス[{idx}]が指定されました。") break t1 = 'A' A = t1 + str(i) t2 = 'B' B = t2 + str(i) t3 = 'C' C = t3 + str(i) t4 = 'D' D = t4 + str(i) t5 = 'E' E = t5 + str(i) t6 = 'F' F = t6 + str(i) # k = 書き込み先の行番号。シートを切り替えるたびに、2~11行目となる。 k = (i - 2) % 10 + 2 ws2.cell(k, 1).value = float(ws1[A].value) ws2.cell(k, 2).value = float(ws1[B].value) ws2.cell(k, 3).value = float(ws1[C].value) ws2.cell(k, 4).value = float(ws1[D].value) ws2.cell(k, 5).value = float(ws1[E].value) ws2.cell(k, 6).value = float(ws1[F].value) wb.save('teratail.xlsx')

別解

下記のようにすれば短いコードになります。

import openpyxl wb = openpyxl.load_workbook('data.xlsx', data_only=True) ws1 = wb['リスト'] ws2 = wb['Sheet1'] idx = wb.index(ws2) rng1 = ws1["A2":"F1001"] i = 0 for idx in range(1,101): try: ws2 = wb.worksheets[idx] except IndexError: print(f"エラー:存在しないシートインデックス[{idx}]が指定されました。") break for num_row in range(1,11): data_row = rng1[i] for num_column, cell in enumerate(data_row): ws2.cell( row=num_row+1, column=num_column+1).value = float(cell.value) i += 1 wb.save('teratail.xlsx')

投稿2021/05/29 15:01

編集2021/05/30 13:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

so_men

2021/05/30 01:11

無事思い通りの結果が出ました!解説も分かりやすかったので勉強になりました! また機会があればよろしくお願いいたします。
so_men

2021/05/30 09:33

qnoirさん すみません、、。↑転記する値を全て数値としてもってくる方法などありますか、、?できれば文字列ではなく数値で反映したく、。図々しく申し訳ないのですが。ご返信くださると助かります。
退会済みユーザー

退会済みユーザー

2021/05/30 10:45

回答に追記しました。 load_workbook関数 で data_only=Trueとしてください。
so_men

2021/05/30 13:23 編集

ご返信ありがとうございます。 data_only=Trueで実行してみましたが、文字列のままでした、、。実行結果追記しました。 しかし、検索してみたところ数値で反映されるということは確かのようなのですが、何か原因あるのでしょうか。
退会済みユーザー

退会済みユーザー

2021/05/30 13:25 編集

コピー元のデータの書式が文字列になっているためと思われます。 コードを修正しました。 float()で囲ってください。
so_men

2021/05/30 13:32

float()で数値になりました、、!ありがとうございます。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問