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ファイルならこれで変更できるが、ウィンドウ枠を固定している場合、この方法では変更ができないと判明。プログラム自体はエラーもなく動くが、保存したファイルを開いても、指定した位置にカーソルが移動しない。
回避策
ウィンドウ枠を一時的に解除
すごく面倒くさいけど、次の手順でウィンドウ枠の固定を解除してから設定すればよい。
- Excelファイルを読み込み、ウィンドウ枠の固定を解除してから保存。
- Excelファイルを読み込み、アクティブセルを指定してから保存。
- 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を起動せずに動かすことができない。いちいちアプリ画面が起動されるのが結構うざいので、今回はパス。