【问题标题】:Excel VBA, multi parameter filter to return row IDExcel VBA,多参数过滤器返回行ID
【发布时间】:2014-08-22 21:21:19
【问题描述】:

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

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)

【问题讨论】:

  • 你的问题不是很清楚。请将您编写的代码添加到您的问题中,以便我们帮助您解决问题。
  • 这个问题很清楚。我想从 Sheet14 中选择 RowID,其中 Sheet14.ColumnA = a AND Sheet14.ColumnB = b AND Sheet14.ColumnC = c。我没有 VBA 示例。我发现什么都没有。 a,b,c 是我的算法返回的整数。例如,0、1 和 2。 Sheet14 有 A、B、C 列,它们有数字。我想选择其中包含 0,1,2 的 rowID。或者在这种情况下,返回我的算法给出的数字 a、b 和 c。
  • 我建议检查 Excel 公式的 DB 函数:office.microsoft.com/en-us/excel-help/… 特别是 DGET() 可能是您可以使用的。
  • DGET 不返回 rowID。
  • 我用代码示例更新了我的问题。此公式返回一个数字,但它不是正确的行号。我想在工作表上的 a 列中找到 int a (“物理驱动器详细信息”)、B 列中的 int b 和 C 列中的 c 的行。MSDN 和其他站点上的代码示例令人困惑,没有任何我想要的.

标签: algorithm excel search multiple-columns vba


【解决方案1】:

此函数将返回与为 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

【讨论】:

  • 这需要一些修改。我没有考虑直接调用 Sheets(x).Range(x).Value 。我所做的更改是对函数的参数要求: Function GetRowNumberByABCMatch(a As Integer, b As Integer, c As Integer) As Integer
  • 我将数字字符串 a、b、c 转换为整数。变体一直给我带来问题,所以我必须确保我完美地排列了我的数据类型。
  • 感谢您再次保存 VBA。
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多