【问题标题】:In Excel using VBA how do I split multiple values seperated by different seperators (ie: commas, colons, etc)在使用 VBA 的 Excel 中,如何拆分由不同分隔符分隔的多个值(即:逗号、冒号等)
【发布时间】:2017-11-01 22:10:20
【问题描述】:

我正在将网络上的数据提取到 Excel 电子表格中。所有数据都列在 Sheet1 的 A 列中。例如:

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 上列表中的下一个人,到目前为止效果很好。但是,为简化起见,是否可以将此代码转换为也用逗号分隔名称,与许可证字段相同,但用连字符?

提前致谢!

【问题讨论】:

  • 在 ary(1) 上再做一次拆分
  • 不要为第一个事件拆分,而是使用Like。前任。 If v Like "Name*" then... 然后你就可以从冒号拆分了。

标签: vba excel split


【解决方案1】:

您可以进行另一个拆分 - 因为没有逗号,所以不确定名称 - 但要获得许可证。按照@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

【讨论】:

  • 您应该添加一个检查以确保有连字符或逗号
【解决方案2】:

不确定您是否想要将名字和姓氏分开,因为您想拆分它,但如果是这种情况,您可以在下面更改'YourRange。您不需要将原始字符串拆分为数组,只需使用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,您会将整个字符串 prior 返回到第一个分隔符。同样,i = 1 将返回第一个分隔符之后的整个字符串,i = 2 将返回第二个分隔符之后的所有内容,依此类推。

【讨论】:

  • 非常感谢,这很好用!我做过/打算分开名字和姓氏,谢谢你在回答中包含这个。但是,我现在正在努力分离中间的首字母(如果存在的话)。这不是什么大问题,我可以留下中间的首字母,但为了我的启迪,我将如何实现这种分裂?中间名首字母与姓氏之间用空格隔开,并始终以句点结尾。例如:“约翰·史密斯 A.”
  • 您可以对名字进行另一个拆分,使用空格 " " 作为分隔符。您甚至可以使用If Len() = 1 检查以验证它的初始值。我忘记添加关于拆分后 (1) 的用途的解释,因此我将更新答案以添加一些解释。
  • 完美,这是一个很好的帮助和很好的解释。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2010-11-06
  • 1970-01-01
相关资源
最近更新 更多