【问题标题】:Is there a VBA method equivalent to the SQL SELECT query?是否有与 SQL SELECT 查询等效的 VBA 方法?
【发布时间】:2012-03-29 08:32:07
【问题描述】:

使用 Excel 工作表,我正在尝试搜索与其单元格值中的某些条件匹配的行。

我需要类似 SQL SELECT 查询的东西来通过 Excel 工作表进行搜索,VBA 中有这样的方法吗?一种返回与搜索条件匹配的行范围的方法。

我已尝试使用 Range AutoFilter 方法,但无法将返回的对象用作 Range 来访问返回行中的单元格。

如果我的问题看起来很奇怪或愚蠢,我真的很抱歉 Excel VBA 很抱歉

【问题讨论】:

  • VBA 中没有直接的等价物。您可以直接对 Excel 工作表运行 SQL 查询,但这会返回 ADO 记录集而不是匹配行的范围。但是,如果您的行具有唯一 ID,您可以从记录集映射回行。如果您使用自动过滤器,那么不匹配的行将被隐藏,您应该能够相当容易地获取剩余的行。
  • 在多列范围内搜索内容,还是在查询中查找适当字段?高级过滤器允许您使用标准进行这种类型的查询。
  • @Walidix:您始终可以使用 ADO 来查询电子表格...正如上面的评论者所说,它将返回一个 ADO 记录集,但您可以轻松找到一种方法来操作该集合,但是您需要.
  • ...您可以使用Range.CopyFromRecordset 方法将ADO Recordset 数据写入工作表,也可以使用ADO Recordset.GetRows 方法和Excel 的Transpose 方法将数据写入@ 987654324@对象。

标签: sql excel vba select autofilter


【解决方案1】:

看看这些功能

  • VLOOKUP
  • HLOOKUP - 与 VLookup 相同,但用于行
  • 查找()
  • INDEX() 和 MATCH()
  • OFFSET() 和 MATCH()

How to find data in an Excel table
How to Use VLOOKUP or HLOOKUP to find an exact match

希望这些帮助

【讨论】:

  • 这些函数不太适合解决问题,即返回一系列行。
【解决方案2】:

您可以使用 Union() 函数来创建一个范围。这是一个简化的示例(假设您要选择 A 列中的值为偶数的整行并将它们突出显示为黄色):

Sub UnionTest()

Dim myRange As Range
Dim cell As Range

For Each cell In Range("A1:A100")
    If cell Mod 2 = 0 Then
        If myRange Is Nothing Then
            Set myRange = cell
        Else
            Set myRange = Union(myRange, cell)
        End If
    End If
Next

myRange.EntireRow.Interior.Color = vbYellow

End Sub

请注意,在使用 union 之前,您需要检查范围是否为空(并为它着色,但为了使代码更易于阅读,我在这里省略了它),因此是 If-Then 语句。根据您要对每一行执行的操作,在 for-each 循环期间仅对行执行处理可能更有效。

【讨论】:

  • "在 i 上使用 union 之前,您需要检查范围是否为空" - 并且在着色之前 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多