2025/08/25

教你一招:用 Excel 命名範圍,解決 Python in Excel 不能用變數的痛點

雖然 Excel 裡可以執行 Python 以取代 VBA,但使用起來還是滿不方便的。

首先,它的選取範圍不能直接用變數:

以下方式是正確的讀入資料方式:

all_data_df = xl("D1:KJ260", headers=False)

試圖利用變數讀入資料會失敗:

Data_Range = "D1:KJ260"
all_data_df = xl("Data_Range", headers=False)

所以每次資料變動,要改程式內容就很煩。

還有,它的報表繁中字體就只有三種,但只有 SimHei 字體能看

不能用使用變數這個問題雖然讓人很困擾,但可以使用命名管理員定義一個新名稱,指定一個命名範圍,並將該命名範圍指向一個 index 函式來解決。

雖然定義名稱過程有點討厭,但至少不用一行一行去改 Python 內容,也還算可以接受。

使用 Excel 命名範圍

怎麼以命名範圍取代變數呢?首先,先進到『公式』頁面。

進入 Excel 公式頁面
圖、進入 Excel 公式頁面

打開名稱管理員。

打開 Excel 名稱管理員
圖、打開 Excel 名稱管理員

建立一個新的名稱,比方說 Data_Range,並參照到公式 (底下公式複製起來,直接貼入『參照到:』欄位):

=INDEX($1:$1048576, $B$1, COLUMN(INDIRECT($A$1&"1")))
:INDEX($1:$1048576, $D$1, COLUMN(INDIRECT($C$1&"1")))

建立 Data_Range 並指定參照範圍
圖、建立 Data_Range 並指定參照範圍

建立新的命名範圍後,會看到命名管理員中已經有 Data_Range 這個名稱的存在,這時就可以將命名管理員關閉了。

在 Excel 名稱管理員看到已建立的命名範圍
圖、在 Excel 名稱管理員看到已建立的命名範圍

前面命名範圍時參照的公式,意思是說我會將起始欄放在 A1 這一格,起始列放在 B1;結束欄放在 C1;結束列放在 D1。

比方說,我的資料是從 D8:KJ260,所以我在 A1 這一個填入起始欄 D,B1 填入起始列 8;C1 填入結束欄 KJ,D1 填入結束列 260。

在 Excel 的儲存格填入資料範圍
圖、在 Excel 的儲存格填入資料範圍

接下來就可以在 Python in Excel 中使用命名範圍進行計算,要改變資料範圍時也只要在 A1:D1 修改資料即可,不需要進到 Python 程式碼裡一行程式碼、一行程式碼的慢慢修改資料範圍。

在 Python in Excel 裡使用命名範圍
圖、在 Python in Excel 裡使用命名範圍

雖不滿意,但比沒有好

雖然使用命名範圍步驟還不少,但至少比完全沒有解決方法來得好一些。原本改變了資料範圍就得進 Python 程式碼裡一行一行修改,有時候一行沒有改到,計算出來的結果就是錯的。

現在利用命名範圍,不用擔心某幾行程式沒改到造成結果失誤,至少解決了部份問題。當然,如果日後 Microsoft 能讓 Python in Excel 直接抓取 "D8:KJ260" 這樣的範圍進行計算就更好了。

Microsoft 還沒有改善 Python in Excel 之前,就先用命名範圍撐著吧。

沒有留言:

張貼留言