VBA 6.0和VBA 7.0之间有什么区别?

rom*_*das 44 vba ms-office office-2010

我注意到Office 2010附带了Visual Basic for Applications 7.0.但是,我似乎无法找到有关所做更改的文档.有没有人有变化的摘要,或描述差异的任何资源?

Tod*_*ain 44

VBA6和VBA7之间没有太多变化.引入VBA7是为了支持Office和Windows的64位版本(请参阅下面的这些差异).以下是主要变化:

  1. 64位支持,主要用于API调用.这用于使您的代码与您的OS/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. 为了支持这一点,有:

    • 三个新的关键字(2种数据类型和1个改性剂): LongPtr,LongLongPtrSafe

    • 一个新功能 :( CLngLng()即Int64)

    • 上面使用的新编译常量:VBA7Win64

  • @Todd我只想指出,LongPtr是一个别名,当使用64位或32位字时,它指向正确的数据类型.因此LongPtr将指向64位办公室的LongLong和32位办公室的Long.以下声明适用于32位和64位办公室.声明PtrSafe函数GetTickCount Lib"kernel32"()作为LongPtr (7认同)
  • 第一个代码示例中“GetTickCount”/“GetTickCount64”的具体选择让人更加困惑,因为它们是两个不同的函数,而不是同一函数的两个变体,而且它们都存在于 32 位和 64 位架构上。[@Syler 的评论](/sf/ask/215064951/ Between-vba-6-0-and-vba-7-0#comment33440701_3073704),虽然其正确性不幸的是,技术上是错误的,因为无论 Windows 位数如何,“GetTickCount”的返回值始终是“Long”,因此不应使用“LongPtr”进行声明。 (3认同)

Lun*_*tik 10

MSDN上的这篇文章更多地介绍了Office 2010的VBA 7中的更改:

http://msdn.microsoft.com/en-us/library/ee691831(loband).aspx#odc_office2010_Compatibility32bit64bit_IntroducingVBA7CodeBase

  • 虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接.如果链接的页面发生更改,则仅链接的答案可能会无效. (6认同)
  • 你当然是正确的,但请记住,这是SO的相对早期的答案,在此类公约真正编纂之前.想想接受的答案,这个几乎涵盖的东西:) (2认同)

buc*_*ova 7

VBA7与64位版本的Office兼容.