[英]How to fix the #SPILL! Error by displaying only the second value?
我有一個列,其中顯示了一些信息:
產品信息 |
---|
我是2020年的第三個產品 |
我創建於 1995 年,我於 2021 年上市 |
我不確定我是否來自 2019 2020 2021 |
我有一個公式可以在上面的列中提取年份,即:
=IFERROR(FILTERXML("<k><m>"&SUBSTITUTE([@[Product Name]]," ","</m><m>")&"</m></k>","//m[.=number() and string-length()=4]"),"")
這個公式的問題在於它適用於第一種情況,但它給了我一個#SPILL。 其他兩種情況的錯誤:我理想的 output 是:
產品信息 | 年 |
---|---|
我是2020年的第三個產品 | 2020 |
我創建於 1995 年,我於 2021 年上市 | 2021年 |
我不確定我是否來自 2019 2020 2021 |
我試圖添加的最后一件事是position()>5 ,這將切斷第二個示例中的 1995,但我會繼續在第三個示例中出現錯誤。 此外,我的列表非常龐大,我不確定position()>5是否適用於屬於同一個第二個示例的所有產品。
我對 XPATH 不是很了解,所以如果有任何幫助,我們將不勝感激。 謝謝!
只需添加一個簡單的子句來確定返回的數量,例如使用ROWS
(因為默認情況下FILTERXML
返回一個垂直數組):
=LET(
ζ, FILTERXML(
"<k><m>" &
SUBSTITUTE(
[@[Product Name]],
" ",
"</m><m>"
) & "</m></k>",
"//m[.=number() and string-length()=4]"
),
ξ, ROWS(ζ),
IF(ξ > 2, "", INDEX(ζ, ξ))
)
編輯:我可能更願意在這里避免FILTERXML
:
=LET(
ζ, TEXTSPLIT([@[Product Name]], " "),
ξ, -(ζ & "**0"),
IF(COUNT(ξ) > 2, "", IFERROR(-LOOKUP(1, FILTER(ξ, LEN(ζ) = 4)), ""))
)
免責聲明:以下解決方案是基於以下假設編寫的:當“年數 < 3”時,返回最后給定的年份。 如果 'count >= 3' 則僅在年份成對出現時才返回最后一年。 因此使用“模數 2 == 0”。 ‡
如果您願意,可以肯定地擴展 xpath。 但是,我會稍微重寫它。 每個謂詞,左方括號和右方括號之間的結構,是給定節點列表的過濾器。 寫多個這樣的結構實際上就是and ing這樣的謂詞。 為了更好地了解最常見的 xpath 1.0 函數可以在FILTERXML()
中做什么,我想將您重定向到這篇文章。
因此,要編寫連續的謂詞模式,我會選擇:
[.*0=0]
- 首先返回一個過濾后的所有數字的節點列表,其中節點乘以零等於零;[string-length()=4]
- 然后只返回 4 個字符長的那些‡‡ ;[position() = last() and (position() = 1 or position() mod 2 = 0)]
- 第三個也是最后一個謂詞對於您的查詢來說是最棘手的。 這是通過首先檢查position() = last()
來完成的,這意味着該節點需要是步驟 2 的過濾節點列表中的最后一個節點,並且(position() = 1 or position() mod 2 = 0)
意味着我們想要檢查此節點是否也在第一個索引處或索引 position 的模數 2 等於 0 ‡‡‡ 。 B2
中的公式:
=IFERROR(FILTERXML("<t><s>"&SUBSTITUTE(A2," ","</s><s>")&"</s></t>","//s[.*0=0][string-length()=4][position() = last() and (position() = 1 or position() mod 2 = 0)]"),"")
雖然以上內容適用於 Excel 2013 及更高版本‡‡‡‡ ,但您確實在談論溢出行為。 如果您碰巧在 ms365 中使用當前頻道,您也可以嘗試:
=LET(x,TEXTSPLIT(A2," "),y,--FILTER(x,ISNUMBER(-(x&"**0"))*(LEN(x)=4),{1,2,3}),z,COUNT(y),IF(OR(z=1,MOD(z,2)=0),TAKE(y,,-1),""))
‡如果'count < 3' 如果你需要簡單地返回最后一年,那么你可以使用 xpath "//s[.*0=0][string-length()=4][position()<3 and position() = last()]"
或 ms365 公式=LET(x,TEXTSPLIT(A2," "),y,FILTER(x,ISNUMBER(-(x&"**0"))*(LEN(x)=4),""),IF(COUNTA(y)>2,"",TAKE(y,,-1)))
。
‡‡請注意,如果您希望驗證年份介於 1900-2050 左右之間,則可以對此更加嚴格。 可以用[.*1>1899][.*1<2051]
替換第一個和第二個謂詞。
‡‡‡請注意,在 xpath 中的順序或書寫您的和/或陳述很重要。 我們需要使用顯式括號來控制優先級。 看到這個
‡‡‡‡這不適用於 Excel 在線或 Excel Mac
您可以使用TEXTAFTER
function 嘗試以下操作。假設您在末尾使用空格分隔年份。 如果不是這種情況,可以修改公式以進行額外檢查(它是一個數字和四位數,但嚴格來說年份可以少於或多於 4 位數)。 讓我知道之前的假設是否不適用,以便我嘗試對其進行調整。 以下是數組版本,因此如果您使用 excel 個表,則可以使用整個表列:
=LET(in,A2:A4,last,TEXTAFTER(in," ",-1),
IF(ISNUMBER(1*TEXTAFTER(SUBSTITUTE(in," "&last,"")," ",-1)),"",last))
對於超過一年的情況,去掉找到的最后一年,如果第二次查找是數字,則返回空,否則返回找到的上一年。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.