Excel,计算字符串中一系列连续字符的第一个实例

Excel,计算字符串中一系列连续字符的第一个实例,excel,charactercount,Excel,Charactercount,我有一个字符串,看起来像这样: 999999999999999999999999999999999999999999999999999999FFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99999^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 我试图计算给定连续字符序列的第一个实例的长度 示例: “9”作为给定的字符

我有一个字符串,看起来像这样:

999999999999999999999999999999999999999999999999999999FFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99999^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我试图计算给定连续字符序列的第一个实例的长度

示例:

“9”作为给定的字符,它应该计算第一组9并返回30

“F”作为给定字符,对于30“9”s之后开始的第一组连续“F”s,它应该返回11

我在Excel中做这项工作,因此公式/VBA解决方案是理想的。如果必要,我可以将任何代码转换为VBA。我觉得这有一个Reg Ex解决方案,但我是Reg Ex的Jon Snow,我什么都不知道


提前感谢您提供的任何见解/建议。

这有帮助吗?我用您的样本数据进行了尝试,似乎效果不错

Function number_Appearances(ByVal myText As String, ByVal myRng As Range)
Dim cel As Range
Dim txtFound As Boolean
Dim celText$

Dim findText$
findText = myText

Set cel = myRng
celText = cel.Text

Dim celLen&
celLen = Len(celText)

txtFound = True

Dim i&, k&
Dim iChar$
For i = 1 To celLen
    iChar = Mid(celText, i, 1)
    If iChar = findText And txtFound = True Then
        k = k + 1
    ElseIf k > 0 And iChar <> findText Then
        txtFound = False
    End If
Next i

Debug.Print "Found " & k & " " & findText & "'s"
number_Appearances = k
End Function
函数编号\u外观(ByVal myText作为字符串,ByVal myRng作为范围)
暗淡的cel As范围
Dim TXT被发现为布尔值
暗淡凯尔特文$
模糊文本$
findText=myText
设置cel=myRng
celText=cel.Text
暗淡的细胞&
celLen=Len(celText)
txtFound=True
Dim i&k&
暗淡的鱼鳞$
对于i=1到celLen
iChar=Mid(celText,i,1)
如果iChar=findText且txtFound=True,则
k=k+1
ElseIf k>0,iChar findText则
txtFound=False
如果结束
接下来我
Debug.Print“Found”&k&&findText&“s”
出现次数=k
端函数

但我在考虑公式之前就开始这么做了。@ScottCraner的建议更可取,我想。

我摆脱了懒散的状态,写了VBA来解决。谢谢Scott和Bruce。是的,是29,不是30。再次感谢你们

Public Function count_first_instance_of_consecutive_chars(the_char, the_string)
    Dim counter As Integer
    Dim iter As Long
    Dim is_a_match As Boolean

    is_a_match = False

    If the_char <> vbNullString And the_string <> vbNullString Then
        For iter = 1 To Len(the_string)
            If Mid(the_string, iter, 1) = the_char Then
                If is_a_match = True Then
                    counter = counter + 1
                ElseIf is_a_match = False Then
                    is_a_match = True
                    counter = 1
                End If
            Else
                If is_a_match = True Then
                    count_first_instance_of_consecutive_chars = counter
                    Exit For
                End If
            End If
        Next iter
    End If
End Function
公共函数计数\u连续\u字符的第一个\u实例\u(该\u字符,该\u字符串)
作为整数的Dim计数器
暗淡的iter
Dim作为布尔值是一个匹配项
是否匹配=错误
如果_char vbNullString和_string vbNullString
对于iter=1到Len(_字符串)
如果Mid(字符串,iter,1)=字符,则
如果匹配=真,则
计数器=计数器+1
ElseIf is_a_match=False则
匹配是否为真
计数器=1
如果结束
其他的
如果匹配=真,则
计数连续字符的第一个实例=计数器
退出
如果结束
如果结束
下一个iter
如果结束
端函数

我将把这句话放在这里,留给子孙后代:

=IF(SUBSTITUTE(MID($A$1,FIND(A2,$A$1),LEN($A$1)),A2,"")="",LEN($A$1)+1,FIND(MID(SUBSTITUTE(MID($A$1,FIND(A2,$A$1),LEN($A$1)),A2,""),1,1),$A$1,FIND(A2,$A$1)))-FIND(A2,$A$1)
这将计算所需输入的第一组:


这里是一个正则表达式解决方案。请注意,我们必须避开元字符

Option Explicit
Function LenFirstInstance(findCHAR As String, searchSTRING As String)
    Dim RE As Object, MC As Object
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = False
    .ignorecase = False
    .Pattern = Left(findCHAR, 1) & "+"
    If .Pattern Like "[\^$.|?*+()[{]*" Then _
        .Pattern = "\" & .Pattern
    If .Test(searchSTRING) = True Then
        Set MC = .Execute(searchSTRING)
        LenFirstInstance = MC(0).Length
    End If
End With

End Function

我得坐下来仔细想想你的公式,干得好!你是怎么做到的,以前做过类似的事情,还是只是修修补补,直到你得到它?我一直在往墙上扔东西,直到我得到我想要的东西。@BrucewayNet这是我最喜欢的方法!斯科特干杯!如果可以的话-下次你这样做,请在你的作品中告诉我们你正在编写代码,而不是先问一个问题然后再做它,然后(似乎)解决它。那么,为什么要问这个问题呢?为什么不先试着写一些代码,然后问某某,而不是先问某某然后再做这项工作。。。?