下図のように、A列に「年」B列に「月」が入ったデータがあるんだけど、
A1セルに年月を記入して、A1とB1セルを結合したい…。
xlwingsでセルを結合する方法は無いの?
ありますよ!
では今回は、「xlwingsでセルを結合する方法」を
できるだけわかりやすく解説いたします。
また、「結合を解除する方法」も紹介いたしますので、
ぜひ最後まで読んでいってください。
xlwingsでセルを結合するには
「merge」を使います。まずは実行見本をどうぞ。
実行見本
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import xlwings
workbook = xlwings.books.active
worksheet = workbook.sheets.active
worksheet['A1:B1'].merge()
worksheet['A1:B1'].merge()
xlwingsの処理は、予想以上に時間がかかることがあります。
プログラムの最後に「print(‘実行完了’)」などを追記し、完了したのを確認してから結果を見ましょう。
事前準備
- xlwingsのインストール
エクセルファイルを実際に操作するには、「xlwings」のインストールが必要になります。
xlwingsのインストール方法
xlwingsを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install xlwings
※xlwingsを使用したことがある場合は、このインストール作業は不要です。
インストール方法詳細やインストールができない場合の対処法、
基本的な使い方などは下記記事をご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート~シートの取得
import xlwings
workbook = xlwings.books.active
worksheet = workbook.sheets.active
上記コードにて、「xlwingsのインポート」「アクティブブック・アクティブシートの取得」をしています。
詳細は「アクティブシートの取得」の記事をご覧ください。
セルの結合
worksheet['A1:B1'].merge()
上記一文にて、セルを結合することができます。
今回の場合は、「A1セル」と「B1セル」が結合されます。
まずは「前項で取得したシート」が入った変数と結合させたいセル範囲を記述します。
続けて「.merge()」を書いて完了です。
<テンプレ>
【 シートが入った変数[‘結合させたいセル範囲‘].merge() 】
実行されるのは、セルの結合だけです。
中央揃えにしたい場合は、別で行う必要があります。
やり方は下記記事で解説しておりますのでご参考ください。
セルの結合を解除する方法
では、前項で結合したセルを解除してみましょう。
worksheet['A1:B1'].unmerge()
上記一文にて、セルの結合を解除することができます。
前項との違いは、「merge」が「unmerge」になっただけです。
- merge:セルの結合
- unmerge:セルの結合を解除
実行してみましょう。
セルの結合が解除されました。
では、結合されてないセルも含めて解除指定した場合はどうなるのでしょうか?
(A1とB1が結合されているときに、A1~C1を解除しようとしたら・・・)
結合セル以外も解除指定した場合
現在、A1セルとB1セルが結合されています。
この状態で、A1~C1セルの結合を解除しようとしたらどうなるのでしょうか?
(結合されていないC1セルも混ざっています)
エラーが出るのか、はたまた普通に解除されるのか、下記コードを実行してみます。
worksheet['A1:C1'].unmerge()
普通に結合が解除されました。
手動で行う場合と同じ結果になるようです。
なので[A1:Z99]などのように広範囲の指定をすることで、ほぼシート全体の結合を解除することができます。
結合・解除で罫線や塗りつぶしはどうなるの?
1つ気になるのは、結合や解除をすることによって、罫線や塗りつぶし範囲はどうなるのかということです。
検証してみましょう。
罫線
上図のように、B2セルに罫線が設定されています。
この状態で、B2セルとC2セルを結合してみます。
worksheet['B2:C2'].merge()
B2セルとC2セルが結合されました。
しかしながら、罫線が一部消えています。
結合を解除すると元に戻るのでしょうか?
結合を解除してみましょう。
worksheet['B2:C2'].unmerge()
結合が解除されました。
罫線は消えたままです。
手動で行った場合と同様の結果ですね。
セルの結合や解除を行うと罫線が消える場合があるようです。
下記記事を参考に罫線の再設定を行いましょう。
塗りつぶし
では塗りつぶしの場合はどうなるのでしょうか。
上図の状態から、A1セルとB1セルを結合してみます。
worksheet['A1:B1'].merge()
セルが結合されました。
塗りつぶしも同様に結合されています。
(正確には左側のセルの塗りつぶしが反映されています)
結合を解除してみましょう。
worksheet['A1:B1'].unmerge()
結合が解除されました。
B2セルが塗りつぶされたままになっています。
これも手動で行った場合と同様の結果になりました。
罫線と同様に、塗りつぶしも一部問題が起きます。ご注意ください。
塗りつぶしの再設定は、下記記事をご参考ください。
既に結合されているセルを再結合した場合
オマケでもう一つ検証してみましょう。
既に結合されているセルを解除せずに再度結合しようとしたらどうなるのでしょうか。
A1:B1→A1:C1
現在、A1セルとB1セルが結合されています。
この状態で、A1~C1セルを結合しようとしたらどうなるのでしょうか。
下記コードを実行してみます。
worksheet['A1:C1'].merge()
エラーが出ることなく、A1~C1セルが結合されました。
既に結合されているセルが含まれていても、正常に結合されるようです。
手動で行った場合と同じですね。
A1:B1→B1:C1
では次に、B1セルとC1セルを再結合してみましょう。
(既にA1セルとB1セルが結合されています)
これは手動ではできません。結果が楽しみです。
下記コードを実行してみます。
worksheet['B1:C1'].merge()
A1~C1セルが結合されました。
既に結合されているセルも含めて全て結合されるようです。
A1:B2→B2:C3
では最後に、A1~B2セルが結合された状態で、B2~C3セルを結合しようとしてみます。
これも手動ではできません。
さすがにエラーが出るのか、はたまたイビツな形で結合されるのか、下記コードを実行してみます。
worksheet['B2:C3'].merge()
A1~C3セルが結合されました。
このように、すでに結合されたセルを含めて再結合すると、すべての範囲を含めるように結合されます。
予期せぬ結果にならないようにご注意ください。
うまく動作しない時
エラーが出る
‘NoneType’ object has no attribute ‘books’
エクセルブックやエクセルファイルを開いていないのに、ブックやファイルを取得しようとした場合に出るエラーです。
事前に対象のファイルを開くように指定するなど、構文を見直してみましょう。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
空のブックが生成される・残る
作業環境によっては「空のブック(Book1)」が生成されたり、残ってしまう場合があります。
このまま作業を続けると、空のブックがどんどん増えていく可能性があるため対処が必要です。
対処法としましては、何か別のエクセルを開いたままにしておきましょう。
そうすることで、空のブックは生成されません。
作業を始める前に、適当なエクセルファイルをひとつ開いておくことをおすすめします。
いつまでたっても実行されない
エラーは出ていないのに、いつまでたっても実行されない場合は、実行内容がエクセルに届いていない可能性があります。
「books.active」「sheets.active」を使用していて、エクセルファイルが最小化されていると、実行内容がエクセルに届かない場合があります。(もう1度実行すると、同じ内容が2回実行される)
エクセルは最小化せず、コードエディタとエクセルを並べて表示させた状態で実行するとうまくいきやすいです。
最後に
xlwingsでセルを結合する方法を解説いたしました。
当ブログでは、xlwingsやopenpyxlなど、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!