Excel,计算字符串中一系列连续字符的第一个实例
我有一个字符串,看起来像这样: 999999999999999999999999999999999999999999999999999999FFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99999^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 我试图计算给定连续字符序列的第一个实例的长度 示例: “9”作为给定的字符,它应该计算第一组9并返回30 “F”作为给定字符,对于30“9”s之后开始的第一组连续“F”s,它应该返回11 我在Excel中做这项工作,因此公式/VBA解决方案是理想的。如果必要,我可以将任何代码转换为VBA。我觉得这有一个Reg Ex解决方案,但我是Reg Ex的Jon Snow,我什么都不知道Excel,计算字符串中一系列连续字符的第一个实例,excel,charactercount,Excel,Charactercount,我有一个字符串,看起来像这样: 999999999999999999999999999999999999999999999999999999FFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99999^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 我试图计算给定连续字符序列的第一个实例的长度 示例: “9”作为给定的字符
提前感谢您提供的任何见解/建议。这有帮助吗?我用您的样本数据进行了尝试,似乎效果不错
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这是我最喜欢的方法!斯科特干杯!如果可以的话-下次你这样做,请在你的作品中告诉我们你正在编写代码,而不是先问一个问题然后再做它,然后(似乎)解决它。那么,为什么要问这个问题呢?为什么不先试着写一些代码,然后问某某,而不是先问某某然后再做这项工作。。。?