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

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

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

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

Q&A

解決済

1回答

4450閲覧

Python Pywin32 Excel フィルタをかけたデータを別シートにコピーを繰り返したい

mina_k

総合スコア15

Python 3.x

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

0グッド

1クリップ

投稿2019/07/18 01:31

編集2019/07/24 02:36

前提・実現したいこと

sheet1でフィルタをかけたデータをsheet2にコピぺ。
sheet2に貼り付けたデータの下に、次にsheet1でフィルタをかけたデータを、
貼り付けるということを繰り返したいです。
データ量は毎回変化します。

イメージ説明

イメージ説明

イメージ説明

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

下に貼り付けていく方法がわかりません。
最終行のRange('A2')これをどう書き換えれば良いかがわかりません。

該当のソースコード

sheet = book.Worksheets('sheet1')
sheet.Range('A1:N1').AutoFilter(Field=12, Criteria1='4月')
last = sheet.Range('B1').End(-4121).Row
sheet.Range('A2:M' +str(last)).Copy(Destination = book.Worksheets('sheet2').Range('A2'))

sheet = book.Worksheets('sheet1')
sheet.Range('A1:N1').AutoFilter(Field=12, Criteria1='5月')
last = sheet.Range('B1').End(-4121).Row
sheet.Range('A2:M' +str(last)).Copy(Destination = book.Worksheets('sheet2').Range('A2'))

試したこと

VBA、Pywin32も調べたのですがわかりませんでした。
お知恵をお貸しください。

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

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

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

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

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

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

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

amahara_waya

2019/07/24 00:42

動作のイメージをつかみたいので、sheet1の状況と理想のsheet2の状況についてスクリーンショットを貼ってもらえないでしょうか。
mina_k

2019/07/24 02:36

スクリーンショットを添付しました。 どうぞよろしくお願いいたします。
guest

回答1

0

ベストアンサー

以下のようなコードでできます。

python

1import win32com.client 2xlApp = win32com.client.Dispatch("Excel.Application") 3 4#エクセルファイルを開く 5book = xlApp.Workbooks.Open("C:/Users/ooooo/Excel11") 6 7#シートの定義(簡略化のため) 8sheet1 = book.Worksheets('sheet1') 9sheet2 = book.Worksheets('sheet2') 10 11#シート.抽出範囲.AutoFilter(Field=抽出条件の対象となる列番号, 12# Criteria1=条件1, 13# Operator=条件の組み合わせ(and,orなど)), 14# Criteria2=条件2 15#Criteriaについては不等号などの指定も可能 16 17#1ヶ月分のデータをAutofilterで抽出(このコードでは使用日をもとにしている) 18sheet1.Range('A1:H10').AutoFilter(Field=7, Criteria1=">=2019/5/1",Operator=1,Criteria2="<2019/6/1") 19#抽出データの行数 20last = sheet1.Range('B1').End(-4121).Row 21#抽出データをsheet2にコピー 22sheet1.Range('A2:H' +str(last)).Copy(Destination = sheet2.Range('A2')) 23#次のコピー先を決める(空行を作るため+2する) 24copy_target_row=sheet2.Range('B1').End(-4121).Row+2 25 26sheet1.Range('A1:H10').AutoFilter(Field=7, Criteria1=">=2019/6/1",Operator=1,Criteria2="<2019/7/1") 27last = sheet1.Range('B1').End(-4121).Row 28sheet1.Range('A2:H' +str(last)).Copy(Destination = sheet2.Range('A'+str(copy_target_row))) 29 30copy_target_row=sheet2.Range('A'+str(copy_target_row)).End(-4121).Row+2 31 32#上書き保存 33book.Save() 34#エクセルファイルを閉じる 35book.Close()

例としては、画像1枚目の実行元データ(Sheet1)に対して実行すると、画像2枚目のような結果(Sheet2)が得られます。

Sheet1データ

Sheet2データ

また、複数月のデータを抽出する場合、for文を使って簡略化することができます。ご参考にどうぞ。

python

1#for文バージョン 2 3#コピー先の行数を初期化 4copy_target_row=2 5 6#抽出したい月を指定(この場合4~6月いっぱいまで) 7start_month=4 8end_month=7 9 10for i in range(start_month,end_month): 11 #1ヶ月分のデータをAutofilterで抽出(このコードでは使用日をもとにしている) 12 sheet1.Range('A1:H10').AutoFilter(Field=7, Criteria1='>=2019/'+str(i)+'/1',Operator=1,Criteria2='<2019/'+str(i+1)+'/1') 13 14 #抽出データの行数 15 last = sheet1.Range('B1').End(-4121).Row 16 17 #抽出データをsheet2にコピー 18 sheet1.Range('A2:M' +str(last)).Copy(Destination = sheet2.Range('A'+str(copy_target_row))) 19 20 #次のコピー先を決める(空行を作るため+2する) 21 copy_target_row=sheet2.Range('A'+str(copy_target_row)).End(-4121).Row+2

参考記事

pywin32の扱い:pywin32からCOMを使ってExcelを操作する方法

AutoFilterについて:オートフィルタ(AutoFilterメソッド)でのデータ抽出
※pythonではなくVBAに関する記事ですが、動作はほぼ同じです。

投稿2019/07/24 08:24

amahara_waya

総合スコア1029

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

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

mina_k

2019/07/25 03:47

ご丁寧にご回答いただきありがとうございます。 同じExcelファイルを作り、教えていただいたコードを実行したのですが、 画像2枚目(sheet2)の結果は得られませんでした。 5月と6月の間の空行はなく、3行上詰めされています。 5月のデータは全部で5件ですが、sheet2の5月は2件でした。 6月はちゃんと4件ありました。
amahara_waya

2019/07/25 04:00

確認しました。事前にSheet2に1列目(仕分~支払月)を入力しておかないと、そのようなバグが発生するみたいです。 手打ちやプログラムで事前に1列目を入力しておけば、画像通りの動作になるかと思います。
mina_k

2019/07/25 04:32

できました!本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問