为什么我的带有相对引用的 VBA 返回不正确的引用?

Why is my VBA with relative references returning incorrect references?

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

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

这里是子中的第一行:

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

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

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

接下来我需要做的是从各种单元格中提取值,就像这样:

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

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

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

这可以通过 select 在文档中输入您要搜索的词,然后按 [F1] 键,这将带您到 Microsoft 文档页面(即,如果您 select Row 然后按 [F1] 将带您到页面 Range.Row Property (Excel)

阅读 RowOffset 的文档将帮助您理解这些 Range.Properties 和您从代码中获得的 returns。

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

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

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

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

这个returns字段的值(column)18,row13的QuerySpecsrange

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

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