Excel 不精确阵列

Excel 不精确阵列,excel,vba,excel-2007,Excel,Vba,Excel 2007,我试图让Excel记录下一列数字,并计算每次出现之间的单元格数 但它首先进入一个单元格,获取要搜索的号码 我把第一部分答对了。它将找到要搜索的号码。 然后,它开始搜索 我的问题是,当它返回数组时,计数不准确。 它显示随机数 我从书本或网络中学到的东西。 所以请原谅这些乱七八糟的代码lol 第一部分进行搜索,第二部分将其放入数组中 我将非常感谢在这方面的任何帮助。 亲切的问候 If Z = 5 Then ActiveCell.Offset(0, 1).Select: Z = 0: x = x +

我试图让Excel记录下一列数字,并计算每次出现之间的单元格数

但它首先进入一个单元格,获取要搜索的号码

我把第一部分答对了。它将找到要搜索的号码。 然后,它开始搜索

我的问题是,当它返回数组时,计数不准确。 它显示随机数

我从书本或网络中学到的东西。 所以请原谅这些乱七八糟的代码lol

第一部分进行搜索,第二部分将其放入数组中 我将非常感谢在这方面的任何帮助。 亲切的问候

 If Z = 5 Then ActiveCell.Offset(0, 1).Select: Z = 0: x = x + 1
  Select Case Selection.Value
   Case Is = 1000
   GoSub passarrayp
   Case Is = 100
   ActiveCell.Offset(0, 1).Select: x = x + 1: Z = 0 'Exit Do
   Case Is = searchp
   ActiveCell.Offset(0, 1).Select: p = p + 1: DataArray1(p) = x: x = 1: Z = 0
   Case Is = 50
   Range("h:h").Select: Selection.ClearContents: Range("a3").Select: GoSub final
   Case Is <> searchp
   ActiveCell.Offset(1, 0).Select: Z = Z + 1
 End Select
  Loop
  Next Z

  GoSub passarrayp
 'Transfer the array to the worksheet
 passarrayp:
 'finds an empty cell to put the number of undrawn weeks
 Range("k46").Select
 Do While ActiveCell <> searchp
 ActiveCell.Offset(1, 0).Select
 Loop
 Do
 If ActiveCell = searchp Then ActiveCell.Offset(2, 0).Select: c = p: _
'places array values onto spreadsheet
 Selection.Resize(1, c + 1).Value = DataArray1: Exit Do
Loop
        'Zero array elements ready for next search
r = 0 ' starts the array reset from from the first element
For i = 0 To 249
r = r + 1: DataArray1(p) = 0 ' clear the  array element values to zero
Next i ' increments the elements to be zeroed
如果Z=5,则ActiveCell.Offset(0,1)。选择:Z=0:x=x+1
选择Case Selection.Value
每箱=1000
戈苏巴萨雷
情况是=100
ActiveCell.Offset(0,1)。选择:x=x+1:Z=0'退出Do
Case Is=searchp
偏移量(0,1)。选择:p=p+1:DataArray1(p)=x:x=1:Z=0
情况是=50
范围(“h:h”)。选择:选择。清除内容:范围(“a3”)。选择:GoSub最终版本
案件正在调查中
偏移量(1,0)。选择:Z=Z+1
结束选择
环
下一个Z
戈苏巴萨雷
'将数组传输到工作表
帕萨雷普:
'查找空单元格以放置未提取的周数
范围(“k46”)。选择
当ActiveCell搜索时执行此操作
ActiveCell.Offset(1,0)。选择
环
做
如果ActiveCell=searchp,则为ActiveCell.Offset(2,0)。选择:c=p:_
'将数组值放置到电子表格中
Selection.Resize(1,c+1)。Value=DataArray1:Exit Do
环
'零个数组元素已准备好进行下一次搜索
r=0'从第一个元素开始数组重置
对于i=0到249
r=r+1:DataArray1(p)=0'将数组元素值清除为零
接下来,i'增加要归零的元素

我会用不同的方式来做

编辑:编辑代码和屏幕截图以使第一项一致

收集集合中的相关行号,然后输出具有相关行号之间差值的数组:

