簡體   English   中英

如何修復#SPILL? 僅顯示第二個值出錯?

[英]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
  • 基本上,對於第一種情況,只需返回 4 位數字。 每次我只有一個 4 位數字序列時,我都想返回該序列。
  • 對於第二種情況,我只想返回第二年。 每次我有 2 個 4 位數字序列時,我只想返回第二年。
  • 對於第三種情況,我什么都不想返回。 每次我有超過 2 個 4 位數字序列時,我都想返回空白。

我試圖添加的最后一件事是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))

對於超過一年的情況,去掉找到的最后一年,如果第二次查找是數字,則返回空,否則返回找到的上一年。

excel輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM