Excel将数据分成不同的列

时间:2016-02-01 16:25:02

标签: excel vba excel-vba excel-formula

我有一个导入的Excel工作簿,有24,000个商家名称和地址。我无法弄清楚如何将它们分成不同的单元格,因为不存在逗号,并且一些企业在名称中有多个空格。以下是每列中的示例。每一行都在一个单独的行中。

P & S DELI GROCERY 730 COLUMBUS AVENUE New York NY 10025
ANGELIKA FILM CENTER 18 WEST HOUSTON STREET New York NY 10012
SHASHEMENE INT'L RESTAURA 195 EAST 56 STREET New York NY 11203
CARVEL ICE CREAM 1006 EAST 233 STREET New York NY 10466
LEXLER DELI 405 LEXINGTON AVENUE New York NY 10174
SNACK TIME GRILL 87-69 LEFFERTS BOULEVARD New York NY 11418
MITCHEL LONDON FOODS 22 EAST 65 STREET New York NY 10065
SPOON BREAD CATERING 364 WEST 110 STREET New York NY 10025
TERMINAL CAFE/YANKEE CLIPPER 0 GUARDIA AIRPORT PARKING New York NY 11371
PLAZA BAGELS & DELI 73 NEW DORP PLAZA New York NY 10306
B & M HOT BAGEL & GROCERY 203 GIFFORDS LANE New York NY 10308
TEXAS ROTISSERIE 94 FULTON STREET New York NY 10038

5 个答案:

答案 0 :(得分:0)

一种简单的方法是使用数据选项卡下的`Text to Columns功能。

突出显示要拆分的单元格,然后单击“文本到列”。选择分隔符,单击“下一步”,然后选择“空格”。

现在,它会接受一个字,把它放在一个单元格中,然后取下一个字(在一个空格之后),然后把它放在旁边的单元格中等等。

我预见的问题是这不是一次性解决方案。正如您所提到的,餐馆名称可以是一个单词,最多可达无穷大词。除非你看到它如何分散的逻辑,我认为这是你最好的选择。

例如,假设如果我们从左到右阅读并遇到一个数字,这个数字是否会启动地址,所有前面的文字是餐馆名称,这是否安全? ......我确实怀疑,如果我的餐厅被称为“Bruce's 21 Jump Street Eatery”怎么办?正如@Johankr指出的那样,这可能更为罕见,但如果您只是要运行宏,保存并关闭(没有任何人工审查),您应该意识到这种可能性。您可以获取主要城市,邮政编码等列表,并使用它来帮助解析并确定地址开始/结束的位置。

答案 1 :(得分:0)

如果所有联系人仅作为字符串存在,即同一单元格中的所有数据,则任何解决方案都无法正常拆分所有联系人。

以下是一些起点,都是基于其余数据至少看起来非常相似的假设。

  • 很少有企业可能在名称中包含数字,因此您可以使用数字的第一次出现作为名称和地址之间的分隔符来安全地拆分地址。

  • 为State和缩写创建一个查找表。应该可以使用它将字符串的地址部分分成两个部分/行。

答案 2 :(得分:0)

将其粘贴到Google电子表格中,然后使用正则表达式(REGEXEXTRACT)。

例如,在使用数字之前提取所有内容:

=REGEXEXTRACT(A1, "(\D*)\d")

它将提取P& S DELI GROCERY。然后使用数字:

=REGEXEXTRACT(A1, "\D+(\d+)\D*")

它会让你730.依此类推......

答案 3 :(得分:0)

这个vba应该适用于你想要的大部分内容:

Sub splitaddress()
Dim ws As Worksheet
Dim rng As Range
Dim oArr() As Variant
Dim lastrow As Long
Dim spltstr() As String
Dim i As Long
Dim j As Long
Dim h As Boolean

Set ws = Sheets("Sheet1")'Change to your sheet name.
lastrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
ReDim oArr(1 To lastrow, 1 To 5)
j = 1
h = False

For Each rng In ws.Range("A1:A" & lastrow)
    spltstr = Split(rng)
    For i = LBound(spltstr) To UBound(spltstr)
        If i = UBound(spltstr) Then
            oArr(j, 5) = spltstr(i)
        ElseIf i = UBound(spltstr) - 1 Then
            oArr(j, 4) = spltstr(i)
        ElseIf Not h And spltstr(i) = UCase(spltstr(i)) And InStr("1234567890", Left(spltstr(i), 1)) = 0 Then
            oArr(j, 1) = oArr(j, 1) & spltstr(i) & " "
        ElseIf InStr("1234567890", Left(spltstr(i), 1)) > 0 Or (h And spltstr(i) = UCase(spltstr(i))) Then
            h = True
            oArr(j, 2) = oArr(j, 2) & spltstr(i) & " "
        ElseIf spltstr(i) <> UCase(spltstr(i)) Then
            oArr(j, 3) = oArr(j, 3) & spltstr(i) & " "
        End If
    Next i
    oArr(j, 1) = Trim(oArr(j, 1))
    oArr(j, 2) = Trim(oArr(j, 2))
    oArr(j, 3) = Trim(oArr(j, 3))
    h = False
    j = j + 1
Next rng

ws.Range("B1").Resize(lastrow, 5).Value = oArr

End Sub

enter image description here

如果街道地址不以数字开头,则无效。

答案 4 :(得分:0)

  • Assumptions: The City is always = "New York"; the State is always = "NY".
  • Place your data in column A starting at row 2.
  • In columns C thru L, at row 1, type numbers 0 to 9, where each column gets 1 of the digits (0,1,2 ... 9).
  • Paste the following into cell C2:
    =IF(TYPE(FIND(C$1,$A2,1))=16,LEN($A2),FIND(C$1,$A2,1))
  • Select and copy cell C2, select range D2:L2 and paste the copied formula from cell B2.
  • Paste the following into cell B2: =MIN(C2:L2)

  • Paste the following into cell M2: =TRIM(MID(A2,1,B2-1))

  • Paste the following into cell N2: =TRIM(MID(A2,B2,FIND("New York_ NY",A2,1)-1-B2))

  • Type "New York" in cell O2.

  • Type "NY" in cell P2.

  • Paste the following into cell Q2: =RIGHT(A2,5)

  • Next select copy range B2:Q2 and paste it in rows B3 to end of your data.