在excel中分割地址,城市,州和邮编,缺less分隔符

我有一个Excel电子表格,其中包含整个地址打包在一个没有分隔符的单元格。 地址如下所示:

2701 NW 64TH TER MARGATE FL 33063-1703 901 NE 8 ST HALLANDALE BEACH FL 33009-2626 1840 DEWEY ST UNIT 305 HOLLYWOOD FL 33020 3049 NE 4 AVE WILTON MANORS FL 33334-2047 650 NE 56 CT OAKLAND PARK FL 33334-3528 

因此,列A中的前五个单元格将包含上述地址。

正如你所看到的,一些城市由两个字组成,但状态总是FL或NY。 我所需要做的就是将地址,城市,州和邮政编码分开。 我希望有一种方法可以在VBD(Visual Basic for Developers)中在Excel中执行此操作。 所以我可以把它放入一个macros。

我有一个想法如何做,但我的VBD是有限的:

 stateArray = Split("FL, NY") cityArray = Split("Fort Lauderdale","Sunrise","Oakland Park") 

例如,另一种编程语言,你可能会这样做:

 var arrStates, arrCities arrCities = ["Fort Lauderdale", "Sunrise", "Oakland Park"] arrStates = ["FL", "NY"] var findAddress = function(curCity, curState){ for(var i=0; i < arrCities.length; i < arrStates.length; i--){ (arrCities[i] == curCity) ? arrCities[i] = CurCity : arrCities[i] = null; (arrStates[i] == curState) ? arrStates[i] = curState : arrStates[i] = null; } if(arrCities[i] >= 0){ var city = arrCities[i]; } if(arrStates[i] >= 0){ var state = arrStates[i]; } createTable(city, state); } var createTable = function(city, state){ var tbl = document.createElement("Table"); var newRow = document.createElement("tr"); tbl.appendChild(newRow); cols = [city, state]; for(var i=0; i < cols.length; i++){ var newCol = document.createElement("td"); newCol.innerText = cols[i]; newRow.appendChild(newCol); } } 

感谢您的任何回应。

看起来,如果你必须input所有的城市,你也可以手动分割所有的单元格。 识别所有街道types并将其用作分隔符可能更容易。 请注意数组中string周围的空格。

 Sub SplitAddresses() Dim vaStates As Variant Dim vaStreets As Variant Dim i As Long Dim rCell As Range Dim sAddress As String Dim sCity As String, sState As String Dim sZip As String Dim lStreetPos As Long, lStatePos As Long vaStates = Array(" FL ", " NY ") vaStreets = Array(" TER ", " ST ", " AVE ", " CT ") For Each rCell In Sheet1.Range("A1:A5").Cells sAddress = "": sCity = "": sZip = "": sState = "" For i = LBound(vaStreets) To UBound(vaStreets) lStreetPos = InStr(1, rCell.Value, vaStreets(i)) If lStreetPos > 0 Then sAddress = Trim(Left$(rCell.Value, lStreetPos + Len(vaStreets(i)) - 1)) Exit For End If Next i For i = LBound(vaStates) To UBound(vaStates) lStatePos = InStr(1, rCell.Value, vaStates(i)) If lStatePos > 0 Then sCity = Trim(Mid$(rCell.Value, Len(sAddress) + 1, lStatePos - Len(sAddress) - 1)) sState = Trim(Mid$(rCell.Value, lStatePos + 1, Len(vaStates(i)) - 1)) sZip = Trim(Mid$(rCell.Value, lStatePos + Len(vaStates(i)), Len(rCell.Value))) Exit For End If Next i rCell.Offset(0, 1).Value = "'" & sAddress rCell.Offset(0, 2).Value = "'" & sCity rCell.Offset(0, 3).Value = "'" & sState rCell.Offset(0, 4).Value = "'" & sZip Next rCell End Sub 

下面是一些VBA代码,让你开始:你需要添加error handling

 Option Explicit Option Compare Text Sub SplitAddress() Dim vStates As Variant Dim vCities As Variant Dim vInput As Variant Dim vAddress() As Variant Dim j As Long Dim str1 As String ' States/Cities/Inputs are named ranges containing the data vStates = [States] vCities = [Cities] vInput = [Inputs] ReDim vAddress(1 To UBound(vInput) - LBound(vInput) + 1, 1 To 4) For j = 1 To UBound(vInput) str1 = Trim(CStr(vInput(j, 1))) If Len(str1) = 0 Then Exit For FindSplit j, 3, str1, vStates, vAddress() FindSplit j, 2, str1, vCities, vAddress() Next j ActiveSheet.Range("A2").Resize(UBound(vAddress), UBound(vAddress, 2)) = vAddress End Sub Sub FindSplit(j As Long, k As Long, str1 As String, vItems As Variant, vAddress() As Variant) Dim iPos As Long Dim jItem As Long Dim strItem As String For jItem = 1 To UBound(vItems) strItem = Trim(CStr(vItems(jItem, 1))) iPos = InStr(str1, " " & strItem & " ") If iPos > 0 Then vAddress(j, k) = Mid(str1, iPos + 1, Len(strItem)) If k = 3 Then vAddress(j, k + 1) = Right(str1, Len(str1) - (iPos + 3)) str1 = Left(str1, iPos) Else vAddress(j, 1) = Left(str1, iPos - 1) End If Exit For End If Next jItem End Sub 

在这样的情况下,我试着忘记自己正在编程,只要想一下我会用什么样的思维过程来弄清楚每个事情是正常的。

 2701 NW 64TH TER MARGATE FL 33063-1703 901 NE 8 ST HALLANDALE BEACH FL 33009-2626 1840 DEWEY ST UNIT 305 HOLLYWOOD FL 33020 3049 NE 4 AVE WILTON MANORS FL 33334-2047 650 NE 56 CT OAKLAND PARK FL 33334-3528 

第一件事可能看起来很忙碌,但是如果你仔细观察,就会出现模式。

  1. 这些地址都以一组#作为街道地址的开始
  2. 街道地址总是以街道types缩写结尾
  3. 如果有一个单位的build筑物在街道地址之后
  4. 地址全部以邮政编码结尾
  5. 在邮政编码之前是州的缩写
  6. 如果一切都被剥离了,城市的名字是轻拍在中间。

这使得模式如下

 Street # : Street Type : Unit {Optional} : City : State: Zip Code 

使用string函数从临时stringvariables中剥离每个部分,您应该能够相当容易地重build它。

希望有所帮助。