我在一个单元格中有地址,我想将它们提取到同一行的不同单元格中。有些单元格有四行地址,有些只有三行。我可以轻松地使用文本到列和各种分隔符来拆分三行地址,但无法拆分四行地址。
在第一个例子中,我有四行,第二个例子中有三行
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))
关键: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}
entry输入。
它可以完成之前讨论过的所有事情。
这里的小元素是如何划分输入。每个问题都不同,但你的问题不是太难。输入单元格中的每一行都以Alt-Enter、 或结尾CHAR(10)
。因此,您可以使用“内容长度减去SUBSTITUTE()
删除它们后内容的长度”技术对它们进行计数。然后,您将它包装起来,FIND()
它会做一些通常不做的事情:它使用“位置编号”参数(第三个参数)获取从 1 到输入长度的值数组,因此您有一个数组,FIND()
每个数组都查看输入中的下一个位置。这会产生一个数组,其中包含下一个出现的值,因为它在输入中经过,最后会出现错误,因为最后一个之后还有东西。无法使用这些错误,因此IFERROR()
将它们清空。找到的最高数字是输入的断点,因此使用MAX()
它来输出它。然后你做两个公式,一个LEFT()
那么多字符的公式,以获得所有简单的,只需将前几行(无论多少,3、4、5,无论它有多少)转储到位。然后RIGHT()
输入的长度减去这个断点的输入收集其余部分。这是该函数的输入EVALUATE()
。
就像 一样FILTERXML()
,这实际上非常简单,因为无论你朝哪个方向走,都必须按摩材料。然后它就会掉进EVALUATE()
。