我在随机位置有一个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矩阵
答案 0 :(得分:1)
假设:
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
答案 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)
答案 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块中,它将返回行和列,以消除未回答正方形的行和列。效果很好!
如果您还有其他解决此问题的聪明方法,请分享。 谢谢, 丹