Excel VBA,多参数过滤器返回行ID

时间:2014-08-22 21:21:19

标签: algorithm excel-vba search multiple-columns vba

我目前有一个算法可以操作excel工作簿中的第24页上的数据。我有3个整数,a,b和c,来自第24页的数据,我需要使用它们在工作表14上返回一个唯一的行ID.A,B和C,每个代表它们对应的列(范围)在片材14E1上:来自片材24的Int a在片材14上的A列中。在b列中为Int b,在c中为c。组合的数字将始终从14返回单个行ID,在这种情况下,整数行。我很难用Filter,evaluate和一堆其他Excel函数编写语句。有没有人知道如何从在一张纸上执行的算法启动脚本,只需在表14中使用'得到三个搜索数字a,b,c?

row = Sheets("Physical Disk Details").Columns("A").Find(what:=a, LookIn:=xlValues, lookat:=xlWhole) * Sheets("Physical Disk Details").Columns("B").Find(what:=b, LookIn:=xlValues, lookat:=xlWhole) * Sheets("Physical Disk Details").Columns("C").Find(what:=c, LookIn:=xlValues, lookat:=xlWhole)

1 个答案:

答案 0 :(得分:0)

此函数将返回找到的第一个行号,它与为a,b和c提供的行号完全匹配。它演示了最简单的Range迭代和If / Then测试之一,它构成了您将为Excel VBA找到的大多数数据模式搜索子例程的基础。有一些方法可以简化此代码,但它演示了基本原则。

如果您阅读此代码的每一行并了解所有这些代码的作用,您可以使用这些原则来完成大多数任务,甚至模糊地与它相似。

Function GetRowNumberByABCMatch(a As Integer, b As Integer, c As Integer) As Integer
    Dim lastRowInDataSet As Integer
    Dim i As Integer

    'get last row containing data in column 1
    lastRowInDataSet = Sheets("Physical Disk Details").Cells(Rows.count, 1).End(xlUp).Row

    'i = current row number, start at row 1
    For i = 1 To lastRowInDataSet
        If Sheets("Physical Disk Details").Range("A" & i).Value = a _
                And Sheets("Physical Disk Details").Range("B" & i).Value = b _
                And Sheets("Physical Disk Details").Range("C" & i).Value = c Then
            'all fields match, return the current row number
            GetRowNumberByABCMatch = i
            'stop processing and return because we found a single match
            Exit Function
        End If
    Next i

    'didn't find a matching row, return -1
    GetRowNumberByABCMatch = -1
End Function