admin管理员组

文章数量:1660533

目录

    • 概述
    • 何时使用 VBA 及使用原因
    • 64位VBA
    • Declare 语句
    • 编写适用于 32 位和 64 位 Office 的代码
    • VBA Declare 语句语法
    • VBA7 Declare 语句语法

概述

Office Visual Basic for Applications (VBA) 是事件驱动的编程语言,可以借助它扩展 Office 应用程序。

应用程序的 Office 套件具有一套完整的功能。 有多种不同的方法可以用来对文档、电子邮件、数据库、窗体、电子表格和演示文稿进行创作、格式设置和操纵。

Office VBA 编程的杰出之处在于,可以使用鼠标、键盘或对话框执行的每一个操作几乎也都可以使用 VBA 自动执行。
此外,若某个操作可以使用 VBA 执行一次,则可以同样轻松地执行该操作一百次。 实际上,自动执行重复任务是 Office VBA 最常见的用途之一。

除了可通过编写 VBA 脚本来加速执行日常任务外,还可以使用 VBA 为 Office 应用程序添加新功能,或以特定于业务需要的方式来提示文档用户并与之交互。

何时使用 VBA 及使用原因

当应用到用于设置格式或纠正问题的重复性解决方案时,VBA 非常高效。 举例来说,你是否曾经在 Word 中更改过每一页顶部的段落样式? 你是否曾经不得不对从 Excel 粘贴到 Word 文档或 Outlook 电子邮件中的多个表格重新设置格式? 你是否曾经必须对多个 Outlook 联系人进行相同的更改?

如果你有必须进行十多二十次的更改,则可能值得使用 VBA 来自动进行该更改。 如果是必须进行数百次的更改,那么当然值得考虑。 你可手动完成的几乎任何格式设置或编辑更改都可用 VBA 完成。
用户交互的扩展

有时,你希望鼓励或强迫用户以不属于标准应用程序的特定方式与 Office 应用程序或文档进行交互。 例如,你可能希望在用户打开、保存或打印文档时,提示他们执行一些特定操作。
Office 应用程序之间的交互

你是否需要将所有联系人从 Outlook 复制到 Word,然后以特定方式其进行格式设置? 或者,你是否需要将数据从 Excel 移到一组 PowerPoint 幻灯片? 有时,简单的复制和粘贴不能达到你的目的,或者速度太慢。 使用 VBA 编程同时与两个或更多 Office 应用程序的详细信息交互,然后根据一个应用程序中的内容修改另一个应用程序中的内容。
换另一种方式执行任务

VBA 编程是一种功能强大的解决方案,但并不总是最佳方法。 有时,有必要使用其他方式来实现你的目标。

关键问题是,是否有更简单的方法。 开始 VBA 工程之前,请考虑内置的工具和标准功能。 举例来说,如果你有非常耗时的编辑或布局任务,请考虑使用样式或加速键来解决问题。 你是否能执行一次任务,然后使用 CTRL+Y(重做)来重复操作? 你是否能使用正确的格式或模板创建新文档,然后将内容复制到该新文档中?

Office 应用程序功能强大;你需要的解决方案可能已经存在

64位VBA

Microsoft Visual Basic for Applications (VBA) 是随 Microsoft Office 一起提供的 Visual Basic 版本。 在 Microsoft Office 2010 中,VBA 包括使 VBA 代码能够在 32 位和 64 位环境中正常运行的语言功能。
Office 2010、2013 和 2016 版将安装 32 位版本。 在安装过程中,必须显式选择安装 64 位版本。 从 Office 2019 和 Microsoft 365 开始,默认为 64 位版本。

为了使 VBA 代码能够在 32 位和 64 位环境中正常工作,新增三个重要的功能,是 LongPtr 类型别名、LongLong 数据类型和 PtrSafe 关键字。

  • LongPtr

VBA 现在包括变量类型别名 LongPtr。 LongPtr 解析为的实际数据类型取决于正在运行的 Office 版本;LongPtr 在 32 位版本的 Office 中解析为 Long,LongPtr 在 64 位版本的 Office 中解析为 LongLong。 将 LongPtr 用于指针和句柄。

  • LongLong

