【问题标题】:VBA Complex multi delimiter splitVBA 复杂多分隔符拆分
【发布时间】:2014-10-29 19:54:22
【问题描述】:

我需要在 VBA excel 中进行复杂的拆分。我有一列单元格包含这样的字符串:

Name1 (10%), Name2 (50%), Name3, Name4 (40%)

我需要拆分此字符串并将每个值返回到工作表上不相邻的特定单元格。示例:

Name1  - Cell B1
10%    - Cell C1
Name2  - Cell M1
50%    - Cell N1
Name3  - Cell X1
(blank)- Cell Y1
Name4  - Cell AD1
40%    - Cell AE1

我想出解决方案的主要问题是字符串可以是任意长度。

它们可能包含:

1-10 个名字,

每个名称可能可能不后面都有一个百分比

我仍在进行研究和测试,但找不到真正可行的解决方案。任何想法将不胜感激

【问题讨论】:

  • 哪里需要拆分,需要去掉%这个数字吗?
  • 为什么不能用逗号分割?然后,如果需要,如果您还需要删除百分比分数,您可以使用其他功能(想到 Left...)。
  • 否则是的,请说明您需要将其拆分的位置,然后说明您要如何处理它。正如目前所说,目前还不清楚你打算做什么。
  • 似乎不乏愿意提供帮助的人。这里有一些潜在的简单点!
  • 我在问题中添加了我希望的效果示例。抱歉不清楚。

标签: vba excel split delimiter


【解决方案1】:

这是一种方法

Sub SplitNames()

    Dim vaNames As Variant
    Dim vaPct As Variant
    Dim i As Long

    'split on comma
    vaNames = Split("Name1 (10%), Name2(50%), Name3, Name4(40%)", ",")

    'loop through the name/pct pairs
    For i = LBound(vaNames) To UBound(vaNames)
        'split each on open paren
        vaPct = Split(vaNames(i), "(")

        'Write the name to a cell
        Sheet1.Range("A1").Offset(0, (11 * i) + 2).Value = vaPct(0)

        'If there's a pct, write it to a cell
        If UBound(vaPct) >= 1 Then
            Sheet1.Range("A1").Offset(0, (11 * i) + 3).Value = Replace(vaPct(1), ")", vbNullString)
        End If
    Next i

End Sub

【讨论】:

  • 刚刚试驾了,这简直就是魅力所在。最初的问题是关于一列值,所以我只是将整个内容嵌入到 For X = 1 To lastRow 的 For 循环中,非常感谢,这是一个比我自己尝试的更优雅的解决方案。非常感谢。
【解决方案2】:

OP 需要 VBA,但其他人可能会接受替代方案,因此:

查找space替换为,
查找 ( 替换为 nothing
查找 ), 替换为 nothing
查找)替换为nothing

文本到以, 分隔的列(将连续的分隔符视为未选中的分隔符)

插入适合的列。

查找/替换的替代方法:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1," ",","),"(",""),"),",""),")","")  

复制到适合,选择列,复制,选择性粘贴,值,然后继续文本到列。

【讨论】:

    【解决方案3】:
    Sub SplitRoast()
        Dim x() As String
        x = Split(Replace(Replace(Replace _
            (Replace(Range("A1").Value, ")", ""), "(", ""), ", ", ","), " ", ","), ",")
    
        Range("B1").Value = x(0)
        Range("C1").Value = x(1)
        Range("M1").Value = x(2)
        Range("N1").Value = x(3)
        Range("X1").Value = x(4)
        '(blank)- Cell Y1
        Range("AD1").Value = x(5)
        Range("AE1").Value = x(6)
    
    End Sub
    

    【讨论】:

    • 这行不通。我在问题中给出的示例只是示例。并非所有字符串都包含空白值。有些会有很多空白值。因此,您不能将数组x()长度视为常量
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多