为什么我的VBA与相对引用返回错误的引用?

时间:2018-05-05 01:43:00

标签: excel-vba offset vba excel

我正在尝试开发一个Excel应用程序,要求我们的4D数据库获取信息。为此,我构建了一个查询构建器,它可以工作。现在我想让它更通用,这样当我调用查询构建器时,我可以传递一个范围,其中存储查询所基于的表和字段。这是一行我调用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:类型不匹配。有没有人对如何实现我的目标有任何建议?感谢您!

1 个答案:

答案 0 :(得分:0)

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

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

阅读RowOffset的文档将有助于您了解这些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

的字段{row)18,range 13的值
strStartCell = QuerySpecs.Cells(13, 18).Value2

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