我在这个Excel SEARCH()函数中错过了什么来使它达到我想要的效果?

时间:2011-11-27 17:12:36

标签: excel excel-2007 excel-formula worksheet-function

我甚至不知道这个问题是属于这个问题还是属于另一个StackExchange网站,所以如果我是错误的话,请原谅。

我使用Excel对地址进行规范化,这样一旦完成,我就可以将它们插入到准备好的数据库中。

让我们快速获取一些地址(虚构):

1. 340       | 1st Street       | MyCity
2. 2-648     | 2nd Avenue       | AnotherCity
3. 102-648   | 2nd Avenue       | MyCity
4. 8A-605    | Wilson Boulevard | MyCity
5. A45C-103¼ | Hunting Crescent | MyCity

我想用Excel公式实现的目标如下:

new Address() { StreetNumber=340, NumberSuffix=(NumberSuffixes)0, Street=streets.Single(s => s.Name == "1st Street"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=648, NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt="2", Street=streets.Single)s => s.Name == "2nd Avenue"), City=cities.Single(c => c.Name == "AnotherCity") }
, new Address() { StreetNumber=648, NumberSuffix=(NumberSuffixes)0, UniteSuiteAppt="102", Street=streets.Single(s => s.Name == "2nd Avenue"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=605, NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt="8A", Street=streets.Single(s => s.Name == "Wilson Boulevard"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=103, NumberSuffix=(NumberSuffixes)1, UnitSuiteAppt="A45C", Street=streets.Single(s => s.Name == "Hunting Crescent"), City=cities.Single(c => c.Name == "MyCity") }

到目前为止,我的实际Excel公式如下所示:

=CONCATENATE("new Address() { StreetNumber=", RIGHT($D499, LEN($D499)-SEARCH("-",$D499)), ", NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt=""", LEFT($D499, LEN($D499)-SEARCH("-",$D499)-2), """, Street = streetsOfShawinigan.Single(s => s.Name == """, $E499, """), City = cities.Single(c => c.Name == ""Shawinigan"") }")

我面临的问题是公式的这一部分:

[...]UnitSuiteAppt=""", LEFT($D499, LEN($D499)-SEARCH("-",$D499)-2), """[...]

似乎SEARCH()从一行到另一行的工作方式不同,因为它对于给定的行无法正常工作,而对另一行则无法正常工作。例如,它可以返回:

for 2nd address:    [...]UnitSuiteAppt="2-"[...]
for third address:  [...]UnitSuiteAppt="1"[...]
for fourth address: [...]UnitSuiteAppt="8A"[...]
for fifth address:  [...]UnitSuiteAppt="A45"[...]

这只是说我想让它在破折号字符之前的第一部分UnitSuiteAppt字符串值,而后面​​的部分是强制性的StreetNumber。第一部分,即该公寓所说的,长度可变。因此,我需要更改有时-2的{​​{1}},有时更改-1,这似乎取决于地址公寓部分的长度,这很有意义, 毕竟。我的观点是SEARCH()总是会返回" - "的索引,因此,它似乎总是无法正常工作,否则,我就没有#&#但是我完全理解它是如何工作的,我怀疑这是认真的。 ; - )

感谢任何帮助。

提前感谢您的宝贵时间!

  

修改

我希望包括完整的通用解决方案,Rachel帮助我找到了非常有用和精确的答案。所以,这是完整的公式。

-3

1 个答案:

答案 0 :(得分:1)

要获取UnitSuiteAppt,请使用:LEFT($D499,IFERROR(SEARCH("-",$D499),20)-1)

要获取StreeNumber,请使用:MID($D499,IFERROR(SEARCH("-",$D499),20)+1,20)

注意:值20是默认值,即搜索值的最大长度。