【问题标题】:Making Long variables work in 64 bit AND 32 bit Excel VBA使 Long 变量在 64 位和 32 位 Excel VBA 中工作
【发布时间】:2014-07-28 12:44:18
【问题描述】:

我有一个相当复杂的 Excel VBA 项目,它在 32 位系统上运行良好,我现在正试图让它也适用于 64 位系统。我已经解决了所有的函数声明,但仍然遇到Long 数据类型的一些问题。

做了一些研究,我想出了这个(来自 MSDN 页面):

LongPtr 解析为的实际数据类型取决于它所运行的 Office 版本:LongPtr 在 32 中解析为 Long -bit 版本的 Office,LongPtr 在 64 位版本的 Office 中解析为 LongLong

但这是否意味着我可以将我的所有Dim 语句从

Dim x as Long

Dim x as LongPtr

我应该到处这样做吗?还是我弄错了?在某些情况下这不起作用或应该避免这种变化?

【问题讨论】:

  • 需要声明类型吗?如果您只是将变量保留为 Variant(不声明类型),您的代码可能会稍微慢一些,但 VBA 应该在您背后做艰苦的工作。换一种说法——你为什么不把它保留为long?你为什么要创建一个 64 位的变量,而它显然只需要 32 位长。我想知道你是否正在解决一个不存在的问题。也许你可以更清楚地解释(用一个小代码示例)为什么你认为你需要Long以外的东西。
  • 你不需要这样做。只需Use LongPtr for pointers and handles
  • 我同意@LưuVĩnhPhúc - 你想多了。
  • 嗯,没有。这并不意味着您将所有 DIM 语句从 Long 更改为 LongPtr。这意味着您已经在代码中使用了LongPtr该变量 的大小可以在 32 位和 64 位版本之间变化。您应该照原样使用Long。但是,无法帮助您找到问题的解决方案,因为您未能解释您遇到的问题 - 您说您“仍然遇到一些 Long 数据类型的问题。”,但是您显示的唯一“问题”是您误读了文档的含义。您对 Long 有什么问题
  • 有问题的变量是什么意思?他们持有什么?例如如果您使用 Long 来保存“行号”,那么您无需在实际场景中更改它。如果他们持有您从外部 API 接收的“句柄”并将其传递给外部 API,那么请考虑 LongPtr(“长指针”)

标签: variables excel vba


【解决方案1】:

我同意@Ken White 的回答。
备注(部分答案):

  • 您不会要求将您的 32 位项目转换为 64 位项目(这不适用于 32 位)。
  • 你总是需要声明变量类型(如果你是一个优秀的程序员)

您仍然可以在 Office 64 位中使用 Long 数据类型。它将兼容在 32 位和 64 位 Office 中运行。
但有时,您别无选择,因为某些对象的属性在 32 位和 64 位中不是相同的数据类型。 例如,如果您使用 ADO:

Dim rstTest As ADODB.Recordset 
  • rstTest.RecordCount 在 32 位 Office 上是 Long
  • rstTest.RecordCount 在 64 位 Office 上是 LongLong

如果您想将 rstTest.RecordCount 存储到 lngCount 变量中,您必须使用 LongPtr 声明此变量,否则它将无法在 32 位和 64 位上运行:

Dim lngCount As LongPtr  
lngCount = rstTest.RecordCount

【讨论】:

  • 您能否详细说明“您总是需要声明变量类型”?在两年多的 VBA 编程中,我得出结论,我将对 95% 的变量使用隐式类型。 python 也与类型无关......我同意你必须在“正确编程”中声明类型,但 VBA 是真正的脚本,而不是编程
  • 你总是需要它,只有当你是一个优秀的程序员:o) 这只是一个最佳实践。你可以不声明变量类型,但在这种情况下代码会更容易错误/错误。
【解决方案2】:

试试 LongLong。从规范来看,LongLong 似乎是 32 位类型 Long 的替代品。

【讨论】:

猜你喜欢
  • 2017-03-26
  • 1970-01-01
  • 2013-08-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2019-01-22
相关资源
最近更新 更多