Vba Excel将数据分为不同的列

Vba Excel将数据分为不同的列,vba,excel,excel-formula,Vba,Excel,Excel Formula,我导入了一个Excel工作簿,其中包含24000个企业名称和地址。我不知道如何将它们分成不同的单元格,因为不存在逗号,而且一些企业的名称中有多个空格。下面是每列内容的示例。每行都在单独的一行中 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

我导入了一个Excel工作簿,其中包含24000个企业名称和地址。我不知道如何将它们分成不同的单元格,因为不存在逗号,而且一些企业的名称中有多个空格。下面是每列内容的示例。每行都在单独的一行中

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

一个简单的方法是使用数据选项卡下的`函数

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

现在,它将取一个单词,放在一个单元格中,然后取下一个单词(在空格之后),然后将它放在该单元格旁边的单元格中,以此类推

我看到的问题是,这不是一个一次性的解决方案。正如您所提到的,餐厅名称可以是一个单词,最多可以是无限个单词。除非你能从它的分布中看到一些逻辑,否则我认为这是你最好的选择


例如,如果我们从左到右阅读,遇到一个数字,那么这个数字就以地址开头,前面的所有文本都是餐厅名称,这是否安全。。。我真的很怀疑,如果我的餐厅被称为“布鲁斯21跳街餐厅”该怎么办?正如@Johankr所指出的,这种情况可能更为罕见,但如果您只是要运行宏、保存并关闭(无需任何人工检查),则应该意识到这种可能性。您可以获得一个主要城市、邮政编码等的列表,并使用该列表帮助解析地址,并确定地址的起始/结束位置。

如果所有联系人仅以字符串形式存在,即所有数据都位于同一单元格中,则没有任何解决方案能够正确拆分所有联系人

不过,这里有一些出发点,所有这些都是基于以下假设,即至少其余数据看起来相当相似

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

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


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

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

=REGEXEXTRACT(A1, "(\D*)\d")
=REGEXEXTRACT(A1, "\D+(\d+)\D*")
它将提取p&S熟食杂货店。然后,要获取数字,请使用:

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

它会给你730英镑。依此类推……

此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
子拆分地址()
将ws设置为工作表
变暗rng As范围
Dim oArr()作为变体
最后一排一样长
Dim spltstr()作为字符串
我想我会坚持多久
Dim j尽可能长
Dim h为布尔型
将ws=Sheets(“Sheet1”)更改为图纸名称。
lastrow=ws.Range(“A”&ws.Rows.Count).End(xlUp).Row
重划划桨(1到最后一排,1到5)
j=1
h=假
对于ws.范围内的每个rng(“A1:A”和lastrow)
spltstr=拆分(rng)
对于i=LBound(spltstr)至UBound(spltstr)
如果i=UBound(spltstr),则
oArr(j,5)=spltstr(i)
ElseIf i=UBound(spltstr)-1然后
oArr(j,4)=spltstr(i)
如果不是h和spltstr(i)=UCase(spltstr(i))和InStr(“1234567890”,左(spltstr(i),1))=0,则
oArr(j,1)=oArr(j,1)和spltstr(i)和“
ElseIf InStr(“1234567890”,左(spltstr(i),1))>0或(h和spltstr(i)=UCase(spltstr(i)),然后
h=真
oArr(j,2)=oArr(j,2)和spltstr(i)和“
ElseIf spltstr(i)UCase(spltstr(i))那么
oArr(j,3)=oArr(j,3)和spltstr(i)和“
如果结束
接下来我
桨(j,1)=纵倾(桨(j,1))
桨(j,2)=纵倾(桨(j,2))
桨(j,3)=纵倾(桨(j,3))
h=假
j=j+1
下一个rng
ws.Range(“B1”).Resize(lastrow,5)。Value=oArr
端接头

如果街道地址不以数字开头,它将不起作用。

  • 假设:城市总是=“纽约”;国家总是= “纽约”
  • 从第2行开始,将数据放在A列中
  • 在第1行的C列到L列中,键入数字0到9,其中每列 获取数字中的一个(0,1,2…9)
  • 将以下内容粘贴到单元格C2中:
    =IF(类型(FIND(C$1,$A2,1))=16,LEN($A2),FIND(C$1,$A2,1))
  • 选择并复制单元格C2,选择范围
    D2:L2
    ,然后粘贴复制的单元格 来自单元格B2的公式
  • 将以下内容粘贴到单元格B2中:
    =MIN(C2:L2)

  • 将以下内容粘贴到单元格M2中:
    =TRIM(MID(A2,1,B2-1))

  • 将以下内容粘贴到单元格N2中:
    =TRIM(MID(A2,B2,FIND)(“纽约_
    纽约”,A2,1)-1-B2))

  • 在O2单元格中键入“纽约”

  • 在单元格P2中键入“NY”

  • 将以下内容粘贴到单元格Q2中:
    =右侧(A2,5)

  • 接下来,选择复制范围B2:Q2,并将其粘贴到第B3行的末尾 数据


这就是“每列中的内容”?或者你的意思是它在一个单元格中?你可以使用
将它拆分,如果你愿意的话,将它们分别放在单独的单元格中。或者所有的名字都是第一个和最后一个?或者有中间名?所有条目是否都像示例一样大写,其中城市是正确的,名称和地址都是大写的?对不起,我应该澄清一下。我的意思是文本都在一列中,所以我想我需要在餐厅名称后的第一个数字处分开。我不知道该怎么做。我认为数字是最好的方法,但我不确定怎么做。@Gregory-有关如何按数字分割的想法,请参阅上的答案。这可能会更快,因为您可以将其设置为按数字拆分,并且手动操作的次数更少。请仔细阅读并告诉我你的想法。