如何使我的VBA代码与64位Windows兼容?

10 浏览
0 Comments

如何使我的VBA代码与64位Windows兼容?

我有一个在Excel 2007中开发的VBA应用程序,其中包含以下代码,以允许访问来自shell32.dll的ShellExecute函数:\nPrivate Declare Function ShellExecute Lib \"shell32.dll\" Alias \"ShellExecuteA\" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long\n最初我说:\n显然,该应用程序在64位版本的Windows上无法编译(仍在使用32位的Office 2007)。我认为这是因为Declare声明需要更新。我读到Office 2010引入了一个新的VBA运行时(VB7),并且它有一些可以在Declare语句中使用的新关键字,以使其在64位Windows上正常工作。VB7还有一些新的预定义编译器常量,用于支持条件编译,其中旧的或新的声明将根据应用程序是在32位还是64位Windows上运行而使用。然而,由于我被困在Office 2007中,我需要一个替代方案。我有哪些选择?(如果可能的话,我真的不想发布两个单独版本的应用程序)。\n然而,根据下面David的答案,我对我的Declare语句无法工作的情况有误解。它无法工作的唯一情况是在64位Windows上的Office 2010 64位。所以,Office 2007不是一个问题。

0
0 Comments

问题的原因是VBA代码在64位Windows上不兼容。解决方法是升级到适用于64位Office的版本。

在Office 2007上,VBA是32位的,所以没有任何问题。只有在Office 64位上才会出现问题,因为它有32位和64位的版本。

如果你只有一个Declare语句,即ShellExecute,那么一旦你使用64位Office,你就不需要做太多工作了。但是,当你无法运行你发布的程序时,支持用户实际上是不可行的!想象一下当他们报告一个bug时你会怎么做?

问题是由一位同事报告的,但他随后离开了办公楼,所以细节不清楚,我填补了错误的空白。

所以,澄清一下...我的现有Declare语句在Office 2007的32位和64位Windows上都可以工作吗?在32位Windows上的Office 2010上也可以工作吗?但是对于64位Windows上的Office 2010,我需要使用新的VB7功能 - 这意味着我需要一个特定于2010的版本的应用程序?没有一种可以向后兼容的方式,支持所有版本的方法吗(就像以前的Office版本一样)?

你应该能够只有一个版本的代码,但你真的需要自己测试一下。

谢谢你关于如何测试和支持应用程序的建议。我想我真正需要的是关于如何提问的建议(或者更确切地说,什么时候不要提问!)。

嗯,你可以更新和修改问题,但这样会让这个回答看起来很愚蠢。从我的角度来看,你最好提出一个新问题。我认为这个问题已经得到了解答。

0
0 Comments

问题出现的原因是因为VBA代码在64位Windows系统上不兼容。解决方法是将代码中的一些"Long"类型改为"LongPtr"类型。

以下是具体的解决方法:

1. 打开VBA编辑器,找到需要修改的代码。

2. 将代码中的"Long"类型改为"LongPtr"类型。例如,将上述代码中的"ByVal hwnd As LongPtr"和"ByVal nShowCmd As Long"替换为"ByVal hwnd As LongPtr"和"ByVal nShowCmd As LongPtr"。

3. 保存并关闭VBA编辑器。

通过以上步骤,您的VBA代码将与64位Windows系统兼容。这样,您就可以在64位Windows系统上顺利运行您的VBA代码了。

以上解决方法来源于http://www.cadsharp.com/docs/Win32API_PtrSafe.txt

0
0 Comments

问题的原因是在64位Windows上运行的VBA代码与32位Windows上的代码不兼容。解决方法是在代码中使用条件编译来区分不同的操作系统,并根据操作系统的不同使用不同的函数声明。

具体来说,解决方法是在代码中使用条件编译指令#If VBA7 Then来判断是否为64位系统,如果是,则使用PtrSafe修饰函数声明。如果不是64位系统,则不使用PtrSafe修饰函数声明。

另外,如果需要在32位和64位系统之间保持兼容性,建议使用LongPtr来替代Long作为函数声明的参数类型。

需要注意的是,PtrSafe在旧版的VB6中是无效的命令,但在64位系统中仍然需要使用条件编译来区分不同的操作系统。

这些解决方法来自于MSDN关于VB7和PtrSafe声明的文档。对于需要在64位系统上运行的旧版电子表格,简单地使用条件编译来区分不同的操作系统即可解决问题,不需要额外使用#if Win64指令。

通过使用条件编译和适当地修饰函数声明,可以使VBA代码与64位Windows兼容。

0