【问题标题】:Split Uppercase words in Excel and insert delimiters在 Excel 中拆分大写单词并插入分隔符
【发布时间】:2019-02-01 17:15:32
【问题描述】:

我有这个字符串:

RugbyFunny RugbyGirls RugbyBoys RugbyWomens Rugby

基本上,我想用大写字母分割单词并放置一个分隔符,如;

我找到了一个有用的 VBA 函数来完成部分工作:

Function splitbycaps(inputstr As String) As String
    Dim i As Long
    Dim temp As String

    If inputstr = vbNullString Then
        splitbycaps = temp
        Exit Function
    Else
        temp = inputstr
        For i = 1 To Len(temp)
            If Mid(temp, i, 1) = UCase(Mid(temp, i, 1)) Then
                If i <> 1 Then
                    temp = Left(temp, i - 1) + " " + Right(temp, Len(temp) - i + 1)
                    i = i + 1
                End If
            End If
        Next i
        splitbycaps = temp
    End If
End Function

如何在每个单词之间添加分隔符?我想产生这样的结果:

Rugby;Funny Rugby;Girls Rugby;Boys Rugby;Womens Rugby;

非常感谢您的帮助!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    把函数改成这样:

    Function SplitByCaps(InputStr As String) As String
        Dim i As Long
        Dim temp As String
    
        If InputStr = vbNullString Then
            SplitByCaps = temp
            Exit Function
        Else
            temp = InputStr
            Do While i < Len(temp)
                i = i + 1
                If Mid(temp, i, 1) <> LCase(Mid(temp, i, 1)) Then
                    If i <> 1 Then
                        If Mid(temp, i - 1, 1) <> " " Then
                            temp = Left(temp, i - 1) & ";" & Right(temp, Len(temp) - i + 1)
                            i = i + 1
                        End If
                    End If
                End If
                DoEvents
            Loop
            SplitByCaps = temp
        End If
    End Function
    

    编辑:将其更改为Do 循环,For 计数不正确,正如@Vityata 指出的那样。

    Public Sub Test()
        Dim str As String
        str = "RugbyFunny RugbyGirls RugbyBoys RugbyWomens Rugby"
    
        Debug.Print SplitByCaps(str)
        'Rugby;Funny Rugby;Girls Rugby;Boys Rugby;Womens Rugby
    End Sub
    

    【讨论】:

    • 非常感谢!如何将其合并到我最初问题中发布的上述代码中?再次感谢!
    • str = "KRugbyFunny RugbyGirls RugbyBoys RugbyWomens Rugby K TB" 没有返回所需的内容。
    • @Vityata 很好,因为要求是“单词用大写字母分开”并且KTB 没有单词,你的示例也不满足要求;)
    • @Vityata Eww 对不起,你完全正确,我的错。 For 循环计数不正确,因为 Len(temp) 在循环开始后发生了变化。起初没有看到,因为只是使用 OPs 代码来改进它,而不是从头开始编写它。将其更正为 Do 循环。仍然IIII 可能是一个有点奇怪的例子。
    • 我可能在 codeforeces.com 和 topcoder.com 等网站上花费了太多时间 - 用你的代码试试这个,它会破坏 - "I IIIRugbyFunny RugbyGirls RugbyBoys RugbyWomens RugbyII"
    【解决方案2】:

    基于 ASCII 值比较

    For i = 1 To Len(TEMP)
        If i <> 1 Then
            If Asc(Mid(TEMP, i, 1)) >= 65 And Asc(Mid(TEMP, i, 1)) <= 90 Then
                TEMP = Left(TEMP, i - 1) + ";" + Right(TEMP, Len(TEMP) - i + 1)
                i = i + 1
            End If
        End If
    Next i
    

    【讨论】:

    • 在一般情况下,答案应该有效,但有些人使用奇怪的字母和奇怪的字符,如 ÜÖЪ。阅读这篇文章,它解释了很多 - joelonsoftware.com/2003/10/08/…
    【解决方案3】:

    首先你需要找到字符串的所有位置,其中:

    • char 是大写的
    • char 实际上是一个字母
    • 字符前没有空格

    然后,这些位置可以保存在一个集合中。这是一个函数,查找下一个大写位置,返回-1,如果没有的话:

    Public Function NextUpperCasePosition(str As String, marker As Long) As Long
    
        Dim i As Long
    
        Dim isUpper As Boolean
        Dim isLetter As Boolean
        Dim noSpaceBefore As Boolean
    
        If marker = 1 Then
            NextUpperCasePosition = 1
            Exit Function
        End If
    
        For i = marker To Len(str)
    
            noSpaceBefore = CBool(Len(Trim(Mid(str, i - 1, 1))) > 0)
            isUpper = CBool(Mid(str, i, 1) = UCase(Mid(str, i, 1)))
            isLetter = CBool(LCase(Mid(str, i, 1)) <> UCase(Mid(str, i, 1)))
    
            If isUpper And isLetter And noSpaceBefore Then
                NextUpperCasePosition = i
                Exit Function
            End If
        Next i
    
        NextUpperCasePosition = -1
    
    End Function
    

    一旦您能够找到位置并将它们添加到位置集合中,您就可以根据这些数字循环遍历该集合并将字符串拆分为一个数组。数组准备好后, Join(arr, "; ") 可以很好地生成所需的字符串:

    Public Sub SplitByUpperCase()
    
        Dim str As String
        str = "KRugbyFunny RugbyGirls RugbyBoys RugbyWomens Rugby K TB"
    
        Dim i As Long
        Dim result As New Collection
        Dim nextPosition As Long: nextPosition = 1
    
        For i = 1 To Len(str) Step 1
            If i = nextPosition Then
                nextPosition = NextUpperCasePosition(str, nextPosition)
                If nextPosition >= 1 Then result.Add (nextPosition)
                nextPosition = nextPosition + 1
            End If
        Next i
    
        Dim resultArr As Variant
        ReDim resultArr(result.Count - 1)
        Dim lenOfWord As Long
    
        For i = 1 To result.Count
            If i = result.Count Then
                lenOfWord = Len(str) - result(i) + 1
            Else
                lenOfWord = result(i + 1) - result(i)
            End If
            resultArr(i - 1) = Mid(str, result(i), lenOfWord)
        Next i
    
        Debug.Print Join(resultArr, "; ")
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 1970-01-01
      • 2014-11-28
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多