Excel 通过组合字符组拆分字符串

Excel 通过组合字符组拆分字符串,excel,vba,unicode,Excel,Vba,Unicode,我正在使用Excel vba处理包含Unicode组合字符的字符串。我需要将字符串拆分为一个字符数组。。。很简单。我的问题是我需要角色组。也就是说,字符及其组合字符。如何使用Excel vba将字符串拆分为字符组+组合字符组?vba没有直接的功能来处理组合字符。相反,您必须使用一些代码来解决问题。事实上,这不是VBA的具体问题,请阅读 下面的代码将尝试处理最常见的组合字符问题,并且与变音符号有关。变量unicode将存储所需的拆分unicode字符串 当然,组合字符可能会从标记中延伸出来,比如a

我正在使用Excel vba处理包含Unicode组合字符的字符串。我需要将字符串拆分为一个字符数组。。。很简单。我的问题是我需要角色组。也就是说,字符及其组合字符。如何使用Excel vba将字符串拆分为字符组+组合字符组?

vba没有直接的功能来处理组合字符。相反,您必须使用一些代码来解决问题。事实上,这不是VBA的具体问题,请阅读

下面的代码将尝试处理最常见的组合字符问题,并且与变音符号有关。变量unicode将存储所需的拆分unicode字符串

当然,组合字符可能会从标记中延伸出来,比如ae作为唯一字母或ß也可以写为ss

Sub Test()
    Dim r As Range
    Set r = ActiveSheet.Range("A1")
    
    ' Set some combined chars in A1 cell
    r = "a" + ChrW(&H300)
    r = r + "e" + ChrW(&H301)
    r = r + "i" + ChrW(&H305)
    r = r + "o" + ChrW(&H300)
    r = r + "u" + ChrW(&H300)
    

    ' Store the combined chars from cell A1 to str
    Dim str As String
    str = r
    ' Length, counting the individual characters in string
    Dim strLen As Integer
    strLen = Len(str)
    
    
    ' Each element in unicode() will contain combined chars
    Dim unicode() As String
    ReDim unicode(strLen)
    
    ' Length, counting the combined characters in string
    Dim unicodeLength As Integer
    unicodeLength = 0
    
    
    ' Split str into unicode()
    Dim char As Integer
    For i = 1 To strLen
        char = AscW(Mid(str, i, 1))
        
        unicode(unicodeLength) = unicode(unicodeLength) + ChrW(char)
        
        If i < strLen Then
            'If it is not the last char, check if
            'the following char is a combining diacritical mark
            'and if so, do not increment the length
            char = AscW(Mid(str, i + 1, 1))
            If Not (char >= &H300 And char <= &H36F) Then
                unicodeLength = unicodeLength + 1
            End If
        Else
            unicodeLength = unicodeLength + 1
        End If
    Next i
    
    
    ' Fill B column with 1 combined char per row
    For i = 1 To unicodeLength
        ActiveSheet.Range("B" & i) = unicode(i - 1)
    Next i
End Sub
<>这个代码没有考虑三个主要的事情:

除了U+0300到U+036F之外,还有更多罕见的unicode字符 一些像U+035C到U+0362这样的变音符号将两个字符连接在一起,即a͜b a+ChrW和H35C+b。在这种情况下,您必须编写一些附加条件。 如果有一些变音符号,unicode数组中将有空格。在这种情况下,您必须使用Unicode长度重拨Preserve以释放一些空间,或者使用Unicode长度作为上限。 更多信息

自版本1.0起,将变音符号0300–036F与 后续版本中的修改一直到4.1

组合变音符号扩展1AB0–1AFF,7.0版

组合变音符号补充1DC0–1DFF,版本4.1至5.2

自版本1.0起,结合符号20D0–20FF的变音符号,并进行修改 在5.1以下的后续版本中

结合半标记FE20–FE2F,版本1.0,并在后续版本中进行修改,直到8.0


没有回答我的问题。。。循环遍历每个字符。组合字符单独处理。我需要在我的循环中将组合字符分组在一起。我猜它是否是模式匹配。。。如果您发布了一个示例字符串和预期的输出,那么它会更有用。