
我在一個單元格中有地址,我想將它們提取到同一行的不同單元格中。有些單元有四行位址,有些有三行。我可以使用文字到列和各種分隔符輕鬆分割具有三個的分隔符,但不能使用四個分隔符。
在第一個範例中,我有四行,第二個範例有三行
Anchorage Oncology Centre
3801 University Lake Drive
Suite 300-B2
Anchorage, AK 99508 US
我想把上面的內容分成 5 個單元格。地址、城市、州、郵遞區號和國家各一個單元格
Anchorage Oncology Centre
3801 University Lake Drive
Suite 300-B2
Anchorage
AK
99508
US
在下面的第二個例子中
Providence Alaska Medical Center
3200 Providence Drive
Anchorage, AK 99508 US
我想
Providence Alaska Medical Center
3200 Providence Drive
Anchorage
AK
99508
US
這可以用公式來完成嗎?
謝謝
答案1
假設「Anchorage, AK 99508 US」文字位於 A1,請輸入這些公式。
A4 --> =MID(A1,1,(FIND(",",A1,1))-1)
B4 --> =MID($A$1,(FIND(" ",$A$1,A3))+1,C3-(FIND(" ",$A$1,A3))-1)
C4 --> =MID($A$1,(FIND(" ",$A$1,(FIND(" ",$A$1,FIND(",",A1,1)))+1))+1,(FIND(" ",$A$1,(FIND(" ",$A$1,(FIND(" ",$A$1,FIND(",",A1,1)))+1))+1))-(FIND(" ",$A$1,(FIND(" ",$A$1,FIND(",",A1,1)))+1))-1)
D4 --> =MID($A$1,(FIND(" ",$A$1,(FIND(" ",$A$1,(FIND(" ",$A$1,FIND(",",A1,1)))+1))+1))+1,LEN(A1))
key :find() 用於識別 mid() 的開始/結束值。在這裡我們在 A1 文本中找到每個“,”和“”。
答案2
或者......你可以採取一種完全不同的方法。事實上,兩個。
一是運用FILTERXML()
技術。其中一個工作是將資料分成兩部分,「其餘部分」和最後一行。 「其餘部分」進入第一個輸出單元。 (我將在下面展示相當簡單的劃分片段的方法。)最後一行作為字串處理,用 HTML 標籤 ( </Something><Something>
) 替換逗號空格和空格,將字串半轉換為 HTML 字串,然後有前面加上開始標籤,後面加上結束標籤,進一步添加外部HTML 標籤來包裝所有這些。這是函數的實際輸入FILTERXML()
,其輸出是保存最後一行資訊的四個儲存格。
這比聽起來容易,而且如果時間接近的話,使用幾次後就會變得千篇一律。主要工作是將資料分成幾部分並準備它們。這是因為每個新用途似乎都有不同的資料打包方式。
除了練習後的千篇一律之外,它的一個優點是它「自然」地產生數組輸出,而不需要{CSE}
輸入 ( Ctrl-Shift-Enter)。另一個是,您可以按數字或使用[Last]
(並且可以使用字串技術建立該尋址元素)來選擇輸出元素,因此如果您可以指定它,則可以提取精確的位置資料。
另一種方法是使用Excel 4 Macro
名為 的(“E4M”)命令EVALUATE()
。您不能直接在儲存格公式中使用它,而必須建立一個命名範圍來儲存它。您可以在儲存格中建立呈現給它的內容,或將其全部計算到一個公式中,並將其放置在函數內的命名範圍內。無論什麼最適合您或最適合您的傾向。
無論如何,與 一樣FILTERXML()
,您必須準備輸入。這裡的區別在於,你用這種方式做的事情是非常熟悉的,而且一些小問題,漏掉逗號或打錯字,看起來「自然」並且相對容易找到。當FILTERXML()
一切看起來「錯誤」時,您將在一段時間內不熟悉輸出應該是什麼樣子,因此更容易犯錯誤,但更難發現錯誤。優勢,EVALUATE()
。
那麼,如何準備資料呢?您需要兩個區塊:您將提取並呈現的第一部分(我在上面稱為“其餘部分”)以及您想要以特殊方式工作的部分。然後在最後一部分中,您將建立一個字串,該字串看起來類似於 Excel 在其公式中內部產生的陣列類型。跨行顯示的資料可能看起來像{"a","b",1,"K"}
和為向下顯示列而創建的相同資料看起來像{"a";"b";1;"K"}
,當然,它們可以混合顯示在一系列列和行上。您希望建立一個像後者一樣的文件,並使用分號作為分隔符號。
但最後一行沒有任何分隔符號。你有“,”和“”。因此,首先,您將這一部分放入其中,SUBSTITUTE()
將“,”(“逗號空格”)更改為空格。現在您只有一個分隔符,可以使用 , 將其更改SUBSTITUTE()
為“;”你需要的。您還可以透過使用";"
而不是僅在所有元素周圍應用所需的大部分雙引號;
。事實上,由於 Excel 使用雙引號作為公式元素相當令人討厭,CHAR(34)
因此使用雙引號要容易得多。 「大多數」是因為您只能將它們添加到元素之間,並且SUBSTIITUTE()
仍然需要開始和結束雙引號。因此,您可以將它們與適當的花括號一起添加到開始和結束字串中。現在你有了一條合適的繩子,一條EVALUATE()
可以撕裂的繩子。
在單元格中建構它,一旦它起作用,創建命名範圍並將其全部放在EVALUATE()
括號內。您將在下面的公式中看到它的樣子。目前尚不清楚您的輸出相對於輸入資料將如何放置,因此我只使用了一個輸入下方的兩行,因此在 A1 中輸入,在 A2 和 A3 中輸出。您可以根據需要進行調整。因此,在命名範圍內:
=EVALUATE("{"&CHAR(34)&SUBSTITUTE(SUBSTITUTE(RIGHT(A1,LEN(A1)-MAX(IFERROR(FIND(CHAR(10),A1,SEQUENCE(1,LEN(A1))),""))),", "," ")," ",CHAR(34)&";"&CHAR(34))&CHAR(34)&"}")
SEQUENCE()
寫問題時可能已經可用。可能沒有。我使用它是為了簡單起見,因為畢竟我正在為搜尋問題但想要最新解決方案的人撰寫文章。然而,當時存在替代品,常見的替代品ROW(1:xxx)
要么是簡單的,要么是複雜的。
“白天”,可能需要輸入{CSE}
條目。
它完成了已經討論過的所有事情。
這裡的小要素是如何劃分輸入。每個問題都不同,但你的問題並不太難。輸入儲存格中的每一行都以Alt-Enter, 或結尾CHAR(10)
。因此,您可以使用「內容長度減去SUBSTITUTE()
刪除後內容的長度」技術來計算它們。然後你圍繞這個 aFIND()
做一些通常不做的事情:它使用“位置編號”參數(第三個)來獲取從 1 到輸入長度的值數組,這樣你就有了一個FIND()
s 數組,每個看起來都是一個進一步放入輸入中。當它遍歷輸入時,會產生下一個出現的值的數組,最後出現錯誤,因為最後一個出現之後還有內容。無法使用這些錯誤,因此IFERROR()
將其刪除。找到的最大數字是輸入的斷點,因此使用MAX()
來輸出它。然後你做兩個公式,其中一個LEFT()
是為了讓所有的事情變得簡單,只需將前幾行轉儲到適當的位置(無論多少,3,4,5,無論它可能是多少)。然後RIGHT()
輸入的長度減去這個斷點的輸入的a收集剩下的。這是函數的輸入EVALUATE()
。
與 一樣FILTERXML()
,這實際上非常簡單,因為無論您採取哪種方式,都必須對材料進行按摩。然後它就陷入了EVALUATE()
。