Excel 公式可以從文字字串中擷取數字,但僅限於資料「表現正常」時:格式乾淨、位置固定、數字中沒有混雜算術,且沒有看起來像小數點逗號的千分位分隔符。一旦你的試算表出現 $19.99、item123、50%、運算式 5-3,或使用歐式標點寫成的 1,000,000,常見的 TEXTJOIN、MID 和 FILTERXML 技巧要不是靜悄悄地失敗,就是擷取出錯誤的片段。像是 VALUE、NUMBERVALUE 這類內建函式,加上 TEXTJOIN + MID + ROW(INDIRECT) 陣列,可以從已知位置「哄」出一段連續數字;而 FILTERXML 搭配 XPath 則能在新版 Excel 中切開混合字串——但每一種方法都會在不同的邊角案例上悄悄失效。基於規則的數字擷取工具能處理同一批儲存格,而且完全不寫任何函式,並在你複製結果之前,準確回報它找到了多少個數字。

擷取數字的 Excel 公式在哪裡悄悄失效
每一種從文字中拉出數字的熱門 Excel 技巧,都只有一條狹窄的快樂路徑。經典的 LEFT、RIGHT 和 MID 做法預設數字位於固定的偏移位置——對於像 "INV-00123" 這種你知道數字從第五個字元開始的代碼還行,但對於 "Order received on March 5, paid $42.50 on the 7th" 這種數字可能落在字串任何一處的情況就完全沒用。
在論壇上流傳的 TEXTJOIN + MID + ROW(INDIRECT) 陣列公式,在新版 Excel 中可以運作,會產生所有可能的子字串,再篩出數字的部分。它也是那種會把一萬列的貼上內容,變成讓整份活頁簿當機的計算的公式,而且它仍然無法理解 1,000,000 是一個數字,而不是被逗號分開的三個片段。
FILTERXML 搭配 XPath 在 Excel 365 和 Excel for the web 中能給你最乾淨的分離效果,也是最接近 Excel 原生「從這個儲存格擷取所有數字」的答案。它的弱點在於 XML 的安全性:像 1,00,000 這種格式錯誤的群組,或來源文字中一個迷途的 & 符號,都可能會丟出錯誤,導致整欄垮掉,而不是跳過那個有問題的儲存格。
這些技巧都不會對一個多出來的負號做判斷。算式 5-3 無論是橫跨單一儲存格或藏在貼上的一段文字裡,都會被 VALUE 讀成「五和負三」,而任何用 regex 形式、將連字號視為正負號的東西,則會把它讀成「負的五三」。在歐式語系環境中,外觀一模一樣的小數點逗號和千分位分隔符,會搞混清單上的每一條公式。科學記號——像是藏在 "test1e5" 這種識別字中、或夾帶在註解裡的 1e5——有時會被解讀成十萬,有時卻被拆成 1、e 和 5,每次結果都不一樣。
不斷產生這些混合字串的 Excel 情境
這個問題揮之不去,是因為真實的 Excel 資料並不乾淨。幾種形態反覆出現:
- 發票明細。貼上的儲存格內容是 INV-4521 — $1,234.56 paid 03/14,而你只想在總計中拿到 4521 和 1234.56。
- 問卷匯出。開放式回應中,年齡、百分比和金錢數值混在同一欄:Age 34, 85% agree, spent $19.99。
- 記錄檔。開發人員將一大塊記錄檔輸出貼進 Excel,需要擷取每一個數字符記,不論前後文。
- 產品代碼。像 item123、SIZE-42-XL 和 batch#9981 這類儲存格,應該要且只要擷取其中的數字。
- 財務報表。從 PDF 複製過來的附註,千分位分隔符、代表負數的括號、貨幣符號和結尾的百分比符號,全擠在同一個欄位。
在上述每一種情況中,使用者要的是數字、不要文字,而且要的是意義完整的數字:負號就是負號、小數就是小數,千分位分隔符不會被當成小數點。
不寫公式,從 Excel 資料中擷取數字
最快速又可靠的工作流程,是把混亂的那一欄從 Excel 複製出來,丟進一個對「什麼才算數字」有明確規則的工具,再把清理過的結果貼回新的一欄或新的一張工作表。「從文字中擷取數字」正是為這個任務而設計,操作步驟很短。
- 貼上含有你想擷取之數字的文字。
- 視需要調整規則:正負號、千分位分隔符、科學記號、去重複。
- 選擇清單或統計輸出,檢查找到的數量,再複製結果。
這個工具在你複製之前,會回報它找到的每個數字的總數,這正是公式永遠無法給你的健全性檢查。如果它找到七個數字而你預期是五個,你可以逐行檢視輸出、切換規則、再次貼上,觀察計數的變化。
實際範例:單一發票明細
以字串 Order #4521 for $1,234.56 (5-3 units) 為例。在預設規則開啟的情況下——正負號規則啟用、千分位分隔符開啟、科學記號關閉、去重複關閉——擷取結果會回傳四個數字,每行一個:
- 4521
- 1234.56
- 5
- 3
5-3 中的負號會被去掉,因為它夾在兩個數字中間而非數字的開頭,所以這個算式會被視為兩個正數。1,234.56 中的千分位分隔符會被辨識為分群符號,因此 1234.56 是一個數字,而不是三個。這四個數值以一般 JavaScript 雙精度浮點數計算後的總和為 4521 + 1234.56 + 5 + 3 = 5763.56。
每一條規則實際在做什麼
規則是公式無法給你的部分,因為公式不是成功就是失敗,但不會告訴你它打破了哪一個假設。
- 正負號。負號只有在真正附屬於數字時才會保留——在行首、在空白字元之後,或在開括號、比較運算子之後。運算式 5-3 會產生五和三,而不是五和負三。
- 千分位分隔符。開啟此選項時,像 1,000,000 這種格式正確的分群會被視為單一數字。關閉時,則會逐字擷取每一段連續數字,這對使用不同逗號意義的資料來說才是正確選擇。
- 小數。整數與小數預設都會被辨識,包括負值、前置加號,以及沒有前置零的裸小數(例如 .5)。
- 科學記號。預設為關閉,因為一般文字中的 1e5 比較常是打錯字或識別字,而不是十萬。當你的來源真的使用科學記號時再開啟。
- 去重複。一個可切換的開關,會合併重複的值,同時保留首次出現的順序。
只會辨識 ASCII 數字——這是一個明確揭示的範圍限制,而不是隱而不宣的限制。全形數字與其他文字系統的數字符號會原樣通過而不被擷取,這代表計數中不會出現「半支援」的驚喜。
何時該從 Excel 公式切換到專用工具
這兩種做法解決的是不同問題。公式留在試算表裡,會在每次變動時重新計算——這正是你在處理活模型時想要的。瀏覽器工具則更適合處理匯入資料的一次性清理,也是當資料形態不明時的正確選擇。
| 評比項目 | Excel 公式做法 | 從文字中擷取數字 |
|---|---|---|
| 每一欄的設定成本 | 每個案例需要自訂公式或 VBA | 貼上、選擇規則、複製 |
| 將「5-3」視為兩個正數 | 會將負號讀為正負號 | 會略過數字之間的運算子 |
| 將 1,000,000 視為一個數字 | 取決於語系環境 | 可切換、處理格式正確的分群 |
| 需要新版 Excel | FILTERXML 與動態陣列需要 | 在任何瀏覽器皆可執行 |
| 計算個數、總和、最小值、最大值、平均值 | 每一項都需要各自的公式 | 與清單一併顯示 |
| 回報找到的數字數量 | 無 | 有,在複製之前 |
| 不會上傳任何資料 | 留在你的活頁簿中 | 在瀏覽器本機執行 |
如果你想用公式的方式處理熟悉活頁簿中某一欄的一次性工作,Excel 公式逐步解說並列展示了 TEXTJOIN、MID 與 FILTERXML 模式。當資料混亂到你無法信任公式的假設、當你需要統計數據而不只是清單,或當你想要一個可以對照預期來檢視的計數時,瀏覽器工具就是較好的選擇。
必須知道的實務限制
有兩項限制值得注意,兩者都明列在頁面上而非隱藏。統計是以標準雙精度浮點數計算,因此乾淨小數的總和可能會在大約第十五位有效數字出現常見的浮點誤差殘留,這是每份試算表都會遇到的相同限制。計數本身則是精確的,若輸入中沒有可辨識的數字,會被如實回報為零,而非視為錯誤。輸入上限為一百萬個字元,並採單次線性掃描處理,因此大量貼上仍能順利回傳,而不會像長串 FILTERXML 陣列那樣造成當機。
這個工具刻意不做的事是「解讀」。它不進行貨幣轉換、沒有單位感知、不解析日期,也不猜測數字的意義。一個值得信賴的擷取工具,其規則必須是你讀得懂的;而這些規則由超過二十個測試案例所把關,涵蓋正負號邊界、格式錯誤的分群、貨幣、百分比、嵌入的數字以及行尾變化——因此頁面上所列的規則,就是工具實際套用的規則。