为什么我的带有相对引用的 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)。
阅读 Row
和 Offset
的文档将帮助您理解这些 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,row
13的QuerySpecsrange
strStartCell = QuerySpecs.Cells(13, 18).Value2
尝试将数组分配给字符串变量时生成Run-time error 13: Type mismatch
。
我正在尝试开发一个 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)。
阅读 Row
和 Offset
的文档将帮助您理解这些 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,row
13的QuerySpecsrange
strStartCell = QuerySpecs.Cells(13, 18).Value2
尝试将数组分配给字符串变量时生成Run-time error 13: Type mismatch
。