Excel 连续数据中的数组?

Excel 连续数据中的数组?,excel,vba,excel-formula,Excel,Vba,Excel Formula,我有一个相当难的问题,我无法解决。。希望你能帮助我 假设我的数据在A1:G1中,例如: A1 B1 C1 D1 E1 F1 G1 X X 0 X X X 0 or Y X X X X Z X 我需要想到的是如何根据X从这些数据中得到数组,但是如果像在示例1中一样,开始有2倍X,3倍X彼此相邻,那么数组应该像{2;2;0;3;3;3;0}那样,所以我希望数组的长度是7,数组应该显示X作为数字,有多少

我有一个相当难的问题,我无法解决。。希望你能帮助我

假设我的数据在A1:G1中,例如:

A1   B1   C1   D1   E1   F1 G1

X    X    0    X    X    X   0  
or
Y    X    X    X    X    Z   X  
我需要想到的是如何根据X从这些数据中得到数组,但是如果像在示例1中一样,开始有2倍X,3倍X彼此相邻,那么数组应该像{2;2;0;3;3;3;0}那样,所以我希望数组的长度是7,数组应该显示X作为数字,有多少个相邻

示例2的结果应该类似于{0;4;4;4;0;1}

如果你能弄明白的话,我会帮上大忙的

编辑:

试图对我的意思给出更好、更全面的理解

如果数据为:

    A   B   C  
1   X   X
2       X   X
3   X        
结果应该是

    A   B   C
1:  2   4   0 
2:  0   4   2
3:  1   0   0
或在数组{2\4\0;0\4\2;1\0\0}中

在B1和B2上,应该有4,因为公式应计算水平连续统,但也应计算垂直连续统。我尝试使用usmanhaqs公式,但无法修改它,因此每行的计数都会重置。 表的实际大小是7乘以7个单元格

我将使用另一个数组(记分板也是7乘以7个单元格,每个单元格上都有数字1、2或3)使用sumproduct,它将给出该玩家的分数

我非常感谢您在帮助vba新手方面所做的努力:)

您可以测试此代码

Function get_array(r As Range, match_chr As String)

    Dim check_val
    Dim array_value

    array_value = "{"

    For i = 1 To r.Count

    check_value = r.Item(i)

        If (check_value = match_chr) Then
            j = i + 1
            Do While (j <= r.Count) And (check_value = r.Item(j))

                j = j + 1
            Loop

            array_value = array_value & WorksheetFunction.Rept(j - i & ", ", j - i)
            i = j - 1
        Else
            array_value = array_value & "0, "
        End If

    Next

    array_value = Left(array_value, Len(array_value) - 2) & "}"
    get_array = array_value


End Function
函数获取数组(r作为范围,匹配chr作为字符串)
暗支票
Dim数组_值
数组_值=“{”
对于i=1到r.计数
检查值=r.项目(i)
如果(检查值=匹配值),则
j=i+1

Do While(j对于公式解,我只能为到目前为止只有X和0(示例1)的特殊情况想出一个:

=SUM(IF(A1:G1“X”,0,索引(频率)(IF(A1:G1=“X”,列(A1:G1)),IF(A1:G1“X”,列(A1:G1))),N(IF({1},小计(2,偏移量(A1,0,0,1,列(A1:G1俬俬)))+1,1)))
使用CtrlShiftEnter作为数组公式输入

我将其包装在一个SUM函数中,以演示它生成一个数组,该数组可以传递给另一个函数(结果:13),也可以跨多个单元格输入数组:


欢迎使用StackOverflow!您到底尝试了什么,结果如何?请仔细阅读上的指南,以便其他人能够为您提供更好的帮助。因此,您只查找X,而不查找任何其他字母?您是否有空间放置帮助器列/行,或者解决方案是单一公式是否重要?我有figured如何使用多个公式和多张工作表,但我想为用户简化这一点,但我无法理解这一点。这是非常好的vba代码,但..我不能将其用作数组,因为每个字符之间都有空格。我试图从代码中删除它们,出于某种原因,最后一个数字留下了ou编辑:我想出来了,但又出现了另一个问题,这个解决方案在引号中“我不能在需要数组的函数中使用它。例如sumprodcuts..您的确切目标是什么,我可以尝试更新代码以实现这一目标。目前,此函数按照您最初的问题以字符串形式返回数组,您不能在求和、平均类型的函数中使用它。我添加了另一个函数来返回可以在excel公式中使用EXACT的目标是计算一个名为kivi的棋盘游戏的结果,函数的目标意味着你将如何处理返回的数组,但不管怎样,我编辑了答案,你可能已经看到了,你可以在excel公式中使用返回的数组。我正在成为你的粉丝,你的答案真的让我着迷e、 每次我看到你的答案,我都会学到一些新的东西。但我不知道如何使用频率,也不知道({1})对我来说是否是新的。我在谷歌上搜索了几次频率,但我相信我必须搜索更多。谢谢!虽然我没有找到这个问题的一般答案,但这是一个很好的各种技术的案例研究(这是我从@Barry Houdini这样的大师那里学到的)-稍后我将添加一些参考资料。
Function get_number_array(r As Range, match_chr As String)

    Dim check_val
    Dim array_value
    Dim number_array(1 To 50) As Long

    For i = 1 To r.Count

    check_value = r.Item(i)

        If (check_value = match_chr) Then
            j = i + 1
            Do While (j <= r.Count) And (check_value = r.Item(j))

                j = j + 1
            Loop

            For k = 1 To j - i
                number_array(i + k - 1) = j - i
            Next k

            i = j - 1
        Else
            number_array(i) = 0
        End If

    Next

    get_number_array = number_array


End Function
=SUM(IF(A1:G1<>"X",0,INDEX(FREQUENCY(IF(A1:G1="X",COLUMN(A1:G1)),IF(A1:G1<>"X",COLUMN(A1:G1))),N(IF({1},SUBTOTAL(2,OFFSET(A1,0,0,1,COLUMN(A1:G1)))))+1,1)))