在5x5随机数组中查找值的单元格引用

时间:2019-04-18 00:36:55

标签: excel excel-formula

我在随机位置有一个5x5的数组,字母A-Y。我需要找到数组中特定字母的位置。我可以使用search,match和isnumber来获得1x25的矩阵,该矩阵的期望值位置为1,但是我不知道如何从数组中提取该位置。

{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}

如果我正在寻找“ d”会返回

{0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}

如何提取'd'在原始数组的第四位置或[1,4]?在最初的问题中,字符没有任何特定顺序。他们是完全随机的。

我正在Excel电子表格中执行此操作,因此尝试查找一个有效的公式而不是VBA代码。搜索周围的isnumber以获得1x25矩阵

4 个答案:

答案 0 :(得分:1)

假设:

  • 您的字母都在各自的单元格中
  • 没有重复的字母(或您要搜索的任何字母),每个单元格都是唯一的
  • 您的5X5矩阵从C2开始
  • 您要搜索的值在A2中

AGGREGATE是我在这里选择的功能。它将对公式14和15执行类似于数组的运算。可以设置它忽略错误,这将对我们有利,我们可以在结果列表中选择要从中提取结果的位置。聚合采取以下形式:

AGGREGATE(Formula #, Ignore Option #, range/array, parameter)
  • 公式15将对结果列表进行从最小到最大的排序。公式14做到了从最大到最小。只要所有条目都是唯一的,那么使用这两个中的哪一个都没有关系。

  • 选项6将忽略范围/数组内的所有错误

  • 对于范围/数组部分,构建所有电子表格行/列编号的列表。为行创建一次公式,然后重复执行并切换到列。将行号或列号除以TRUE / FALSE结果。在这种情况下,范围/数组等于您的搜索词。通过数学运算(并非所有函数)发送TRUE / FALSE时,TRUE变为1,FALSE变为0。除以0将产生错误。只有搜索字词所在的行将被1除,而行号保持不变。由于选项6忽略了所有错误,因此您将获得包含搜索词的行号列表。只要您的单元格都是唯一的,这意味着您将只有1个行号。

  • 公式14和15的参数部分是要返回的排序结果中的哪个位置。在这种情况下,需要第一次出现,因此应该为1。

将这些信息放在一起可以告诉我们,我们的AGGREGATE公式应该类似于:

FOR ROW
AGGREGATE(15,6,ROW($C$2:$G$6)/($C$2:$G$6=$A$2),1)

FOR COLUMN
AGGREGATE(15,6,COLUMN($C$2:$G$6)/($C$2:$G$6=$A$2),1)

现在,这将告诉您所处的Spreasheet列和行。如果矩阵/数组以A1开始,则无需进行任何其他操作。但是,此解决方案假定您的矩阵从C2开始。这意味着您的矩阵行号和列号与电子表格的行号和列号不匹配。需要进行一些小的调整。只需减去矩阵的起始位置并加1。此调整将使公式看起来像:

FOR ROW
AGGREGATE(15,6,ROW($C$2:$G$6)/($C$2:$G$6=$A$2),1)-ROW($C$2)+1

FOR COLUMN
AGGREGATE(15,6,COLUMN($C$2:$G$6)/($C$2:$G$6=$A$2),1)-COLUMN($C$2)+1

POC

答案 1 :(得分:1)

嵌套的For Next似乎合适。代码注释。

Sub finInArray()

    Dim i As Long, j As Long, arr As Variant, z As String, bFoundIt As Boolean

    'dimmension array
    ReDim arr(0 To 4, 0 To 4)

    'populate array
    For i = LBound(arr, 1) To UBound(arr, 1)
        For j = LBound(arr, 2) To UBound(arr, 2)
            arr(i, j) = Chr(65 + i + j)
        Next j
    Next i

    'designate char to find
    z = "H"

    'find in array
    For i = LBound(arr, 1) To UBound(arr, 1)
        For j = LBound(arr, 2) To UBound(arr, 2)
            If z = arr(i, j) Then
                bFoundIt = True
                'stop looping j
                Exit For
            End If
        Next j
        'if found, stop looping i
        If bFoundIt Then Exit For
    Next i

    'was it found?
    If i <= UBound(arr, 1) And j <= UBound(arr, 2) Then
        Debug.Print z & " found at arr(" & i & ", " & j & ")"
    End If

End Sub

答案 2 :(得分:1)

只是为了提供替代选择:

enter image description here

要获得该行:=SUMPRODUCT((A1:E5=B7)*ROW(A1:E5))

要获取该列:=SUMPRODUCT((A1:E5=B7)*COLUMN(A1:E5))

答案 3 :(得分:0)

我喜欢汇总,但是我以前并不熟悉。谢谢!!

发布问题后,我也找到了解决方案。

SUM((MMULT((rowfind_array),--(ISNUMBER(SEARCH("D",data))))))

其中rowfind_array是具有1 2 3 4 5的1x5矩阵,而data是其中包含字母或空格的5x5矩阵。如果找到,它将返回字母的行号。

搜索isnumber和“-”返回一个全为5的5x5数组,找到被搜索项的位置为1。将其与结果之前或之后的5x1或1x5数组相乘,然后对最终数组求和,得出的数字1-5表示我的行(或列)数字。

因此,列号只是切换查找器数组的尺寸,并将其放置在数据数组之后,而不是之前。

SUM((MMULT(--(ISNUMBER(SEARCH("D",data))),colfind_array)))

其中colfind_array是具有1 2 3 4 5的5x1矩阵,而data是其中包含字母或空格的5x5矩阵。如果找到,它将返回字母的列号。

一个简单的= if(countif(“ D”,data)= 1,......检查是否以字母开头,并且我都已完成。

我正在使用它来查找25x25数独难题助手上条目的行和列。如果字母在5x5块中,它将返回行和列,以消除未回答正方形的行和列。效果很好!

如果您还有其他解决此问题的聪明方法,请分享。 谢谢, 丹