vba - =MATCH() 等价于多维范围

标签 vba excel

我有一个 Excel 工作表,其中单元格 A1-C20==INT(RAND()*10)。这是我的数据范围。单元格 E1=1、E2=2、E3=3 等。这些是我试图找到的值。我设置单元格 F1==MATCH(E1,A:C,0)、F2==MATCH(E1,A:C,0) 等。

但是,所有 MATCH 函数都会返回 #N/A,因为输入范围是多维的。如何测试给定值(1、2、3、4 等)是否存在于多维范围(A1-C20)中?

/编辑:This function有效,但超出了我的需要。有没有办法让它只返回 TRUE 或 FALSE,具体取决于查找值是否在范围内?

Function OzgridLookup(Find_Val As Variant, Occurrence As Long, Table_Range As Range, _
 Offset_Cols As Long, Optional Column_Lookin As Long, Optional Row_Offset As Long) As Variant

Dim lLoop As Long
Dim FoundCell As Range

    If Column_Lookin = 0 Then 'No column # specified
        With Table_Range
            'Top left cell has Find_Val & Occurrence is 1
            If Table_Range.Cells(1, 1) = Find_Val And Occurrence = 1 Then
              OzgridLookup = .Cells(1, 1)(1, Offset_Cols + 1)
              Exit Function 'All done :)
            Else 'No column # specified so search all for _
                    nth Occurrence reading left to right
             Set FoundCell = .Cells(1, 1) 'Set cell variable for Find start
                For lLoop = 1 To Occurrence 'Loop as many times as Occurrences _
                 and each time Set "FoundCell" to start next Find from
                  Set FoundCell = _
                        Table_Range.Find(What:=Find_Val, After:=FoundCell, _
                            LookIn:=xlValues, LookAt:=xlWhole, _
                            SearchOrder:=xlRows, SearchDirection:=xlNext)
                Next lLoop
            End If
        End With
    Else 'column # specified
      With Table_Range.Columns(Column_Lookin) 'Work with column # specified
        Set FoundCell = .Cells(1, 1) 'Set cell variable for Find start
            For lLoop = 1 To Occurrence 'Loop as many times as Occurrences _
                 and each time Set "FoundCell" to start next Find from
                  Set FoundCell = _
                        Table_Range.Find(What:=Find_Val, After:=FoundCell, _
                            LookIn:=xlValues, LookAt:=xlWhole, _
                            SearchOrder:=xlRows, SearchDirection:=xlNext)
            Next lLoop
      End With
    End If

    OzgridLookup = FoundCell.Offset(Row_Offset, Offset_Cols)

End Function

最佳答案

您可以使用 COUNTIF 来执行此操作,因为您只想知道该号码是否存在(而不是其位置)。

=COUNTIF(A:C,E1)>0

如果存在则返回“TRUE”,如果不存在则返回“FALSE”。

只是为了好玩,这里有一个工作表函数解决方案,它返回与查找值匹配的单元格地址。它利用了您仅在 3 列中搜索的事实。

=IF(ISERROR(MATCH(E1,A:A,0)),IF(ISERROR(MATCH(E1,B:B,0)),IF(ISERROR(MATCH(E1,C:C,0)),"Not found.","C"&MATCH(E1,C:C,0)),"B"&MATCH(E1,B:B,0)),"A"&MATCH(E1,A:A,0))

我想我还应该引入一个 VBA 解决方案,它可以返回(连续)范围内的匹配位置。它从左到右一次查看一列,并返回找到的第一个匹配项的地址。

Public Function MDMATCH(srchfor As String, lookin As Range) As String

Application.Volatile
Dim RngArray() As Variant
Dim topleft As String
Dim tmpval As String

topleft = lookin.Address
topleft = Left(topleft, InStr(topleft, ":") - 1)
tmpval = "Not found."
RngArray = lookin

For i = 1 To UBound(RngArray, 2)
    If tmpval = "Not found." Then
        For j = 1 To UBound(RngArray, 1)
            If RngArray(j, i) = srchfor Then
                tmpval = Range(topleft).Offset(j - 1, i - 1).Address
                Exit For
            End If
        Next j
    Else
        Exit For
    End If
Next i
MDMATCH = tmpval
End Function

关于vba - =MATCH() 等价于多维范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7179115/

相关文章:

excel - 无所不在: Application defined or object defined error

excel - 将图像和表格链接到 MS Word

security - Excel VBA 代码的密码保护如何工作?

ms-access - 提交表单时出现 Access 错误 "you cannot compact the open database"问题

vba - Excel VBA : "Next Without For" Error

vba - Excel VBA 在 for 循环中删除行会丢失行

vba - 从模块和基于工作表的运行代码之间的区别

java - 是否可以使用java和Apache POI库逐行写入excel文件

c# - 为什么在执行 ASP .NET Excel 互操作时出现内存不足错误?

Excel 宏 - 测试是否已安装 Power Query for Excel Addin