毎回レイアウトが違うExcelの表、Pythonでどう処理すればいいの…?
このように悩んだことはありませんか?


・シートごとに表の開始位置や範囲がバラバラ
・規則性もなく、毎回手作業で確認している
・自動化しようにも、範囲の特定ができない…



私自身も、毎回異なるExcel表の範囲をどうやって自動で取得するかで、本当に悩みました。
同じように、「セルの位置も罫線も毎回違うから、自動で表を取るのが難しい…」と感じた方には、きっと役立つ内容です。
この記事では、PythonでExcelファイルを操作できるライブラリ「openpyxl」を使い、罫線で囲まれた表の範囲(最終行・最終列含む)を自動的に取得する方法をご紹介します。
このコードはコピペするだけで使用できるようにしています。
Python × Excel での作業効率化を、一緒に目指していきましょう!
よく使う度 | |
難しさ | |
覚えておくと安心度 |
「Pythonを始めたいけど、どの本を選べばいいのか分からない…」
そんなふうに迷ったことはありませんか?
私も最初は同じでした。
でも、図解が多くて手を動かしながら学べる入門書を選んだことで、スムーズに理解できるようになりました。
これから始める方にぴったりな、やさしく学べるPython本をいくつかご紹介します。




この記事でできるようになること
まずはコピペで使える!Python×openpyxlで罫線に囲まれた表の範囲を取得する方法
「Excelの表の位置が毎回違うから、自動処理がうまくいかない…」
そんな悩みを解決する、コピペで使えるクラスコードをご紹介します!
以下のクラスを使えば、罫線で囲まれた表の上下左右のセル位置(最終行・最終列)を自動で取得できます。
このコードの仕組みを簡単にご紹介
- 初期設定
- 表の中にあるセルの行・列を指定します(例:6行目・5列目など)
- 処理内容
- そこを起点に、上下左右に向かって罫線(実線
"thin"
)をたどり、表の範囲を取得します
- そこを起点に、上下左右に向かって罫線(実線
コードを記載します。(そのままコピペでOK)
import openpyxl
# 実線で囲われたセルの範囲を取得する
class Get_border_cell():
def __init__(self, init_row, init_col, wb, ws):
self.wb = wb
self.ws = ws
self.init_row = init_row
self.init_col = init_col
self.max_row = self.ws.max_row+1
self.max_col = self.ws.max_column+1
# 上を見ていき実線となる行を取得
def get_border_top(self):
row_top = None
for row in range(self.init_row, 1, -1):
if self.ws.cell(row=row, column=self.init_col).border.top.style == "thin":
row_top = row
break
return row_top
# 下を見ていき実線となる行を取得
def get_border_bottom(self):
row_bottom = None
for row in range(self.init_row, self.max_row):
if self.ws.cell(row=row, column=self.init_col).border.bottom.style == "thin":
row_bottom = row
break
return row_bottom
# 左を見ていき実線となる列を取得
def get_border_left(self):
col_left = None
for col in range(self.init_col, 0, -1):
if self.ws.cell(row=self.init_row, column=col).border.left.style == "thin":
col_left = col
break
return col_left
# 右を見ていき実線となる列を取得
def get_border_right(self):
col_right = None
for col in range(self.init_col, self.max_col):
if self.ws.cell(row=self.init_row, column=col).border.right.style == "thin":
col_right = col
break
return col_right
# 行・列を再定義する際に使用
def set_position(self, row, col):
self.init_row = row
self.init_col = col
if __name__ == "__main__":
filePath = r"sample.xlsx"
wb = openpyxl.load_workbook(filePath)
ws = wb.active
cell_border = Get_border_cell(init_row=6, init_col=5, wb=wb, ws=ws)
print(f"上:{cell_border.get_border_top()}行")
print(f"下:{cell_border.get_border_bottom()}行")
print(f"左:{cell_border.get_border_left()}列")
print(f"右:{cell_border.get_border_right()}列")
処理結果
このように表の位置が変わっても範囲を取得することができます。


【Python × openpyxl】罫線で囲まれた表の範囲取得の使い方をやさしく解説!
先ほどのコードは、罫線(実線)で囲まれたExcelの表の範囲(上下左右)をPythonで自動的に見つけてくれるクラスです。
表の位置がシートごとに違っても、「このセルは表の中だよ」と最初にセル場所教えてあげれば、罫線をたどって範囲を特定してくれます。


使い方のステップ
① Excelファイルを読み込む
まずは、openpyxlを使ってExcelファイルを読み込みます。load_workbook()
関数を使うだけで簡単に読み込めます。
import openpyxl
filePath = r"sample.xlsx"
wb = openpyxl.load_workbook(filePath)
ws = wb.active
r
をつけることでパス内のバックスラッシュをエスケープ不要にします。.active
で最初のシートを取得することができます。
② 任意のセルを起点として指定
次に、表の中にあるセルの行・列を起点として指定します。
このセルをもとに、クラスが周囲の罫線をチェックします。
cell_border = Get_border_cell(init_row=6, init_col=5, wb=wb, ws=ws)
init_row=6, init_col=5
は「6行目・5列目(例:セルE6)」を指定しています。
※ここのセル位置は、任意で変更してください。- 起点セルは必ず表の内側にしてください!
③ クラスで上下左右の罫線をチェック
いよいよ、罫線の判定処理を実行します。
このクラスでは、上下左右に向かって罫線("thin"
)があるかを調べてくれます。
top = cell_border.get_border_top()
bottom = cell_border.get_border_bottom()
left = cell_border.get_border_left()
right = cell_border.get_border_right()
■ クラスの中では何をしているの? (get_border_top()で解説)
各メソッド(例:get_border_top()
)は、指定したセルを起点に、上方向(行番号が小さくなる方向)へ1つずつセルをたどっていき、そのセルの罫線情報(border.top.style
)をチェックしています。
def get_border_top(self):
row_top = None
for row in range(self.init_row, 1, -1):
if self.ws.cell(row=row, column=self.init_col).border.top.style == "thin":
row_top = row
break
return row_top
self.init_row
(起点の行)から、上に向かって1行ずつループします。border.top.style == "thin"
という条件で、「細線の罫線があるセル」を探します。- 最初に見つけたセルで
break
(ループ終了)して、その行番号を返します。 - 同様に、
get_border_bottom()
ではborder.bottom.style
を見ています。
■ 補足:他の方向も同じ考え方です
メソッド名 | 見ている罫線 | 方向 |
---|---|---|
get_border_top() | border.top.style | 上方向 |
get_border_bottom() | border.bottom.style | 下方向 |
get_border_left() | border.left.style | 左方向 |
get_border_right() | border.right.style | 右方向 |
すべて同じロジック構造で、チェックする方向と border
の属性が違うだけです。
④ 表の範囲(行・列)を取得
取得した「上下左右のセル位置」を使って、表の範囲を表示させます。
print(f"上:{top}行")
print(f"下:{bottom}行")
print(f"左:{left}列")
print(f"右:{right}列")
このように、罫線で囲まれた表の位置を自動的に特定することができました。
Python × openpyxlで表範囲を取得する際の「よくある質問と注意点」【FAQ】
罫線付き表の範囲取得を活かしたPython活用アイデア集
せっかく表の範囲が自動で取得できるようになったので、
ここからは実際の業務や自動処理でどう使えるのか?活用アイデアをご紹介します!
ちょっとした工夫で、毎日のExcel作業が一気にラクになりますよ。
- 表データをpandasに読み込んで自動集計
- 取得した範囲をもとに、必要なデータだけをpandasに渡して、集計・分析が可能です。
- 複数シートの表を一括で読み取る
- 請求書や日報など、複数のシートに表がある場合にも、同じロジックを使えば全シートをループして表だけ取得できます。
- 取得した範囲だけをCSVに出力
- 必要な表データだけを別ファイルに保存することで、余分なセルを省いて業務効率化!
- 帳票テンプレートの自動入力や検査に応用
- テンプレートの表範囲を自動で特定し、指定した位置に値を書き込んだり、チェックしたりできます。
- 業務報告書・見積書からデータベース化
- 社内のフォーマットがある場合、その表範囲を自動検出してデータベース登録まで自動化できます。
この記事のまとめ
この記事では、Python×openpyxl を使って、罫線で囲まれたExcel表の範囲(上下左右)を自動で取得する方法について解説しました。
「表の位置が毎回違うから自動処理できない…」と悩んでいた方も、
起点となるセルを指定するだけで、罫線をたどって表の範囲を特定できる便利なクラスコードを手に入れられたと思います。
ポイントのおさらい
- コピペで使える表範囲取得クラスコードを紹介
- 罫線(”thin”)で囲まれた範囲を、上下左右それぞれのメソッドで自動取得する方法を紹介しました。
⇒ 「まずはコピペで使える!Python×openpyxlで罫線に囲まれた表の範囲を取得する方法」をもう一度見る
- 罫線(”thin”)で囲まれた範囲を、上下左右それぞれのメソッドで自動取得する方法を紹介しました。
- クラスの使い方を4ステップでやさしく解説
- Excelの読み込みから範囲の取得まで、初心者でも実践しやすい手順で整理しました。
⇒ 「【Python×openpyxl】罫線で囲まれた表の範囲取得の使い方をやさしく解説!」をもう一度見る
- Excelの読み込みから範囲の取得まで、初心者でも実践しやすい手順で整理しました。
- よくあるトラブルをFAQ形式で解決
- 「Noneが返ってきた…」「罫線が認識されない」など、つまずきやすいポイントも事前にチェックしておきましょう。
⇒ 「Python×openpyxlで表範囲を取得する際の「よくある質問と注意点」【FAQ】」をもう一度見る
- 「Noneが返ってきた…」「罫線が認識されない」など、つまずきやすいポイントも事前にチェックしておきましょう。
- 表範囲の取得を活かしたアイデア集もご紹介
- pandasとの連携、CSV出力、テンプレート自動化など、実務に直結する活用法をピックアップしました。
⇒ 「罫線付き表の範囲取得を活かしたPython活用アイデア集」をもう一度見る
- pandasとの連携、CSV出力、テンプレート自動化など、実務に直結する活用法をピックアップしました。
今回のコードをうまく活かすコツ
- 起点となるセルは必ず表の「内側」を指定しましょう。
- 罫線スタイル(”thin” 以外)を検出したい場合はstyle条件を調整しましょう。
- 結果が
None
の可能性も考慮してエラーハンドリングを追加しましょう。
Pythonと openpyxl
の知識をさらに深めたい方は、以下の記事も参考にしてください。

