是否有一种更优雅的公式/方法来编写宏行以重新格式化VBA / excel中的地址?

问题描述 投票:1回答:1

我是VBA的新手,请多多包涵。我最近建立了一个宏,用于将来自csv(定期从在线捐赠平台下载)的捐赠者和捐赠数据重新格式化为可导入到我们的主数据库中的格式。

因此,我正在处理真正令人讨厌的“人”数据,例如地址,电话号码,姓名等,这是由于csv下载中的数据是由捐助者自己输入的事实而变得更加令人讨厌。

我写了一个very long公式(如下所示),该公式旨在修复addresses的格式(以我的最大能力),但是我在想更简洁(*〜elegant〜*)的方式专门使用vba函数而不是excel编写它。

到目前为止,我一直在使用公式的文本输入(下面的示例;我定义了[[Lastrow,并且希望公式在此停止,此方法似乎更容易一些)),但是,我我们已经看到了反对这种方法的建议,所以我愿意为这个怪物更改它。

Range("F2:F" & Lastrow).Formula = "=PROPER(TRIM(M2))"
由于以下原因该公式的长度爆炸:

    [街道地址有2列需要合并到一种用于导入格式。我使用了TEXTJOIN()。然而...
    • 如果第二列是公寓,套房等,则分隔符应为逗号和空格“,”
  • 如果第一列是建筑物名称,第二列是街道地址,则分隔符应为回车符CHAR(10)。
  • 第二件事是大写(因为人们以时髦的方式输入自己的地址)。我使用了PROPER()公式。但是,有些细微差别
    • 具有NE,NW,SW和SE的街道最终出错:Ne,Nw,Sw和Se
  • 具有第1,第2,第3,第4等的街道最终会出错:1St,2Nd,3Rd,4Th等。一步是让我怀疑这是否是最好的方法-这就是为什么我要发布此信息)。
  • IFS( AND( OR( LEFT(U2,1)=""#"", LEFT(U2,3)=""apt"", LEFT(U2,9)=""apartment"", LEFT(U2,4)=""bldg"", LEFT(U2,8)=""building"", LEFT(U2,2)=""fl"", ISNUMBER(FIND("" fl"",U2)), ISNUMBER(FIND("" floor"",U2)), LEFT(U2,5)=""floor"", LEFT(U2,3)=""ste"", LEFT(U2,5)=""suite"", LEFT(U2,4)=""unit"", LEFT(U2,2)=""rm"", LEFT(U2,4)=""room"" ), OR( RIGHT(T2,3)="" NW"", RIGHT(T2,3)="" Nw"", RIGHT(T2,3)="" nw"", ISNUMBER(FIND("" NW "",T2)), ISNUMBER(FIND("" Nw "",T2)), ISNUMBER(FIND("" nw "",T2)) ) ), SUBSTITUTE(PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),""Nw"",""NW""), AND( OR( LEFT(U2,1)=""#"", LEFT(U2,3)=""apt"", LEFT(U2,9)=""apartment"", LEFT(U2,4)=""bldg"", LEFT(U2,8)=""building"", LEFT(U2,2)=""fl"", ISNUMBER(FIND("" fl"",U2)), ISNUMBER(FIND("" floor"",U2)), LEFT(U2,5)=""floor"", LEFT(U2,3)=""ste"", LEFT(U2,5)=""suite"", LEFT(U2,4)=""unit"", LEFT(U2,2)=""rm"", LEFT(U2,4)=""room"" ), OR( RIGHT(T2,3)="" NE"", RIGHT(T2,3)="" Ne"", RIGHT(T2,3)="" ne"", ISNUMBER(FIND("" NE "",T2)), ISNUMBER(FIND("" Ne "",T2)), ISNUMBER(FIND("" ne "",T2)) ) ), SUBSTITUTE(PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),""Ne"",""NE""), AND( OR( LEFT(U2,1)=""#"", LEFT(U2,3)=""apt"", LEFT(U2,9)=""apartment"", LEFT(U2,4)=""bldg"", LEFT(U2,8)=""building"", LEFT(U2,2)=""fl"", ISNUMBER(FIND("" fl"",U2)), ISNUMBER(FIND("" floor"",U2)), LEFT(U2,5)=""floor"", LEFT(U2,3)=""ste"", LEFT(U2,5)=""suite"", LEFT(U2,4)=""unit"", LEFT(U2,2)=""rm"", LEFT(U2,4)=""room"" ), OR( RIGHT(T2,3)="" SW"", RIGHT(T2,3)="" Sw"", RIGHT(T2,3)="" sw"", ISNUMBER(FIND("" SW "",T2)), ISNUMBER(FIND("" Sw "",T2)), ISNUMBER(FIND("" sw "",T2)) ) ), SUBSTITUTE(PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),""Sw"",""SW""), AND( OR( LEFT(U2,1)=""#"", LEFT(U2,3)=""apt"", LEFT(U2,9)=""apartment"", LEFT(U2,4)=""bldg"", LEFT(U2,8)=""building"", LEFT(U2,2)=""fl"", ISNUMBER(FIND("" fl"",U2)), ISNUMBER(FIND("" floor"",U2)), LEFT(U2,5)=""floor"", LEFT(U2,3)=""ste"", LEFT(U2,5)=""suite"", LEFT(U2,4)=""unit"", LEFT(U2,2)=""rm"", LEFT(U2,4)=""room"" ), OR( RIGHT(T2,3)="" SE"", RIGHT(T2,3)="" Se"", RIGHT(T2,3)="" se"", ISNUMBER(FIND("" SE "",T2)), ISNUMBER(FIND("" Se "",T2)), ISNUMBER(FIND("" se "",T2)) ) ), SUBSTITUTE(PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),""Se"",""SE""), OR( LEFT(U2,1)=""#"", LEFT(U2,3)=""apt"", LEFT(U2,9)=""apartment"", LEFT(U2,4)=""bldg"", LEFT(U2,8)=""building"", LEFT(U2,2)=""fl"", ISNUMBER(FIND("" fl"",U2)), ISNUMBER(FIND("" floor"",U2)), LEFT(U2,5)=""floor"", LEFT(U2,3)=""ste"", LEFT(U2,5)=""suite"", LEFT(U2,4)=""unit"", LEFT(U2,2)=""rm"", LEFT(U2,4)=""room"" ), PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))), OR( RIGHT(T2,3)="" NW"", RIGHT(T2,3)="" Nw"", RIGHT(T2,3)="" nw"", ISNUMBER(FIND("" NW "",T2)), ISNUMBER(FIND("" Nw "",T2)), ISNUMBER(FIND("" nw "",T2)) ), SUBSTITUTE(PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))),""Nw"",""NW""), OR( RIGHT(T2,3)="" NE"", RIGHT(T2,3)="" Ne"", RIGHT(T2,3)="" ne"", ISNUMBER(FIND("" NE "",T2)), ISNUMBER(FIND("" Ne "",T2)), ISNUMBER(FIND("" ne "",T2)) ), SUBSTITUTE(PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))),""Ne"",""NE""), OR( RIGHT(T2,3)="" SW"", RIGHT(T2,3)="" Sw"", RIGHT(T2,3)="" sw"", ISNUMBER(FIND("" SW "",T2)), ISNUMBER(FIND("" Sw "",T2)), ISNUMBER(FIND("" sw "",T2)) ), SUBSTITUTE(PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))),""Sw"",""SW""), OR( RIGHT(T2,3)="" SE"", RIGHT(T2,3)="" Se"", RIGHT(T2,3)="" se"", ISNUMBER(FIND("" SE "",T2)), ISNUMBER(FIND("" Se "",T2)), ISNUMBER(FIND("" se "",T2)) ), SUBSTITUTE(PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))),""Se"",""SE""), TRUE, PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))) )
  • excel vba excel-formula crm
    1个回答
    0
    投票
    以上评论者建议使用Google地理编码API进行地址标准化。由于两个原因,这将无法工作:

    Google不遵守任何特定的地址标准(例如USPS)。他们的地址是碰巧的任何格式。标准与它无关。

      Google明确禁止存储地理编码结果,或将其用于除在Google地图上显示以外的任何目的。
  • 我工作的公司提供称为YAddress的地址标准化API。它遵循USPS的地址格式标准,并且对数据使用没有许可限制。它还可以对地址文件进行批处理(您提到您的数据源自csv文件)。
  • © www.soinside.com 2019 - 2024. All rights reserved.