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

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

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

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

Q&A

解決済

1回答

468閲覧

Python(3.7.4)で変数に従いエクセル行をコピーしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2020/06/06 22:21

前提・実現したいこと

エクセルsheet上の、ある列に記載されたランダムな整数通りに
その行を別sheetへコピーしていくプログラムを作成中です。

    【イメージ】
文字列A 2  ⇒  文字列A 
文字列B 3     文字列A
文字列C 2     文字列B
文字列D 4     文字列B
・           文字列B
・         文字列C
・         文字列C

発生している問題・エラーメッセージ

下記のコードでランダムな整数値の取得まではできますが
値の数だけコピーの方法で行き詰ってしまいます…

import openpyxl wb = openpyxl.load_workbook('ファイル名.xlsx') wb.create_sheet('Sheet2') ws1 = wb['Sheet']#既存のsheet ws2 = wb['Sheet2']#コピー先のsheet for row dt_row range(1,sh.max_row+1) b = ws1.cell(row = dt_row, column = 4).value

試したこと

上記コード後、for bb in range(1,b):から値の数だけ各行をコピーしようとしますが
"unexpected EOF while parsing"エラーが出てしまいます。
他によい方法がありましたら、ご教示お願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じでしょうか。

python

1import openpyxl 2 3wb = openpyxl.load_workbook('ファイル名.xlsx') 4wb.create_sheet('Sheet2') 5ws1 = wb['Sheet1'] 6ws2 = wb['Sheet2'] 7ws2_row = 1 8for row in ws1.values: 9 for num in range(row[1]): 10 ws2.cell(row=ws2_row+num, column=1, value=row[0]) 11 ws2_row += num + 1 12wb.save('ファイル名.xlsx') 13

ポイントとして、

  • Sheet2が存在しないことが前提
  • Sheet1の下限をws1.valuesで取得
  • Sheet2の書き込む位置(行)をループの外で持っている(ws2_row)

投稿2020/06/06 23:01

x98000

総合スコア1096

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

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

退会済みユーザー

退会済みユーザー

2020/06/06 23:33

早速のご回答、感謝いたします。 for num in range(row[1]): の行で 「整数値ではないので」の'str' object cannot be interpreted as an integerエラーが表示されます。 こちらの問題かもしれませんので見直してみます。
x98000

2020/06/07 00:24

数値列が文字列になっている可能性がありますね。Excel上で修正しておくか、range(int(row[1])) でもいけるかもしれません。
退会済みユーザー

退会済みユーザー

2020/06/08 04:07

ご返事が遅れもうしわけありません。 ご指摘いただき解決しました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問