即使存在多个实例,如何在 excel 的列中搜索连续数字的特定数据
How to search for a specific data of consecutive numbers in a column of an excel even if multiple instances are present
如何在 excel 电子表格中的 1 和 0 大数据列中找到连续数字的多个实例。
例如,我的 excel 列如下:
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
1
0
0
1
1
0
0
1
0
请假设这是我的一些列数据,我需要找到列中出现的 1 和 0 的序列。
我定义了一个用于查找单个实例的函数,如下所示:
Function FINDSEQ(seq As String, rng as Range) As Long
FINDSEQ = InStr(1, Join(Application.Transpose(rng.Value), ""), seq)
End Function
但我找不到如何找到多个实例(如果存在)。
例如,我需要找到:
1
1
0
0
1
0
作为连续数字的序列,我应该如何改变?
这里 1 1 0 0 1 0 出现了两次,但是根据上面定义的函数我只能找到一个实例。
请尝试下一个功能:
Function FINDSEQ(seq As String, rng As Range) As Long
FINDSEQ = UBound(Split(Join(Application.Transpose(rng.Value), ""), seq))
End Function
然后用下面的方式调用它:
Sub testFINDSEQ()
Dim sh As Worksheet, rng As Range
Set sh = ActiveSheet
Set rng = sh.Range("A1:A25")
Debug.Print FINDSEQ("110010", rng)
End Sub
或来自单元格(如 UDF):
=FINDSEQ("110010",A1:A25)
不要忘记删除您已经存在的函数
给FINDSEQ
函数添加一个sp
(起始位置)参数:
Function FINDSEQ(seq As String, rng As Range, sp As Integer) As Long
FINDSEQ = InStr(sp, Join(Application.Transpose(rng.Value), ""), seq)
End Function
然后从找到的任何匹配字符串的下一个位置继续搜索:
newpos=FINDSEQ(1)
Do While newpos>0
Debug.Print newpos
newpos=FINDSEQ(newpos+1)
Loop
希望您在上次 之后先自己尝试一下。我也会使用 InStr
的第一个参数,但与@JMP 有点不同:
Function FINDSEQ(rng As Range, seq As String) As String
Dim x As Long, y As Long: x = 1
Do While InStr(x, Join(Application.Transpose(rng.Value), ""), seq) > 0
y = InStr(x, Join(Application.Transpose(rng.Value), ""), seq)
If FINDSEQ = "" Then
FINDSEQ = y
Else
FINDSEQ = FINDSEQ & "," & y
End If
x = y + 1
Loop
End Function
函数现在也从 Long
类型更改为 String
。
如何在 excel 电子表格中的 1 和 0 大数据列中找到连续数字的多个实例。 例如,我的 excel 列如下:
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
1
0
0
1
1
0
0
1
0
请假设这是我的一些列数据,我需要找到列中出现的 1 和 0 的序列。
我定义了一个用于查找单个实例的函数,如下所示:
Function FINDSEQ(seq As String, rng as Range) As Long
FINDSEQ = InStr(1, Join(Application.Transpose(rng.Value), ""), seq)
End Function
但我找不到如何找到多个实例(如果存在)。 例如,我需要找到:
1
1
0
0
1
0
作为连续数字的序列,我应该如何改变?
这里 1 1 0 0 1 0 出现了两次,但是根据上面定义的函数我只能找到一个实例。
请尝试下一个功能:
Function FINDSEQ(seq As String, rng As Range) As Long
FINDSEQ = UBound(Split(Join(Application.Transpose(rng.Value), ""), seq))
End Function
然后用下面的方式调用它:
Sub testFINDSEQ()
Dim sh As Worksheet, rng As Range
Set sh = ActiveSheet
Set rng = sh.Range("A1:A25")
Debug.Print FINDSEQ("110010", rng)
End Sub
或来自单元格(如 UDF):
=FINDSEQ("110010",A1:A25)
不要忘记删除您已经存在的函数
给FINDSEQ
函数添加一个sp
(起始位置)参数:
Function FINDSEQ(seq As String, rng As Range, sp As Integer) As Long
FINDSEQ = InStr(sp, Join(Application.Transpose(rng.Value), ""), seq)
End Function
然后从找到的任何匹配字符串的下一个位置继续搜索:
newpos=FINDSEQ(1)
Do While newpos>0
Debug.Print newpos
newpos=FINDSEQ(newpos+1)
Loop
希望您在上次 InStr
的第一个参数,但与@JMP 有点不同:
Function FINDSEQ(rng As Range, seq As String) As String
Dim x As Long, y As Long: x = 1
Do While InStr(x, Join(Application.Transpose(rng.Value), ""), seq) > 0
y = InStr(x, Join(Application.Transpose(rng.Value), ""), seq)
If FINDSEQ = "" Then
FINDSEQ = y
Else
FINDSEQ = FINDSEQ & "," & y
End If
x = y + 1
Loop
End Function
函数现在也从 Long
类型更改为 String
。