Excel シートを編集していると、「既存の表を数行下へずらしたい」「列を 1 列右へまとめて移動したい」といった場面がしばしば発生いたします。openpyxl にはセル範囲を丸ごと移動できる move_range() メソッドが用意されています。本記事では、サンプルワークブックの表を 2 行下・1 列右 へ移動する具体例を示し、引数の意味や注意点を丁寧に解説いたします。
目次
動作環境
| 項目 | 内容 |
|---|---|
| Python | 3.10 以上 |
| 主要ライブラリ | openpyxl(pip install openpyxl) |
| 入力ファイル例 | schema_definition.xlsx |
| 出力ファイル例 | schema_definition_moved.xlsx |
サンプルコード
from openpyxl import load_workbook
# 1. ワークブックとアクティブシートを読み込み
wb_path = 'schema_definition.xlsx'
wb_schema = load_workbook(wb_path)
ws_schema = wb_schema.active
# 2. 移動対象のセル範囲を指定(D4~I8 の 5×6 の表)
source_range = 'D4:I8'
# 3. rows=2, cols=1 を指定して 2 行下・1 列右へ移動
ws_schema.move_range(
source_range,
rows=2, # 正の値で下方向、負の値で上方向へ移動
cols=1 # 正の値で右方向、負の値で左方向へ移動
)
# 4. 保存(上書きを避けるため別名で保存)
wb_schema.save('schema_definition_moved.xlsx')
コードのポイント
| パラメータ | 説明 |
|---|---|
source_range | "D4:I8" のように「開始セル:終了セル」で指定します。 |
rows | 正の値で下方向、負の値で上方向へセル範囲をシフトします。 |
cols | 正の値で右方向、負の値で左方向へセル範囲をシフトします。 |
| 既存データの上書き | 移動先に別のデータがある場合は上書きされます。必要なら事前にコピーを保存してください。 |
注意点とベストプラクティス
- 数式と参照セルの更新
move_range()では、セル内の数値・文字列・書式は移動しますが、
数式のセル参照は自動更新されません。移動後に数式が崩れる可能性がある場合は、Translatorクラスで数式を再生成するか、openpyxl.utils.cellで参照を置換して調整してください。 - 結合セルが含まれている場合
対象範囲に結合セルがあると移動後に結合が解除されることがあります。ws_schema.merged_cells.rangesを確認し、必要に応じて再結合を行ってください。 - フレームワーク化
複数のシートや複数範囲を移動する場合は、関数化して範囲・行列オフセットをパラメータとして渡すとメンテナンスが容易です。
まとめ
move_range()を使うと セル内容・書式を保持したまま 表をまとめてシフトできます。rowsとcolsの正負で 上下左右への移動量 を直感的に指定できます。- 数式や結合セルが絡む場合は 移動後の整合性チェック を必ず行うと安全です。
大規模なレイアウト調整やテンプレート生成処理に、ぜひご活用ください。
