Search code examples
excelvbastreet-address

Splitting address, city, state, and zip, lacking delimiters, in excel


I have an excel spreadsheet that contains entire addresses packed in a single cell without delimiters. The addresses look like this:

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 

So the first five cells in column A would contain the above addresses.

As you can see, some of the cities consist of two words but the state is always FL or NY. All I need to do is separate the address, city, state, and zip in their own columns. I'm hoping there's a way to do this in VBD (Visual Basic for Developers) in excel. So I can put it into a macro.

I have an idea of how it can be done, but my VBD is limited:

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

For example, another programming language you might do something like this:

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);
    }
}

Thanks for any response.


Solution

  • It seems that if you have to type out all the cities, you might as well just split all the cells manually. It may be easier to identify all the street types and use that as a delimiter. Note the spaces around the strings in the array.

    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