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

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

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

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

Q&A

解決済

2回答

1236閲覧

エクセルのコピーについて

tohoho3

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/04/11 06:58

編集2021/04/11 07:28

前提・実現したいこと

pythonを勉強中です。プログラム自体はじめてなのでいろいろ調べながら勉強していますが,下記について調べ方が悪いのか,原因がわからなかったため質問させてください.

横2列(X軸,Y軸の値),縦に1040行(xyの座標の個数)があるExcelデータがあるとします.
2行4列(合計8セル,4点の座標)ごとにデータをコピーし,それを同じシートの4列目以降に1行になるように複製して,ペーストする処理を元データの最終行まで行いたいと考えています.2行4列のデータを定数を用いて,一行に並べる処理はできたのですが,それを最終行まで繰り返させる処理がどうしても実行されません.どうすればできるのか,アドバイス頂きたいと思います.よろしくお願いいたします.このようなコピーをイメージしています

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

エラーメッセージは特に出てきませんがコピーできていない状況です.

該当のソースコード

python

1import os 2os.chdir('C:/Users/XXX/Python/0407') 3 4import openpyxl as px 5wb = px.load_workbook('C:/Users/XXX/Python/0407/DJI_0001_01.xlsx') 6ws = wb['Sheet1'] 7 8def act(A): #1行分の列部分を取得する関数(一つ目) 9 copyx1 = ws.cell(row = A, column =1).value #x1 10 copyy1 = ws.cell(row = A, column =2).value #y1 11 12 for j in range(0,A):#抜き取った部分を複製する 後 13 ws.cell(row = j,column = 4).value = copyx1 14 ws.cell(row = j,column = 5).value = copyy1 15 16 max=int(ws.max_row) #最終行数の算出(1040行) 17 for A in range(1,max,4): #一行目から4つ飛ばしで最終行まで 18 act(A) 19 20 21def act(B): #1行分の列部分を取得する関数 22 copyx2 = ws.cell(row = B, column =1).value #x2 23 copyy2 = ws.cell(row = B, column =2).value #y2 24 25 for j in range(0,B):#抜き取った部分を複製する 後 26 ws.cell(row = j,column = 6).value = copyx2 27 ws.cell(row = j,column = 7).value = copyy2 28 29 max=int(ws.max_row) #最終行数の算出(1040行) 30 for B in range(2,max,4): #2行目から最終行まで4行飛ばしながら実行 31 act(B) 32 33 34def act(C): #3つ目 35 copyx3 = ws.cell(row = C, column =1).value #x3 36 copyy3 = ws.cell(row = C, column =2).value #y3 37 38 for j in range(0,C):#抜き取った部分を複製する 後 39 ws.cell(row = j,column = 8).value= copyx3 40 ws.cell(row = j,column = 9).value = copyy3 41 42 max=int(ws.max_row) #最終行数の算出(1040行) 43 for C in range(3,max,4): #3行目から最終行まで4行飛ばしながら実行 44 act(C) 45 46 47def act(D): #4つ目 48 copyx4 = ws.cell(row = D, column =1).value #x4 49 copyy4 = ws.cell(row = D, column =2).value #y4 50 51 for j in range(0,D):#抜き取った部分を複製する 後 52 ws.cell(row = j,column = 10).value= copyx4 53 ws.cell(row = j,column = 11).value = copyy4 54 55 max=int(ws.max_row) #最終行数の算出(1040行) 56 for z in range(4,max,4): #4行目から最終行まで4行飛ばしながら実行 57 act(D) 58 59wb.save(filename = 'New.xlsx') 60

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

Python 3.7.9

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

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

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

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

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

KojiDoi

2021/04/11 07:13

横2列のデータから4列のデータをコピーするとはどういうことでしょうか?
退会済みユーザー

退会済みユーザー

2021/04/11 07:31

質問文及び質問中のコードだけでは、完成形がわかりません。 「4点の座標ごとにデータをコピーし,それを同じシートの4列目以降に1行になるように複製、それを最終行まで繰り返させる」とは、 最終的には、2列1040行の2080個のデータを、 同じシートのD4セル以降に、1行で2080列にわたって表示させるという意味でしょうか。 それとも、 セルD1~K1 の8セルに、セルA1~B4までの8個のデータ、 セルD5~K5 の8セルに、セルA5~B8までの8個のデータ、 セルD9~K9 の8セルに、セルA9~B12までの8個のデータ・・・ という形で表示したいのでしょうか?
tohoho3

2021/04/11 07:34

不親切な質問の仕方で大変失礼いたしました. 追加掲載の写真の通り,AB列において,4列ずつデータを抽出し,1行に並べる作業をAB列のセルにデータがなくなるまで繰り返し行いたいと考えております.
tohoho3

2021/04/11 07:39

qnior さん セルD1~K1 の8セルに、セルA1~B4までの8個のデータ、 セルD2~K2 の8セルに、セルA5~B8までの8個のデータ、 セルD3~K3 の8セルに、セルA9~B12までの8個のデータ・・ という形での表示をしたいと考えています. 分かりにくい説明で大変失礼いたしました.
guest

回答2

0

ベストアンサー

A1セル以降から取得した2列4行ずつのデータを8行ごとに改行して書き込む場合下記のようになります。

import openpyxl wb = openpyxl.load_workbook('C:/Users/XXX/Python/0407/DJI_0001_01.xlsx') ws = wb['Sheet1'] max = int(ws.max_row) w = 0 for row in ws.iter_rows(min_col=1, min_row=1, max_col=2, max_row=max): for cell in row: value = cell.value ws.cell(column=w%8+4, row=w//8+1).value = value w+=1 wb.save('New.xlsx')

投稿2021/04/11 07:45

編集2021/04/11 07:46
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tohoho3

2021/04/11 08:08

データのコピーができました.ありがとうございます.
guest

0

とりあえず、「どうしても実行されません.」の直接の答えを書いておくと、関数を定義だけして呼び出していないため、何も起こっていないと思います。関数の使い方が基本的に理解できてないようです。

そして、(質問に書いた通り、何をやりたいのかが今ひとつはっきりしないけれども)おそらくこの処理にわざわざ関数を使う必要はありません。
また、明らかに同じような処理を行う関数を4つも定義しているという構造もちょっとありえないことです。

defのことはいったん忘れて、まずはforだけを使って書いてみてはどうでしょうか。

【Python】ファイルの読み込み - Qiita

ここに書いてある「すべての行を読み込んでリストにし、一行ずつ表示する方法」をとりあえず出発点にしてみるといいのではないかと思います。

投稿2021/04/11 07:22

編集2021/04/11 07:24
KojiDoi

総合スコア13692

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問