LongLong 数据类型是仅在 64 位版本的 Office 中可用的带符号的 64 位整数。 对 64 位整数使用 LongLong。 转换函数必须用于为更小整型显式分配 LongLong(包括 64 位平台上的 LongPtr)。 不允许“LongLong”到更小的整数的隐式转换。

  • PtrSafe

    PtrSafe 关键字断言 Declare 语句可在 64 位版本的 Office 中安全运行。

Declare 语句

在模块级别用于声明对动态链接库中外部过程的引用, (DLL) 。

建议的语法是,将 Declare 语句与 PtrSafe 关键字一起使用。 只有在 Declare 语句中的所有数据类型都 (参数和返回值) 需要存储 64 位数量) 更新为将 LongLong 用于 64 位整型或将 LongPtr 用于 64 位整型或将 LongPtr 用于指针和句柄之后,包含PtrSafe 的声明语句才能在 32 位和 64 位平台上的 VBA 版本 7 开发环境中正常工作。 若要确保与 VBA 版本 6 及更低版本向后兼容,请使用以下构造:

#If VBA7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf

编写适用于 32 位和 64 位 Office 的代码

若要编写可在 32 位版本和 64 位版本的 Office 之间移植的代码,只需对所有指针和句柄值使用新的 LongPtr 类型别名即可,而不是 Long 或 LongLong。
LongPtr 类型别名将被解析为正确的 Long 或 LongLong 数据类型,具体取决于运行的是哪个 Office 版本。
若要使代码在 64 位版本的 Microsoft Office 中运行,所有 Declare 语句都必须包含 PtrSafe 关键字, 并且 Declare 语句中的所有数据类型 (参数和返回值,需要存储 64 位数量的) 必须更新为将 LongLong 用于 64 位整型或 将 LongPtr 用于指针和句柄。

VBA Declare 语句语法

语法 1

[ 公共 | 专用 ] Declare Sub nameLib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ]

语法 2

[ 公共 | 专用 ] Declare Function nameLib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ] [ Astype ]

VBA7 Declare 语句语法

语法 1

[ 公共 | 专用 ] Declare Sub nameLib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ]

语法 2

[ 公共 | 专用 ] Declare Function nameLib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ] [ Astype ]

比如

Declare Sub First Lib "MyLib" (X As Long)

Declare 语句的参数列表中不能包含固定长度字符串;仅可变长度字符串可传递到过程。 固定长度字符串可作为过程参数显示,但它们将在传递前转换为可变长度字符串。
将在调用外部过程时使用 vbNullString 常量,在此情况下,外部过程需要其值为零的字符串。 此字符串与零长度字符串 (“”) 是不一样的。

此示例演示如何在标准模块的模块级别使用 Declare 语句声明对动态链接库 (DLL) 中的外部过程的引用。 如果 Declare 语句为 Private,则您可在类模块中放置 Declare 语句。

' In Microsoft Windows (16-bit): 
Declare Sub MessageBeep Lib "User" (ByVal N As Integer) 
' Assume SomeBeep is an alias for the procedure name. 
Declare Sub MessageBeep Lib "User" Alias "SomeBeep"(ByVal N As Integer) 
' Use an ordinal in the Alias clause to call GetWinFlags. 
Declare Function GetWinFlags Lib "Kernel" Alias "#132"()As Long 
 
' In 32-bit Microsoft Windows systems, specify the library USER32.DLL, 
' rather than USER.DLL. Use conditional compilation to write 
' code that can run on either Win32 or Win16. 
#If Win32 Then 
    Declare Sub MessageBeep Lib "User32" (ByVal N As Long) 
#Else 
    Declare Sub MessageBeep Lib "User" (ByVal N As Integer) 
#End If 
 
 
' 64-bit Declare statement example: 
Declare PtrSafe Function GetActiveWindow Lib "User32" () As LongPtr 
 
' Conditional Compilation Example 
#If Vba7 Then 
     ' Code is running in  32-bit or 64-bit VBA7. 
     #If Win64 Then 
          ' Code is running in 64-bit VBA7. 
     #Else 
          ' Code is not running in 64-bit VBA7. 
     #End If 
#Else 
     ' Code is NOT running in 32-bit or 64-bit VBA7. 
#End If

本文标签: 实战基础officeVBA