【问题标题】:Excel Split Text with Multiple DelimitersExcel 使用多个分隔符拆分文本
【发布时间】:2020-12-10 02:52:45
【问题描述】:

第一次在这里发布问题。很高兴成为社区的一员!

我遇到了一个棘手的情况,为客户转换数据让我很困惑。

我需要找到一种方法,不仅可以通过多个分隔符分割一个单元格,而且还需要删除一些数据点。在这种情况下,我们讨论的是租户列表和租约中的任何其他租户。

This is how the data was exported and in its current state

您会看到我在这里至少可以使用一个常用的分隔符。 “ :” 可以让我简单地拆分名称,但这里真正的问题是需要删除数据点“儿子”或“女儿”下列出的租户名称。另一方面,必须保留列为“居民”或“租户”的租户。

An example of how I'd want this to look

您会看到名称被拆分,仅保留“租户”或“居民”下列出的名称,其他名称被删除。

我尝试使用可用于拆分的简单字符查找并替换我想要保留的术语,但问题是我没有一致的顺序来使用它。我一直在寻找一个也可以工作的拆分 VBA 函数,但没有任何运气。

欢迎在这里提出想法!

【问题讨论】:

标签: excel delimiter


【解决方案1】:

我认为这个功能可能是过度杀戮。但它会做你想做的事。

Function SplitCellValue(ByVal CellVal As String) As String
    '137
    
    Const Qualifiers    As String = "tenant,resident"
    
    Dim Fun()       As String           ' function return array
    Dim n           As Integer          ' index of Fun()
    Dim Qword()     As String           ' split Qualifiers
    Dim q           As Integer          ' index of Qword
    Dim Sp()        As String           ' split array
    Dim i           As Integer          ' index of Sp()
    Dim Skip        As Boolean          ' True if entry doesn't qualify
    Dim Append      As Boolean          ' True to append unqualified entry to previous
    
    If Len(CellVal) Then                ' skip blank CellVal
        Qword = Split(Qualifiers, ",")
        Sp = Split(Trim(CellVal), ",")
        ReDim Fun(1 To UBound(Sp) + 1)
        For i = 0 To UBound(Sp)
            If InStr(Sp(i), ":") Then
                For q = LBound(Qword) To UBound(Qword)
                    Skip = CBool(InStr(1, Sp(i), Qword(q), vbTextCompare))
                    If Skip Then Exit For
                Next q
                If Skip Then
                    n = n + 1
                    Fun(n) = Trim(Sp(i))
                    Append = True
                Else
                    Append = False
                End If
            Else
                If n = 0 Then
                    ' preserve unqualified, leading entry
                    n = 1
                    Append = True
                End If
                If Append Then
                    If Len(Fun(n)) Then Fun(n) = Fun(n) & ", "
                    Fun(n) = Fun(n) & Trim(Sp(i))
                End If
            End If
        Next i
    End If
    
    If i Then
        ReDim Preserve Fun(1 To n)
        SplitCellValue = Join(Fun, ", ")
    End If
End Function

列出常量Qualifiers 中的所有限定符。其他一切都将被拒绝。限定符仅在与冒号出现在相同的逗号分隔元素中时才限定元素。 (我可能还不如将两者结合起来,但我没有。)

您可以在 VBA 中通过这样的调用使用此函数。

Private Sub Test_SplitCellValue()

    Dim R As Integer
    
    For R = 2 To 5
        Debug.Print i, SplitCellValue(Cells(R, 1).Value)
    Next R
End Sub

或作为 UDF,称为 =SplitCellValue(A2)。为此使用安装在标准代码模块中。

过度杀戮是函数可以做的事情可能不需要。 (1) 空白单元格将返回空白。 (2) 非空白单元格如果没有找到冒号,则返回其原始值。 (3) 第一个元素之前带有冒号的任何内容都将包含在返回中。 (4) 删除原文中的空格并用逗号后面的空格替换,这些空格本身也被删除,然后放置在限定元素之间。所有这些都需要大量代码,如果您的数据或期望与我的预期不一致,则可能需要修改这些代码。

【讨论】:

    【解决方案2】:

    因此,经过反复试验,这比我想象的要简单得多。 ", " & "," 有两个不同的实例(一个后面有一个空格)以不同的方式使用。

    我能够找到并用空格替换逗号的实例,保持我需要的细节完整,同时在没有空格的情况下分隔“,”。

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      相关资源
      最近更新 更多