首页 > 解决方案 > 为什么我的具有相对引用的 VBA 返回不正确的引用?

问题描述

我正在尝试开发一个向我们的 4D 数据库询问信息的 Excel 应用程序。为此,我构建了一个查询构建器,它可以工作。现在我想让它更通用,这样当我调用查询生成器时,我可以向它传递一个存储查询所基于的表和字段的范围。这是我调用 sub 并将参数传递给它的行:

QueryDatabase Worksheets("TablesAndFields").Range("A2:R20"), Worksheets("TablesAndFields"), Worksheets("Import")

这是 sub 中的第一行:

Sub QueryDatabase(QuerySpecs As Range, QuerySheet As Worksheet, TargetSheet As Worksheet)

我需要做的一件事是让 VBA 找出各个列中最后一个字段的行。这是我当前的代码:

LastRowReportTables = QuerySpecs.Offset(0, 3).End(xlDown).Row
LastRowQuery = QuerySpecs.Offset(0, 6).End(xlDown).Row
LastRowSort = QuerySpecs.Offset(0, 14).End(xlDown).Row

这将为所有 3 个返回相同的值(范围的第二行)。无论哪些单元格中有值,它似乎都会这样做。例如,在上面指定的范围的情况下,它将返回 3。如果范围是“A22:R40”,它返回 23。我真正需要的是它返回相对于它在范围中的位置的行,但我如有必要,可以通过减去比结果少 20 的最大倍数来伪造它。(我正在格式化我的查询生成器以适应 19 行 + 一个缓冲区行。)到目前为止,我什至无法让它为 LastRow 变量返回不同的结果。

除了您在上面看到的 Offset 方法之外,我还尝试将它放在 With QuerySpecs... End With 块中。我不记得确切的结果,但我也无法让它发挥作用。

接下来我需要做的是从各种单元格中提取值,如下所示:

strStartCell = QuerySpecs.Offset(0, 18).Value

这会引发运行时错误 13:类型不匹配。有人对如何实现我的目标有任何建议吗?谢谢!

标签: exceloffsetvba

解决方案


我建议阅读您尝试使用的资源的文档。

这可以通过选择您要在文档中搜索的单词来完成,然后按 [F1] 键,这将带您到 Microsoft 文档页面(即,如果您选择Row并按 [F1] 将带您到页面Range.Row 属性 (Excel)

阅读文档Row并将Offset帮助您了解这些Range.Properties以及您从代码中获得的回报。

要获取一列范围内的最后一个非空行,假设该范围内的所有数据都是连续的(即具有内容的行之间没有空单元格),请使用以下行:

With WorksheetFunction
    LastRowReportTables = .CountA(QuerySpecs.Columns(4))
    LastRowQuery = .CountA(QuerySpecs.Columns(7))
    LastRowSort = .CountA(QuerySpecs.Columns(15))
End With

注意:如果“QuerySpecs”range是一种数据库,字段中的所有列应该有相同的记录数,如果是这样,只获取一个字段的最后一行就足够了。

要获取范围内单元格的值,请使用以下行:

这将返回 QuerySpecs 的字段 ( column) row18、13 的值range

strStartCell = QuerySpecs.Cells(13, 18).Value2

Run-time error 13: Type mismatch尝试将数组分配给字符串变量时生成。


推荐阅读