首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VBA:使用没有良好分隔符的大字符串拆分

Excel VBA:使用没有良好分隔符的大字符串拆分
EN

Stack Overflow用户
提问于 2017-11-01 13:00:06
回答 1查看 189关注 0票数 0

亲爱的各位,

我需要从单个单元格中拆分一个大字符串,没有好的分隔符。这是网球比赛的“点对点”日期,从第三方软件直接导出到Excel工作簿。

不幸的是,我不太了解VBA语言来解决这个问题,我在论坛上也找不到类似的例子。那么,某个有福的灵魂能帮我吗?

这是我的A1单元格内容的一个例子:

代码语言:javascript
复制
0-0 [*0-0] [0-15*] [15-15*] [15-30*] [30-30*] [40-30*] [40-40*] [40-A*] [40-40*] [A-40*] 1-0 [*0-0] [*0-15] [*15-15] [*15-30] [*30-30] [*40-30] 2-0 [0-0*] [15-0*] [30-0*] [30-15*] [40-15*] 3-0 [*0-0] [*0-15] [*15-15] [*30-15] [*40-15] 4-0 [0-0*] [15-0*] [30-0*] [40-0*] 5-0 [*0-0] [*15-0] [*15-15] [*30-15] [*40-15] 6-0 0-0 [0-0*] [0-15*] [0-30*] [0-40*] 6-0 0-1 [*0-0] [*0-15] [*15-15] [*15-30] [*30-30] [*30-40] [*40-40] [*A-40] 6-0 1-1 [0-0*] [0-15*] [15-15*] [30-15*] [30-30*] [40-30*] 6-0 2-1 [*0-0] [*15-0] [*15-15] [*15-30] [*30-30] [*40-30] [*40-40] [*A-40] [*40-40] [*A-40] [*40-40] [*40-A] 6-0 2-2 [0-0*] [0-15*] [0-30*] [15-30*] [15-40*] 6-0 2-3 [*0-0] [*0-15] [*0-30] [*0-40] 6-0 2-4 [0-0*] [0-15*] [0-30*] [0-40*] 6-0 2-5 [*0-0] [*15-0] [*30-0] [*30-15] [*40-15] 6-0 3-5 [0-0*] [0-15*] [0-30*] [15-30*] [30-30*] [40-30*] 6-0 4-5 [*0-0] [*15-0] [*30-0] [*40-0] 6-0 5-5 [0-0*] [0-15*] [15-15*] [30-15*] [30-30*] [30-40*] [40-40*] [40-A*] 6-0 5-6 [*0-0] [*15-0] [*30-0] [*30-15] [*40-15] [*40-30] 6-0 6-6 [0-0*] [*1-0] [*2-0] [2-1*] [3-1*] [*4-1] [*5-1] [6-1*] 6-0 7-6(1)
  • *表示谁在服役。
  • 括号内的数字是每场比赛或一场平局的得分。
  • 括号外的数字是每场比赛的最后得分。
  • 在第一盘结束后(6-X或7-5),括号外的数字包括先前设定的分数。

重要:的第一个字符,在第一个实点[0-15*]之前,是无用的,IMO。首先,因为服务对象的指示通常是错误的(如本例中所示);第二,因为有时字符串的启动方式略有不同,没有第一个"0-0",也没有使用其他无用的零,比如"0-0 [0-0] [* 0-0]"

尽管如此,我需要从这些数据中提取的只有两件事:

  • 在第一场比赛中谁发球的专栏(左或右);
  • 游戏分数的顺序(没有点对点)在不同的栏目中;

如下所示:

代码语言:javascript
复制
*1-0 | 1-1 | 2-1 | 3-1 | 4-1 ...*

我已经使用Excel公式完成了这项工作,但是我需要几十个新列,每个列都有效率很大的公式,这使得在Excel中无法处理。

是否有一种最简单的使用VBA的方法?我是否必须使用其他软件或语言,如R或Power Bi?

EN

回答 1

Stack Overflow用户

发布于 2017-11-01 14:42:10

根据您提供的示例,下面的UDF将为您提供一个包含set详细信息的数组(aGameScore)。数组的元素数对应于字符串中列出的集合数。每个元素都以Left PlayerRight Player开头:指示哪个玩家在集合中第一次服务。之后,每个数组元素保存字符串中列出的每个游戏的得分。

代码语言:javascript
复制
Sub GetScores()

    Dim aScores As Variant
    Dim aGameScore As Variant
    Dim iC&, iHyphLoc&, iServerLoc&
    Dim sServer$

    With ThisWorkbook.Worksheets("Sheet13")

        aScores = Split(.Range("A2"), " ")

        For iC = LBound(aScores) To UBound(aScores)
            If InStr(1, aScores(iC), "0-0") > 0 And InStr(1, aScores(iC), "[") = 0 Then
                ' Set who sereved in the first game
                iC = iC + 1
                If IsArray(aGameScore) Then
                    ReDim Preserve aGameScore(UBound(aGameScore) + 1)
                Else
                    ReDim aGameScore(0)
                End If
                iHyphLoc = InStr(1, aScores(iC), "-")
                iServerLoc = InStr(1, aScores(iC), "*")
                If iHyphLoc > iServerLoc Then
                    aGameScore(UBound(aGameScore)) = "Left Player"
                Else
                    aGameScore(UBound(aGameScore)) = "Right Player"
                End If
            ElseIf InStr(1, aScores(iC), "[") = 0 Then
                ' Capture game scores
                If iC = UBound(aScores) Then
                    aGameScore(UBound(aGameScore)) = aGameScore(UBound(aGameScore)) & " | " & Trim(aScores(iC))
                ElseIf InStr(1, aScores(iC + 1), "[") <> 0 Then
                    aGameScore(UBound(aGameScore)) = aGameScore(UBound(aGameScore)) & " | " & Trim(aScores(iC))
                End If
            End If
        Next

    End With

End Sub

目前,UDF只检查Worksheet(13)的单元格Worksheet(13)中的文本。您可以进一步修改它,以查看范围内的所有单元格。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47055480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档