INDEX 區域選擇與參照身分
版本 2.384.101 擴充 INDEX(source,row_num,column_num,area_num),讓第四個引數可以接受計算後陣列,並能透過定義名稱與 LET 組合受支援的真實多區域參照;列、欄與區域選擇器可以一起廣播
單一計算後陣列或多個參照區域
常數或計算後陣列就是一個來源區域,因此 INDEX(SEQUENCE(2,2),2,2,1) 回傳 4;完全省略第四個引數也是選擇區域 1,而明確留空的第四個引數則是無效的區域選擇器
參照聯集可以包含同一張工作表上的多個實際工作表區域;area_num 依聯集順序選出區域,列號與欄號則在該選定區域內套用
以下範例中,Source!A1:B2 含 {1,2;3,4},Source!D1:E2 含 {10,20;30,40};Other!A1:B2 含 {100,200;300,400}
| 公式 | 結果 |
|---|---|
INDEX((Source!A1:B2,Source!D1:E2),2,2,2) | 40,保留純量參照結果 |
SUM(INDEX((Source!A1:B2,Source!D1:E2),0,0,2)) | 100,對完整的第二個區域加總 |
INDEX(SEQUENCE(2,2),0,0,1) | {1,2;3,4},一個計算後的值陣列 |
INDEX(SEQUENCE(2,2),2,2,2) | #REF!,因為計算後陣列沒有第二個區域 |
定義名稱、LET 與 CHOOSE
運算式為 (Source!$A$1:$B$2,Source!$D$1:$E$2) 的受支援本機定義名稱會保留兩個區域;巢狀名稱保留這個身分,AREAS(NamedAreas) 回傳 2
INDEX(NamedAreas,2,2,2) 回傳 40,而 ISREF(INDEX(NamedAreas,0,0,2)) 回傳 TRUE;ROW、COLUMN、ROWS、COLUMNS 與彙總消費者繼續使用選定參照的座標
相對參照名稱會在每個消費者位置解析,工作表層級名稱優先於同拼寫的活頁簿層級名稱;保留參照身分並不會把相對名稱凍結在它第一次評估的位置
LET(areas,(Source!A1:B2,Source!D1:E2),INDEX(areas,2,2,2)) LET(areas,(Source!A1:B2,Source!D1:E2),ISREF(INDEX(areas,0,0,2)))
這兩個運算式分別回傳 40 與 TRUE;繫結到 SEQUENCE(2,2) 的名稱仍然是計算後的值陣列,不會取得參照身分
選擇真實參照的純量 CHOOSE 保留該選定參照,包括選到另一張工作表:INDEX(CHOOSE(2,Source!A1:B2,Other!A1:B2),2,2) 回傳 400,對應的純量參照結果也通過 ISREF
帶陣列選擇器的 CHOOSE 是依選擇器方向組合值,而不是建立參照區域聯集;CHOOSE({1,2},Source!A1:B2,Source!D1:E2) 回傳 {1,20;3,40},再補一個值為 2 的 INDEX 區域選擇器仍然回傳 #REF!
三個選擇器陣列
列、欄與區域選擇器接受純量值或陣列;單一維度會廣播,相對的列與欄方向形成叉積,相同方向則按位置配對;不等形狀中未配對的位置包含個別的 #N/A 錯誤
INDEX((Source!A1:B2,Source!D1:E2),{1;2},2,{1,2})
INDEX((Source!A1:B2,Source!D1:E2),2,2,{2;1})
第一個運算式回傳 {2,20;4,40},第二個回傳 {40;4};選出的值保留其字串、布林、數值與具型別錯誤的表示
只要任一選擇器是陣列,結果就是值陣列而不是參照;列或欄為零,或省略列或欄選擇器時,會在每個結果位置選該軸的第一個成員
這與純量擷取不同:兩個純量的列與欄零值會回傳整個選定區域,但 INDEX((Source!A1:B2,Source!D1:E2),0,0,{1,2}) 回傳 {1,10},而不是兩個巢狀的二乘二陣列;其總和為 11
區域強制轉型與錯誤
區域選擇器會把小數數值向零截斷,也接受數值文字與布林值;1.9、"1" 與 TRUE 都選擇區域 1
區域零、FALSE、明確留空的第四個引數、負值以及截斷後為零的小數會回傳 #VALUE!;非數值文字也回傳 #VALUE!,而超出可用區域數的正數區域則回傳 #REF!
具型別的選擇器錯誤會以其既有錯誤碼傳遞;對陣列選擇器而言,無效的區域只在其對應的結果位置產生錯誤,因此 INDEX(SEQUENCE(2,2),2,2,{1,2}) 回傳 {4,#REF!}
既有錯誤不會被後續的邊界檢查取代:INDEX(#N/A,1,1,2) 回傳 #N/A,INDEX(SEQUENCE(2,2),#N/A,1,#DIV/0!) 保留列選擇器的 #N/A
由既有本機工作表限定的無效參照仍然是 #REF!,包括 Source!#REF! 與 'Plan! O''Brien'!#REF!;含這類本機參照錯誤的定義名稱,傳給 INDEX 或 ISFORMULA 時也保留 #REF!
本機錯誤 token 可以搭配百分比或隱含交集運算子使用,工作表分隔符之後的空白也接受;工作表名稱與其分隔符之間的空白則不在接受的語法內
"Source!#REF!" 這類加引號的公式字串仍是文字;陣列常數內的工作表限定參照 token 不在受支援的來源文法內
列與欄選擇器保持其既有的零值擷取規則與負值驗證;區域零絕不代表整個來源的擷取
儲存、相依性與上限
XLSX 自動溢出計算可以讓選擇器陣列結果長大或縮小,並釋放錨點持有的過時後續儲存格;受支援的運算式也可以在明確的固定 CSE 目的地內評估,並在 XLSX 儲存與重新開啟後存留
具名選擇器即使評估結果是純量,也可能需要保守的動態儲存;單一儲存格的動態標記不會改變值,也不會改變受支援參照結果的身分
選定的來源參照與巢狀名稱參與相依性追蹤,因此重新計算後會觀察到後續的來源編輯;選擇器走訪與產生的矩陣承載消耗既有的評估步驟與陣列記憶體預算
邊界
區域屬於不同工作表的直接聯集回傳 #VALUE!,即使要求的區域編號只會選到其中一個也一樣;選擇單一參照的純量 CHOOSE 仍是受支援的跨工作表替代方案
計算後陣列、常數或值運算式的聯集不是真實的多區域參照;LET 繫結的計算後陣列聯集回傳 #VALUE!,直接的陣列套陣列聯集語法也不被接受為來源形式
這份契約涵蓋已測試的本機參照與計算後陣列形式;不代表支援每一種外部參照圖形、每一個會產生參照的函式,或任意的巢狀陣列容器
未知的工作表限定詞不會被正規化成已知的本機參照錯誤;Excel 可能為 NoSuchSheet!#REF! 這類公式建立外部連結圖形,比對該圖形不在這份本機計算契約的範圍內