在使用VBA的Excel中,如何拆分多个由不同分隔符(即:逗号、冒号等)分隔的值

在使用VBA的Excel中,如何拆分多个由不同分隔符(即:逗号、冒号等)分隔的值,vba,excel,split,Vba,Excel,Split,我正在将数据从web拉入excel电子表格。所有数据都列在A列,表1中。例: Name: Smith John A. License: General - Master License Status: Active City/State: Anytown, USA County: Thatoneyouknow Contact Information Cell Phone: (555) 555-555 Email Address: johnsmith@johnsmith.com R

我正在将数据从web拉入excel电子表格。所有数据都列在A列,表1中。例:

Name: Smith John A.

License: General - Master

License Status: Active

City/State: Anytown, USA

County: Thatoneyouknow

Contact Information

Cell Phone: (555) 555-555

Email Address: johnsmith@johnsmith.com

Region: One

Ever Been Disciplined?: No

Notes: None
然后它会为下一个人重复类似的信息,等等

我已经能够通过冒号分割文本,冒号使用以下代码分隔数据:

Sub DataReOrganizer()
Dim s1, s2 As Worksheet
Dim Cook, i, K As Long
Dim v As String
Set s1 = Sheets("Sheet1")
Set s2 = Sheets("Sheet2")
Cook = s1.Cells(Rows.Count, "A").End(xlUp).Row
K = 2
For i = 1 To Cook
      v = s1.Cells(i, "A").Text
      If v = "Contact Information" Then
          K = K + 1
      Else
          ary = Split(v, ": ")
          If ary(0) = "Name" Then s2.Cells(K, 1) = ary(1)
          If ary(0) = "License" Then s2.Cells(K, 2) = ary(1)
          If ary(0) = "License Status" Then s2.Cells(K, 3) = ary(1)
          If ary(0) = "City/State" Then s2.Cells(K, 4) = ary(1)
          If ary(0) = "County" Then s2.Cells(K, 5) = ary(1)
          If ary(0) = "Home Phone" Then s2.Cells(K, 6) = ary(1)
          If ary(0) = "Work Phone" Then s2.Cells(K, 7) = ary(1)
          If ary(0) = "Cell Phone" Then s2.Cells(K, 8) = ary(1)
          If ary(0) = "Email Address" Then s2.Cells(K, 9) = ary(1)
          If ary(0) = "Region" Then s2.Cells(K, 10) = ary(1)
          If ary(0) = "Ever Been Disciplined?" Then s2.Cells(K, 11) = ary(1)
          If ary(0) = "Note" Then s2.Cells(K, 12) = ary(1)
      End If
    Next I
End Sub
到目前为止,通过获取数据,将值分成不同的列,每一新行作为sheet2列表中的下一个人,这种方法效果很好。但是,为了简化,是否可以将此代码转换为使用逗号分隔名称,与许可证字段相同,但使用连字符分隔名称


提前谢谢

您可以进行另一次拆分-不确定名称,因为没有逗号-但用于许可证。根据@Sorceri的建议,合并检查连字符是否存在。严格地说,你也应该对冒号这样做

  If ary(0) = "License" Then
     s2.Cells(K, 2) = Split(ary(1), "-")(0)        
     If InStr(ary(1), "-") > 0 Then
        s2.Cells(K, 3) = Split(ary(1), "-")(1)
    End If
  End If

您可以进行另一次拆分-不确定名称,因为没有逗号-但用于许可证。根据@Sorceri的建议,合并检查连字符是否存在。严格地说,你也应该对冒号这样做

  If ary(0) = "License" Then
     s2.Cells(K, 2) = Split(ary(1), "-")(0)        
     If InStr(ary(1), "-") > 0 Then
        s2.Cells(K, 3) = Split(ary(1), "-")(1)
    End If
  End If

不确定您是否希望为名字和姓氏使用单独的单元格,因为您希望将其拆分,但如果是这种情况,您可以在下面更改您的范围。不需要将原始字符串拆分为数组,只需使用
Like
,以及通配符
*

Sub DataReOrganizer()

    Dim s1, s2 As Worksheet
    Dim Cook, i, K As Long
    Dim v As String
    Set s1 = Sheets("Sheet1")
    Set s2 = Sheets("Sheet2")
    Cook = s1.Cells(Rows.Count, "A").End(xlUp).Row
    K = 2
    For i = 1 To Cook
        v = s1.Cells(i, "A").text
        If v = "Contact Information" Then
            K = K + 1
        Else
            If v Like "Name:*" Then
                'YourRange = Split(Split(v, ":")(1), ",")(0)    'Last Name
                s2.Cells(K, 1) = Split(v, ",")(1)               'First Name
            End If
            If v Like "License:*" Then s2.Cells(K, 2) = Split(v, "-")(1)
            If v Like "License Status:*" Then s2.Cells(K, 3) = Split(v, ":")(1)
            If v Like "City/State:*" Then s2.Cells(K, 4) = Split(v, ":")(1)
            If v Like "County:*" Then s2.Cells(K, 5) = Split(v, ":")(1)
            If v Like "Home Phone:*" Then s2.Cells(K, 6) = Split(v, ":")(1)
            If v Like "Work Phone:*" Then s2.Cells(K, 7) = Split(v, ":")(1)
            If v Like "Cell Phone:*" Then s2.Cells(K, 8) = Split(v, ":")(1)
            If v Like "Email Address:*" Then s2.Cells(K, 9) = Split(v, ":")(1)
            If v Like "Region:*" Then s2.Cells(K, 10) = Split(v, ":")(1)
            If v Like "Ever Been Disciplined?:*" Then s2.Cells(K, 11) = Split(v, ":")(1)
            If v Like "Note:*" Then s2.Cells(K, 12) = Split(v, ":")(1)
        End If
    Next i

