【Python × Excel】ブックやシートをまたいで複数列のコピペをする方法


はじめに

Excelでブックやシートをまたいで、複数列のデータをコピペしたいときありませんか?
この記事では、Pythonを使ってExcel上でこれを実行する方法を解説します。

今回は架空の会社の社員データ.xlsxと評価データ.xlsxという2つのブックを例に、コードの書き方を説明していきます。

社員データ

評価データ

準備

まず初めに必要なライブラリをインポートしておきましょう。

import os
import openpyxl as px

osはカレントディレクトリの確認や変更といった、OSの機能をPythonで使うためのライブラリです。後述するように、今回は利用したいExcelファイルのあるディレクトリに異動するために使います。
openpyexcelは、PyhtonでExcelを利用するときに使うライブラリです。今回に限らずPythonでExcelを操作するときは、必ずインポートしておきましょう。

ワークブックとワークシートの読み込み

必要なライブラリをインポートしたら下記のように、使うワークブックとワークシートを読み込みます。

#該当ファイルのあるディレクトリに異動
os.chdir('C:\\Users\\ユーザー名\\Documents\\Qiita用サンプル')


#社員データのワークブックとワークシートを読み込み
wb1 = px.load_workbook('社員データ.xlsx')
ws1 = wb1['基本情報']
ws2 = wb1['経歴']

#評価データのワークブックとワークシートの読み込み
wb2 = px.load_workbook('評価データ.xlsx')
ws3 = wb2['評価']

まずはos.chdir()でカレントディレクトリを移動します。Users以降は人によってパスが違うと思いますが、とにかく扱いたいExcelファイルのあるフォルダのパスを入れてください。

ワークブックの読み込みは、px.load_workbook(ファイル名)で行います。カレントディレクトリを正しく移動できていれば、絶対パスではなくファイル名だけで読み込むことができます。

そのあとws1 = wb1[シート名]という感じでワークシートを読み込みます。社員データ.xlsxにはシートが2つ存在するため、今回はws1、ws2という風に2回読み込んでいます。

ワークブックが複数ある場合は、上記コードのように変数名を変えて同じようにpx.load_workbook()で読み込んでいきます。

シートをまたいで指定した列をコピペ

それではいよいよ、シートをまたいだコピペをしていきます。
今回は社員データブックの経歴シートの"高校", "大学"カラムをコピーして。基本情報シートのE列とF列にペーストしたいと思います。

C、D列を最後までコピーして

基本情報シートのE、F列に貼り付けたい

まずコードは下記のようになります。

def copy_paste1():
    for i in range(1, ws2.max_row + 1):
        highschool = ws2.cell(row = i, column = 3).value
        ws1.cell(row = i, column = 5, value = highschool)
        bachelor = ws2.cell(row = i, column = 4).value
        ws1.cell(row = i, column = 6, value = bachelor)
        i += 1
    wb1.save(filename = '社員データ.xlsx')

copy_paste1()

コピペを行うセルが1つの時はfor文はいりませんが、今回のように複数のセルを扱う場合はfor文のループ処理を利用すると簡単です。
rangeのスタートはコピーしたい行を指定しましょう。今回はヘッダーを含めてコピーしたいので1を指定しています。もしヘッダーを除いてコピーしたい場合は、2を指定しましょう。
そしてrangeの終了値ですが、max_row + 1と書くことでデータが入ってるカラムの最後までループを行うことができます。max_rowはデータが入っているセルをカウントして、最終行が何行目かを教えてくれるメソッドです。
ちなみに+1するのは、range()の性質で終了値をカウントしてくれないためです(例えばRange(0,10)とした場合はカウントされるのは0~9までですよね?)。

ちなみに最後にi += 1と書いてますが、Pythonの性質上この記載がなくても勝手にiが1ずつ加算されるので本例は不要です。本コードでは見た目をわかりやすくするために、あえて記載しております。

正しくコードが書けていれば、このようになるでしょう。

import os
import openpyxl as px

#該当ファイルのあるディレクトリに異動
os.chdir('C:\\Users\\ユーザー名\\Documents\\Qiita用サンプル')

#社員データのワークブックとワークシートを読み込み
wb1 = px.load_workbook('社員データ.xlsx')
ws1 = wb1['基本情報']
ws2 = wb1['経歴']

#評価データのワークブックとワークシートの読み込み
wb2 = px.load_workbook('評価データ.xlsx')
ws3 = wb2['評価']

def copy_paste1():
    for i in range(1, ws2.max_row + 1):
        highschool = ws2.cell(row = i, column = 3).value
        ws1.cell(row = i, column = 5, value = highschool)
        bachelor = ws2.cell(row = i, column = 4).value
        ws1.cell(row = i, column = 6, value = bachelor)
        i += 1
    wb1.save(filename = '社員データ.xlsx')

copy_paste1()