Option Explicit
Function countBetween(Draws As Range, LookFor As Long) As Long()
    Dim colRowNums As Collection
    Dim C As Range
    Dim rowDiffs() As Long
    Dim firstRow As Long
    Dim firstAddress As String
    Dim lTemp() As Long, I As Long

'find first row with data in Draws Range
'  we do this just in case user picked the non-numeric header row
' could do more extensive checking

If IsNumeric(Draws(1, 1)) Then
    firstRow = Draws(1, 1).Row
Else
    firstRow = Draws(2, 1).Row
End If

'collect each row number of interest
'could also loop, but `.Find` should be faster on long arrays

Set colRowNums = New Collection
With Draws
    Set C = .Find(what:=LookFor, after:=Draws(1, 1), LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext)
    If Not C Is Nothing Then
        firstAddress = C.Address
        colRowNums.Add C.Row

        Do
            Set C = .Find(what:=LookFor, after:=C)
            If Not C.Address = firstAddress Then
                colRowNums.Add C.Row
            Else
                Exit Do
            End If
        Loop
    End If
End With

'If first entry in Draws was LookFor, then it will be last in the list
' So check for that and exchange if necessary

If colRowNums(1) > colRowNums(colRowNums.Count) Then
    colRowNums.Add Item:=colRowNums(colRowNums.Count), before:=1
    colRowNums.Remove (colRowNums.Count)
End If

'create output array
ReDim lTemp(1 To colRowNums.Count, 1 To 1) 'for vertical outputl
lTemp(1, 1) = colRowNums(1) - firstRow + 1
For I = 2 To colRowNums.Count
    lTemp(I, 1) = colRowNums(I) - colRowNums(I - 1)
Next I

countBetween = lTemp
End Function
该函数将返回值的垂直数组。 如果您有带动态阵列的O365,您只需输入:

=countBetween(Draws,LookFor)
在单个单元格中,结果将向下溢出

如果不需要,您可以在一系列单元格中输入公式作为数组公式,或者使用
INDEX
函数作为:

=IFERROR(INDEX(countBetween(Draws,LookFor),ROWS($1:1)),"")
然后填写,直到你看到空白

编辑水平阵列输出:

正如我在评论中所写的,如果您想要结果的水平输出,因为您现在有O365,那么您所需要做的就是使用
转置
函数。例如:

=TRANSPOSE(countBetween(A2:A23,B2))
或者,您可以更改用于创建输出数组的方法:

'for horizontal output
ReDim lTemp(1 To colRowNums.Count)
lTemp(1) = colRowNums(1) - firstRow + 1
For I = 2 To colRowNums.Count
    lTemp(I) = colRowNums(I) - colRowNums(I - 1)
Next I

让我们更容易帮助你。请举例说明您的数据、预期输出、实际输出。感谢您的回复,这些都是数据。我希望看到数字10,例如,我希望看到6,11和4,这些数字是数字之间的计数。或者换一种方式说(如果我没有解释清楚的话),从彩票中抽取10号的间隔周数12354111111119111141351051110911991希望这能澄清这一点,我非常感谢你对罗恩的帮助。请原谅我的愚蠢,可以说,我正在学习。谢谢你对罗恩的帮助。请原谅我的愚蠢,可以说,我正在学习。正如你提到的,数据是垂直的,所以你的建议可以。然而,我已经尝试插入您的代码,以及自己运行它,因为我不确定它是否是一个程序本身。不管怎样,恐怕都不行。当我运行它时,它需要一个子例程sub,end sub,这会阻止它运行。再次感谢你的帮助,还有你的另外两个建议?它们只是数据表上的一个公式吗?我不明白你写了什么。你认为它为什么叫潜艇?你说“不行”是什么意思?你说的“程序”是什么意思?该代码是用户定义的函数。用VBA编写。如果它不工作,我将如何创建屏幕截图?你认为“其他2条建议”是什么?我只提供了一个UDF的实例,几乎是2.30。我的脑子痛。还记得那些旧的灾难电影吗?当飞行塔里的人不得不在乘客面前谈论从未驾驶过的飞机如何着陆?我是控制飞机的乘客。。。。。。晚安,洛比先生。我用剪贴工具得到了一个屏幕截图,但我不知道如何上传。。