我注意到Office 2010自带Visual Basic for Applications 7.0。然而,我似乎找不到关于所做更改的文档。是否有摘要来概述这些变化或任何描述差异的资源?
我注意到Office 2010自带Visual Basic for Applications 7.0。然而,我似乎找不到关于所做更改的文档。是否有摘要来概述这些变化或任何描述差异的资源?
在VBA6和VBA7之间,没有太多改变。VBA7是为了支持64位的Office和Windows版本而推出的(关于这些差异,请参见下文)。以下是关键更改:
64位支持,主要用于API调用。这既用于使您的代码与您的操作系统/Office版本配合使用,也用于与其他人的代码配合使用(例如使用Office 2003 / WinXP的用户)。
如果您使用的是64位的Windows版本,但使用的是32位版本的Office,则可以像下面这样声明API调用。
#If Win64 Then Declare PtrSafe Function GetTickCount64 Lib "kernel32"() As LongLong #Else Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long #End If
如果您使用的是64位的Windows版本,并且使用的是64位版本的Office,则可以像下面这样声明API调用。
#If VBA7 Then Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As LongPtr #Else Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _ lpClassName As String, ByVal lpWindowName As String) As Long #End If
为了支持此功能,引入了以下内容:
三个新的关键字(2个数据类型和1个修饰符):LongPtr
、LongLong
和PtrSafe
一个新函数:CLngLng()
(例如Int64)
上述新编译常量:VBA7
和Win64
这篇文章介绍了VBA 7在Office 2010中的变化:
VBA7兼容Office的64位版本。
还有其他的变化...我收到用户在现场报告说,2007年正常运行的代码现在不再起作用并显示错误。
例如,在VBA6(Excel 2007)中可以正常工作。
PRINT STRING$(80,"=")
mynewdata = MID$(mydata, 15,4)
它打印出由"="字符组成的一行作为可视的分隔线,然后查看 mydata,跳过15个字符并获取其中的4个,结果存储在mynewdata中。 它在VBA7(Excel 2010)中失败。
我找到了一个潜在的解决方法...
PRINT VBA.STRING$(80,"=")
mynewdata = VBA.MID$(mydata, 15,4)
或者
PRINT VBA.STRING(80,"=")
mynewdata = VBA.MID(mydata, 15,4)
VBA7
,并在所有需要指针大小参数的地方使用LongPtr
。 - GSergGetTickCount
/GetTickCount64
使得它变得更加混乱,因为它们是两个不同的函数,而不是同一个函数的两个变体,并且它们都存在于32位和64位架构上。@Syler的评论在精神上是正确的,但从技术上讲是错误的,因为GetTickCount
的返回值始终是Long
,无论Windows的位数如何,因此不应使用LongPtr
进行声明。 - GSerg