excel - 为什么我的具有相对引用的 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:类型不匹配。有人对如何实现我的目标有任何建议吗?谢谢!
解决方案
我建议阅读您尝试使用的资源的文档。
这可以通过选择您要在文档中搜索的单词来完成,然后按 [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
) row
18、13 的值range
strStartCell = QuerySpecs.Cells(13, 18).Value2
在Run-time error 13: Type mismatch
尝试将数组分配给字符串变量时生成。
推荐阅读
- python - 为什么我的 dash 应用程序结构会计算两次数据?
- mysql - MySQL,加入您需要第二个表中的最大值的表
- .net-core - Log4net AdoNetAppender 滚动表
- oauth-2.0 - GoDaddy Office 365 OAuth2 for SMTP 失败,身份验证不成功
- amazon-sqs - 适用于 SQS 的 AWS 监控解决方案
- c++ - 为什么 map 在 (switch) 情况下会变空?
- react-native - 使用 Redux 工具包中的 createEntityAdapter 时,如何在类组件中将实体作为数组获取?
- ansible - 如何从 tar.gz 文件安装 Ansible Galaxy 角色?
- mysql - SQL 数据库在 SELECT 中冻结超过 7 个 JOIN [查询需要永远加载]
- node.js - 使用 EventSource 时 504 网关超时 240000 毫秒