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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

627閲覧

Python Excel データの転記後、指定行ごとに縦持ちから横持ちに変換したい

xmaniT

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/02/16 04:36

編集2023/02/16 08:30

イメージ説明### 実現したいこと

複数のExcelファイルからデータを転記した後、指定行ごとに縦持ちから横持ちに変換したい

前提

複数のExcelファイルからデータを転記し(縦持ちのリストになります)、さらにそれを指定行(この場合、11行)ごとに縦持ちから横持ちに変換するプログラムを考えています。上図のようなイメージです。
複数のExcelファイルからデータを転記するところまではできましたが、そこから横持ちに変換することができません。Excelマクロを実装し(Excelマクロはできました)、それを実行しようとしてもマクロが実行されないので、横持ちに変換するコードもPythonで書きたいと思っています。あるいは、PythonでExcelマクロを実行しても問題ありません。
ちなみに、Excelマクロだとこんな感じです。

Dim i As Long
Dim Q As Long
Dim Z As Long
Dim LastRow As Long
Dim myList As Variant

'A列のデータを配列に格納 myList = Range("A1", Range("A" & Rows.Count).End(xlUp)) '最終行を取得 LastRow = Cells(Rows.Count, 1).End(xlUp).Row Z = 1 '列をループ For i = 1 To LastRow / 11 '配列を3つ分ループ For Q = 0 To 10 'D~F列に配列を転記 Cells(i, Q + 3) = myList(Z, 1) Z = Z + 1 Next Q Next i

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

エラーメッセージ

該当のソースコード

import glob import openpyxl from tkinter import messagebox from openpyxl import load_workbook target_dir = 'C:/Users/xxxxxx/Desktop/Python/Multiple_Files/logs' wb1 = load_workbook('aaaaaa.xlsm') ws1 = wb1.worksheets[1] files = glob.glob(target_dir + '/*.xlsx') for fname in files: book = openpyxl.load_workbook(fname, data_only=True) sheet = book.active rows = sheet["D23":"D33"] for row in rows: values = [cell.value for cell in row] if values[0] is None: break ws1.append(values) # 別名で保存 wb1.save('bbbbbb.xlsx')

試したこと

Excelのテンプレートにマクロを実装し、PythonでのExcelマクロ実行を試みましたが実行されませんでした。

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

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

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

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

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

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

guest

回答1

0

以下のような感じで転記元のデータをそのまま行方向に出力すればよいかと思います。

Python

1import openpyxl 2 3wb1 = openpyxl.load_workbook('ret.xlsx') 4ws1 = wb1.worksheets[0] 5 6for r, values in enumerate([[1,2,3],[4,5,6,7]]): # テストデータ 7 row = r+1 # とりあえず1=行目から 8 # 行方向に書き出す 9 ws1.cell(row=row, column=3).value = '単語数' 10 for c, v in enumerate(values): 11 col = c+4 # とりあえず4=D列から 12 ws1.cell(row=row, column=col).value = v 13 14wb1.save('ret.xlsx')

イメージ説明

投稿2023/02/16 05:05

編集2023/02/16 08:38
can110

総合スコア38266

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

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

xmaniT

2023/02/16 07:18

回答ありがとうございます。 ご教示いただいたコードを試作中の上記コードに組み込ませていただきましたが、 1 2 3 4 5 6 7 と変換されてしまいました。私の組み込み方に誤りがあるかもしれませんので、もう少し詳細にご教示いただけると助かります。ちなみに、縦持ちのリストは別ファイルから読み取ったデータなので、毎回異なります。
can110

2023/02/16 07:57 編集

そのような結果になったのは、回答の意図通りで正しいです。 提示されている期待する結果 ----- 単語数 0 16737 9798 0 12776 1712 3039 3595 1905 11448 単語数 0 1250 111 0 522 24 369 852 741 654 ----- と同じ並びだと思うのですが、意図通りでないということでしょうか?もしそうなら Excelの画像イメージなどで具体的にどのような結果がほしいのか?が分かるように質問本文を修正ください。
xmaniT

2023/02/16 08:09

コメントありがとうございます。Excelマクロを実行した後の画像を貼り付けました。最終的にこんな感じにしたいです。縦持ちのリストは消えても構いません。
can110

2023/02/16 08:40

回答を修正しました。 私は、この回答の結果イメージは、質問で提示されている「ほしい結果」と同じ並びであると認識しています。
xmaniT

2023/02/16 10:24

修正ありがとうございます。 私の組み込み方が悪いのか、まだイメージ通りではありません。 ご教示いただいたコードの結果、「単語数」という言葉は希望の位置に表示されましたが、上の2つのみで、残り2つは表示さません。また、縦リスト内の「単語数」の下に記載されている10個の数値(ワード数)は表示されず、can110様の図のように1~7の数字が表示されます。ほしい結果は、冒頭の図にあるように、「単語数」の右隣10個のセルにそれぞれの数値(ワード数)が記載されてほしいのです。この数値は、別ファイルから転記された数字なので、毎回変わります。説明が不十分で申し訳ございません。
xmaniT

2023/02/21 01:44 編集

結局、縦持ちから横持ちに変換するPythonコードは思うように書けませんでしたが、 Excel VBAを実行できるようにすることで解決しました。貴重なご意見を下さった方々、 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問