向 Visual Studio 2005 Tools for Office 迁移时,将 VBA 代码转换为 Visual Basic .NET
Dale Oberg
ArtinSoft.com
适用于:
Microsoft Visual Studio 2005
Microsoft Visual Studio 2005 Tools for the Microsoft Office System
Microsoft Visual Basic .NET
Microsoft Visual Basic for Applications
Microsoft Office 2003 Editions
Microsoft Office Excel 2003
Microsoft Office Word 2003
摘要:向 Microsoft Visual Studio 2005 Tools for the Microsoft Office System 迁移时,将代码从 Visual Basic for Applications 转换为 Visual Basic .NET。本文档重点说明迁移原因、主要的代码转换问题,以及有关进一步详细信息的其他资源。
注 本文是预发布文档,所描述内容在将来的版本中有可能会更改。Microsoft Visual Studio 2005 Tools for the Microsoft Office System 的 Beta 版包含在 Microsoft Visual Studio 2005 的 Beta 版之中。
![*](http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif)
本页内容
![]() |
Visual Studio 2005 Tools for Office 简介 |
![]() |
为什么要迁移到 Visual Studio 2005 Tools for Office? |
![]() |
将 VBA 代码转换为 Visual Studio 2005 Tools for Office 中的 Visual Basic .NET 代码 |
![]() |
小结 |
![]() |
其他资源 |
![]() |
关于作者 |
Visual Studio 2005 Tools for Office 简介
Microsoft Visual Basic for Applications (VBA) 是已经使用多年的 Microsoft Office 应用程序的环境和语言。Microsoft Office 2003 Editions 包括一个用于构建应用程序的新环境,称为 Microsoft Visual Studio Tools for Office(Visual Studio Toolsfor Office),它基于 Microsoft .NET Framework。
与 VBA 相比,Microsoft Visual Studio Tools for the Microsoft Office System 2003 版具有更多优势,而 Microsoft Visual Studio 2005 Tools for the Microsoft Office System 增强了这些功能,从而提高用户的工作效率。
本文探究将 VBA 代码迁移到 Microsoft Visual Basic .NET 和 Visual Studio 2005 Tools for Office 时需要解决的各种编码问题。本系列的后续文章会重点介绍如何将全部项目从 VBA 迁移到 Visual Studio 2005 Tools for Office,还会讨论为了充分利用 Visual Studio 2005 Tools for Office 应该为 VBA 项目考虑的体系结构问题。
为什么要迁移到 Visual Studio 2005 Tools for Office?
从 VBA 迁移到 Visual Studio 2005 Tools for Office 可以使您获得许多好处,例如:
提高了开发效率。从 VBA 迁移到 Visual Studio 2005 Tools for Office 的一个原因是可以访问 Visual Studio 2005 Tools for Office 和 Microsoft Visual Studio 2005 之间的集成开发环境。Visual Studio 是最丰富、最成熟的可用开发环境之一,它可以提高编码和测试的效率。
改进了安全模型。内置于公共语言运行库 (CLR) 中的安全模型有助于托管解决方案的实施。
可以更轻松地进行部署和版本控制。托管解决方案允许更灵活的部署选项,以及简化的部署和更新。
添加了来自 Microsoft .NET Framework 的功能。对 CLR 基类库的访问使您能够利用其新功能,例如 XML 读取器、ADO.NET 以及 Web 服务的简化使用。
提高了代码重用率。Visual Basic .NET 是一种完全面向对象的语言,有助于代码重用。
可以更轻松地进行集成。通过 Web 服务,.NET Framework 促进了与其他应用程序的集成。
将 VBA 代码转换为 Visual Studio 2005 Tools for Office 中的 Visual Basic .NET 代码
下面列出了 VBA代码和 Visual Studio 2005 Tools for Office 中的 Visual Basic .NET 代码之间的部分差异。
数据类型
在 Visual Basic .NET 中,某些数据类型(如 Variant、Integer、Long、Currency 以及其他类型)已经更改或过时。例如,VBA 中的 Integer 等效于 Visual Basic .NET 中的 Short。另外,VBA 中的 Long 等效于 Visual Basic .NET 中的 Integer。
固定长度字符串
由于更改后允许 Visual Basic .NET 数组和结构(先前称为用户定义类型)完全兼容其他 Visual Studio 语言,因此固定长度字符串在该语言中不再受支持。如果固定长度字符串不需要确切长度,则可以将其转换为常规的 Visual Basic .NET String,如以下代码所示。
' VBAcode Dim MyFixedLengthString As String * 100 ' Visual Basic .NETcode Dim MyFixedLengthString As String
然而,如果固定长度字符串必须是特定的字节长度,则可以将其转换为字节数组,如以下代码所示。
' Visual Basic .NETcode Dim MyFixedLengthString(100) As Byte
文本值取代 Windows 常量
如果您使用文本值取代基于 Microsoft Windows 的已定义常量,则在向 Visual Studio 2005 Tools for Office 迁移时必须执行更多的工作。在使用文本值的情况下,您必须确定基于 Windows 的常量,然后再使用基于 Visual Studio 2005 Tools for Office 的等效常量。例如:
' VBAcode btnRecalculate.MousePointer = 10 ' This is the literal constant for vbUpArrow ' Visual Basic .NETcode btnRecalculate.Cursor = System.Windows.Forms.Cursors.UpArrow
枚举
在 Visual Basic .NET 中,您必须完全限定枚举常量。在转换 VBA 代码时,您必须将完全限定的枚举名称添加到枚举常量中。例如:
' VBAcode Application.ActiveDocument.Paragraphs(1).Alignment = wdAlignParagraphRight ' Visual Basic .NETcode ThisApplication.ActiveDocument.Paragraphs(1).Alignment = _ Word.WdParagraphAlignment.wdAlignParagraphRight
数组
在 Visual Basic .NET 和 VBA 中,数组维数的默认下限为 0。在 VBA 中,您可以使用 Option Base 将下限值更改为另一个数字,通常是 1。Visual Basic .NET 不支持 Option Base 语句。
对带有 Option Base 1 的数组进行迁移的一种方法是,将 1 添加到数组维数,并且目标代码在索引 0 处包含一个额外插槽。大多数情况下,基于 .NET Framework 的代码会消耗少量内存,不过可以继续工作。
下面是使用这种数组的一个代码示例。
' VBAcode Option Base 1 Private Sub Test() Dim myArr(10) As Integer ' array is indexed 1..10 addOne myArr End Sub Sub addOne(arr) For i = 1 To 10 arr(i) = arr(i) + 1 Next i End Function
您可以将这段代码转换为 Visual Basic .NET,如下所示:
' Visual Basic .NETcode Private Sub Test() ' array is indexed 0 to 10 and has an unused element at 0. Dim myArr(11) As Short addOne(myArr) End Sub Sub addOne(ByRefarr() As Short) Dim i As Integer For i = 1 To 10 arr(i) = arr(i) + 1 Next i End Sub
不可以这样做的唯一情况是,VBA 代码依赖于值为 1 的数组下限,而不是 0。例如,代码可以使用 LBOUND 函数确定数组的第一个索引,也可以使用 LBOUND 和 UBOUND 函数组合确定数组的大小。
当然,对使用 Option Base 的数组进行迁移的另一个选择是重写所有数组索引值,以使它们都从零开始。这可以最有效地利用内存,不过在迁移时可能需要更多工作,而且要更加小心。
数组的另一个问题是,在 Visual Basic .NET 中,对先前未设置维数的数组(使用 Dim)不能再重新设置维数(使用 ReDim)。在 Visual Basic .NET 中,使用新秩重新声明数组时会出现其他的 ReDim 问题。例如,下面的代码可以在 VBA