End Sub

使用
Split()
时,您有几个选项。通常,它用于将拆分添加到数组中,就像您所做的那样。但是您可以完全跳过数组,通过在拆分的末尾添加
(i)
返回单个字符串。例如,如果
i=0
,则返回第一个分隔符之前的整个字符串。类似地,
i=1
将返回第一个分隔符后的整个字符串,
i=2
将返回第二个分隔符后的所有内容,依此类推。

不确定您是否希望将名字和姓氏分开,因为您希望拆分它,但如果是这样,您可以在下面更改您的范围。不需要将原始字符串拆分为数组,只需使用
Like
,以及通配符
*

Sub DataReOrganizer()

    Dim s1, s2 As Worksheet
    Dim Cook, i, K As Long
    Dim v As String
    Set s1 = Sheets("Sheet1")
    Set s2 = Sheets("Sheet2")
    Cook = s1.Cells(Rows.Count, "A").End(xlUp).Row
    K = 2
    For i = 1 To Cook
        v = s1.Cells(i, "A").text
        If v = "Contact Information" Then
            K = K + 1
        Else
            If v Like "Name:*" Then
                'YourRange = Split(Split(v, ":")(1), ",")(0)    'Last Name
                s2.Cells(K, 1) = Split(v, ",")(1)               'First Name
            End If
            If v Like "License:*" Then s2.Cells(K, 2) = Split(v, "-")(1)
            If v Like "License Status:*" Then s2.Cells(K, 3) = Split(v, ":")(1)
            If v Like "City/State:*" Then s2.Cells(K, 4) = Split(v, ":")(1)
            If v Like "County:*" Then s2.Cells(K, 5) = Split(v, ":")(1)
            If v Like "Home Phone:*" Then s2.Cells(K, 6) = Split(v, ":")(1)
            If v Like "Work Phone:*" Then s2.Cells(K, 7) = Split(v, ":")(1)
            If v Like "Cell Phone:*" Then s2.Cells(K, 8) = Split(v, ":")(1)
            If v Like "Email Address:*" Then s2.Cells(K, 9) = Split(v, ":")(1)
            If v Like "Region:*" Then s2.Cells(K, 10) = Split(v, ":")(1)
            If v Like "Ever Been Disciplined?:*" Then s2.Cells(K, 11) = Split(v, ":")(1)
            If v Like "Note:*" Then s2.Cells(K, 12) = Split(v, ":")(1)
        End If
    Next i

End Sub

使用
Split()
时,您有几个选项。通常,它用于将拆分添加到数组中,就像您所做的那样。但是您可以完全跳过数组,通过在拆分的末尾添加
(i)
返回单个字符串。例如,如果
i=0
,则返回第一个分隔符之前的整个字符串。类似地,
i=1
将返回第一个分隔符后的整个字符串,
i=2
将返回第二个分隔符后的所有内容,依此类推。

只需在第(1)位执行另一次拆分,而不是对第一个事件进行拆分,使用
类似的方法。例如,如果v喜欢“Name*”,那么。。。然后可以从冒号拆分。只需在ary(1)上执行另一次拆分,而不是对第一个事件进行拆分,使用类似于
。例如,如果v喜欢“Name*”,那么。。。然后可以从冒号中拆分。您应该添加一个检查以确保有连字符或逗号。您应该添加一个检查以确保有连字符或逗号。非常感谢,这非常有效!我确实/打算把名字和姓氏分开,谢谢你在回答中包括这一点。然而,我现在正在努力分离中间的首字母(如果存在的话)。这不是一个大问题,我可以保留中间的首字母,但为了我的启发,我如何实现这一分割?中间的首字母与姓氏之间用空格隔开,并始终以句号结尾。例如:“John Smith A.”您可以使用空格
作为分隔符,对名字进行另一次拆分。如果Len()=1
,您甚至可以使用
检查以验证它的首字母。我忘了添加关于拆分后(1)的解释,所以我将更新答案以添加一些解释。太好了,这是一个非常好的帮助和解释。我感谢你的帮助!非常感谢,这很有效!我确实/打算把名字和姓氏分开,谢谢你在回答中包括这一点。然而,我现在正在努力分离中间的首字母(如果存在的话)。这不是一个大问题,我可以保留中间的首字母,但为了我的启发,我如何实现这一分割?中间的首字母与姓氏之间用空格隔开,并始终以句号结尾。例如:“John Smith A.”您可以使用空格
作为分隔符,对名字进行另一次拆分。如果Len()=1
,您甚至可以使用
检查以验证它的首字母。我忘了添加关于拆分后(1)的解释,所以我将更新答案以添加一些解释。太好了,这是一个非常好的帮助和解释。我感谢你的帮助!