openpyxlでアクティブセルを指定

Excelのワークシート上でOpenPyXLを使ってアクティブセルを指定するのに苦戦した。

環境

  • macOS Sequoia 15.4.1
  • Python 3.13.3
  • OpenPyXL 3.1.5

背景

ネットでアクティブセル(カーソル位置)を変更する方法を調べたところ、次の方法がよく出てくる。

import openpyxl

wb = openpyxl.load_workbook('Book1.xlsx')
ws = wb.active

ws.sheet_view.selection[0].sqref = 'B3'

wb.save('Book1.xlsx')

単純なExcelファイルならこれで変更できるが、ウィンドウ枠を固定している場合、この方法では変更ができないと判明。プログラム自体はエラーもなく動くが、保存したファイルを開いても、指定した位置にカーソルが移動しない。

回避策

ウィンドウ枠を一時的に解除

すごく面倒くさいけど、次の手順でウィンドウ枠の固定を解除してから設定すればよい。

  1. Excelファイルを読み込み、ウィンドウ枠の固定を解除してから保存。
  2. Excelファイルを読み込み、アクティブセルを指定してから保存。
  3. Excelファイルを読み込み、ウィンドウ枠の固定をしてから保存。

いちいち保存する必要あり。

import openpyxl

#
# ステップ1: ウィンドウ枠の固定を解除
#
wb = openpyxl.load_workbook('Book1.xlsx')
ws = wb.active
ws.views.sheetView[0] = openpyxl.worksheet.views.SheetView()
wb.save('Book1.xlsx')

#
# ステップ2: アクティブセルを指定
#
wb = openpyxl.load_workbook('Book1.xlsx')
ws = wb.active
ws.sheet_view.selection[0].sqref = 'B3'
wb.save('Book1.xlsx')

#
# ステップ3: ウィンドウ枠を固定
#
wb = openpyxl.load_workbook('Book1.xlsx')
ws = wb.active
ws.freeze_panes = 'B2'
wb.save('Book1.xlsx')

これで選択セルは変更できる。ただし、セルを選択するだけ。開いたときに選択セルが必ず表示されるようにするのは、また別の話。

xlwingsを使う

タイトルに逆らっているが、openpyxlを諦めてxlwingsを使えば簡単に変更できる。

でも、オープンソース版だとExcelを起動せずに動かすことができない。いちいちアプリ画面が起動されるのが結構うざいので、今回はパス。

タイトルとURLをコピーしました