送られてきたエクセルファイルをxlwingsで編集しているんだけど、
一番最後の行に不要なデータがあるので削除したい。
最終行の行番号を取得できれば削除できるんだけどなあ…。
なるほど…。
では今回は、「xlwingsで最終行を取得する方法」を
できるだけわかりやすく解説いたします。
「最終行の値を取得する方法」も紹介いたしますので、
ぜひ最後まで読んでいってください。
xlwingsで最終行を取得するには
「end」を使います。まずは実行見本をどうぞ。
実行見本
「元データ」「全コード」「実行結果」をお見せします。
元データ
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import xlwings
workbook = xlwings.books.active
worksheet = workbook.sheets.active
last_row = worksheet['A1'].end('down').row
print(last_row)
last_row = worksheet['A1'].end('down').row
実行結果
6
xlwingsの処理は、予想以上に時間がかかることがあります。
プログラムの最後に「print(‘実行完了’)」などを追記し、完了したのを確認してから結果を見ましょう。
事前準備
- xlwingsのインストール
エクセルファイルを実際に操作するには、「xlwings」のインストールが必要になります。
xlwingsのインストール方法
xlwingsを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install xlwings
※xlwingsを使用したことがある場合は、このインストール作業は不要です。
インストール方法詳細やインストールができない場合の対処法、
基本的な使い方などは下記記事をご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート~シートの取得
import xlwings
workbook = xlwings.books.active
worksheet = workbook.sheets.active
上記コードにて、「xlwingsのインポート」「アクティブブック・アクティブシートの取得」をしています。
詳細は「アクティブシートの取得」の記事をご覧ください。
最終行の取得
last_row = worksheet['A1'].end('down').row
上記一文にて、最終行を取得することができます。
注意したいのは、「最終行の値」ではなく「最終行の行数」という点です。
「最終行の値」を取得する方法も次項で解説いたします。
左辺に、取得した最終行の行数を入れる変数を記述します(名前は基本的に何でもOK)。
右辺には、シートが入った変数と[‘A1’]を書いたら、続けて「.end(‘down’).row」を書いて完了です。
「end」は指定したセル(今回はA1)に対して、値が入った最後のセルを取得できます。
ちょっと意味がわからないですね…。
「A1セル」が開始位置となり、「上下左右」どこかに向けて進むと思ってください。
今回は「down」を指定しているため、「A1セル」から開始し、下方向に向かって進んでいきます。
最終的に、値が入った最後のセルである「A6セル」で止まります。
- up:指定したセルから上に進み、値の入った最後のセルを取得
- down:指定したセルから下に進み、値の入った最後のセルを取得
- left:指定したセルから左に進み、値の入った最後のセルを取得
- right:指定したセルから右に進み、値の入った最後のセルを取得
エクセルを手動で操作する際、「ctrlキー」+「↓キー」を入力すると、値の入った最後の行まで飛びますが、同じことをしていると思ってください。
コードの解説に戻りますが、末尾に「.row」が付いているため、「A6セル」の「行」である「6」を取得できるというわけです。
<テンプレ>
【 変数 = シートが入った変数[‘開始位置のセル名‘].end(‘down’).row 】
2行目が空白行の時は
途中で空白行がある場合は、「開始位置のセル名」を「空白行の次の行」を指定してください。
last_row = worksheet['A3'].end('down').row
最終行の手前が1行空いている時は
最終行の手前に空白行が存在する場合もあるかと思います。
そんな時は、下記のコードを試してみてください。
last_row = worksheet['A1048576'].end('up').row
これは、エクセルの最終行である「A1048576セル」を開始位置に指定し、上方向に向かって進ませるというものです。
よほど膨大なデータでない限り「A1048576セル」は空白セルです。
開始位置のセルが空白であった場合は、最初に見つけた「値が入ったセル(今回はA6セル)」を取得することができます。
最終行の値を取得するには
最終行の行数がわかったところで、今度は最終行の値を取得してみましょう。
上図の最終行である「A5セル」の値「な」を取得するコードです。
import xlwings
workbook = xlwings.books.active
worksheet = workbook.sheets.active
last_row = worksheet['A1'].end('down').row
last_cell_value = worksheet['A'+ str(last_row)].value
print(last_cell_value)
<実行結果>
な
コードの6行目までは前項と同じです。
8行目で何をしているかというと、結果的に「A5セル」の値を変数に入れています。
「A5」の「5」は前の行で取得した最終行の行数です。
これを「str型」にして「A+5」つまり「A5」というセル名にしています。
str型にする理由については、変数の記事で解説しております。
最終的に【last_cell_value = worksheet[‘A5’)].value】となり、A5セルの値を取得できるというわけです。
同様の指定をすることで、最終行を削除することもできます。
行を削除する方法は別の記事をご参考ください。
うまく動作しない時
エラーが出る
‘NoneType’ object has no attribute ‘books’
エクセルブックやエクセルファイルを開いていないのに、ブックやファイルを取得しようとした場合に出るエラーです。
事前に対象のファイルを開くように指定するなど、構文を見直してみましょう。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
空のブックが生成される・残る
作業環境によっては「空のブック(Book1)」が生成されたり、残ってしまう場合があります。
このまま作業を続けると、空のブックがどんどん増えていく可能性があるため対処が必要です。
対処法としましては、何か別のエクセルを開いたままにしておきましょう。
そうすることで、空のブックは生成されません。
作業を始める前に、適当なエクセルファイルをひとつ開いておくことをおすすめします。
いつまでたっても実行されない
エラーは出ていないのに、いつまでたっても実行されない場合は、実行内容がエクセルに届いていない可能性があります。
「books.active」「sheets.active」を使用していて、エクセルファイルが最小化されていると、実行内容がエクセルに届かない場合があります。(もう1度実行すると、同じ内容が2回実行される)
エクセルは最小化せず、コードエディタとエクセルを並べて表示させた状態で実行するとうまくいきやすいです。
最後に
xlwingsで最終行を取得する方法を解説いたしました。
当ブログでは、xlwingsやopenpyxlなど、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!