检查Excel单元格中的连续字符

如果你能帮助我,我需要找出字母表中的一个字符是否连续重复3次或更多次,例如,如果一个单元格是“aronfff”或“aaaaaron”,我希望它返回true,否则返回false例如“亚伦”。

Function InRowChars(cell As String) As Boolean Dim repeats As Integer, char As String, i As Integer repeats = 0 char = "abcdefghijklmnopqrstuvwxyz" For i = 1 To Len(cell) If cell.Value = " " Then repeats = chars + 1 Else chars = 0 End If Next i If chars = 3 Then InRowChars = True Else InRowChars = False End If End Function 

我不知道如何获得单元格的字母值的检查。

这是另一个正则expression式的解决scheme,返回TRUE或FALSE取决于是否有三个或更多重复的字母字符:

 Option Explicit Function TripleChars(S As String) As Boolean Dim RE As Object Set RE = CreateObject("vbscript.regexp") With RE .Global = True .Pattern = "([az])\1\1" .ignorecase = True 'edit as desired TripleChars = .test(S) End With End Function 

这里是对正则expression式的解释:

([AZ])\ 1 \ 1

 ([az])\1\1 

选项:不区分大小写; ^ $在换行符不匹配

  • 匹配下面的正则expression式并将其匹配到反向引用编号1 ([az])
    • 匹配“a”和“z” [az] 之间的单个字符
  • 通过捕获组号1 \1 匹配最近匹配的相同文本
  • 通过捕获组号1 \1 匹配最近匹配的相同文本

用RegexBuddy创build

这可以通过正则expression式来实现。 我做了一个函数的例子,它也接受所需的最小字符数:

 'Add a reference to Microsoft VBScript Regular Expressions 5.5 Function ContainsConsecutiveChars(ByRef CellRef As Range, Optional ConsecutiveCount As Long = 3) As Boolean Dim chars() As String chars = Split("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z", ",") With New RegExp .Pattern = Join(chars, "{" & ConsecutiveCount & ",}|") ContainsConsecutiveChars = .test(CellRef.Value2) End With End Function 

我看到你已经有RegEx的答案了。 刚刚完成我的版本,所以认为我会张贴到。
@ Thunderframe – 我喜欢可选的位,所以公然把它用于我的版本。

 Public Function RepeatingChars(Target As Range, Optional ConsecutiveCount As Long = 3) As Variant Dim RE As Object, REMatches As Object Set RE = CreateObject("VBScript.RegExp") With RE .MultiLine = False .Global = False .IgnoreCase = True .Pattern = "(.)\1{" & ConsecutiveCount - 1 & ",}" End With Set REMatches = RE.Execute(Target.Value) If REMatches.Count = 0 Then RepeatingChars = CVErr(xlErrNA) Else RepeatingChars = REMatches(0) End If End Function 

该函数将返回任何字符的重复,否则#NA如果没有find匹配。

编辑
在快速重读您的问题后,您可以用RepeatingChars = REMatches.Count <> 0来replace整个If...End If块以返回TRUE / FALSE 。 请记住在这种情况下将函数的返回types更改为Boolean

这是我到目前为止所做的:

 Option Explicit Function checkChars(inputCell As String, Optional repeat As Long = 3) As Boolean Dim cnt As Long Dim previous As String Dim countResult As Long For cnt = 1 To Len(inputCell) If previous = Mid(inputCell, cnt, 1) Then countResult = countResult + 1 Else countResult = 1 End If If countResult = (repeat) Then checkChars = True Exit Function End If previous = Mid(inputCell, cnt, 1) Next cnt End Function Public Sub TestMe() Debug.Print checkChars("lalaaa") Debug.Print checkChars("lalaala", 2) Debug.Print checkChars("lalaala", 1) Debug.Print checkChars("lflalajajala", 2) End Sub 

这个想法是,如果重复次数不是3,那么也可以将重复次数作为可选值传递。这是您从示例中获得的输出:

 True True True False