适用于: Microsoft® "Visual Studio Tools for Office" Beta Microsoft Office Word 2003 Beta 2 Microsoft Office Excel 2003 Beta 2 Microsoft Visual Basic® for Applications (VBA) Microsoft Visual Studio® .NET 2003 Microsoft Visual Basic .NET
摘要:介绍将 Microsoft Office 解决方案从 Visual Basic for Applications (VBA) 转换到 Visual Basic .NET 中时需要考虑的问题。概述了两者之间的差异,并使用来自 Word 和 Excel 的示例来说明如何使用“Visual Studio Tools for Office”转换代码。(本文包含一些指向英文站点的链接。)
本文介绍将 Microsoft® Visual Basic® for Applications (VBA) 代码转换到 Microsoft Visual Basic .NET 时开始可能会遇到的问题。并帮助您学习当从 VBA 代码(非托管代码)迁移到由 Microsoft .NET Framework 管理的代码(托管代码)时,需要进行哪些更改。首先讨论是否将代码转换到 Visual Basic .NET 的依据。然后介绍转换代码时会出现的多种变化,包括集成开发环境 (IDE) 中的差异、语言差异、用户窗体差异、安全性差异和部署差异。最后向您展示如何使用 Microsoft 的“Visual Studio Tools for Office”将现有 Word 和 Excel 代码模块中的 VBA 代码转换到 Visual Basic .NET。
是否应该将 VBA 代码转换到 Visual Basic .NET
在开始将 VBA 代码转换到 Visual Basic .NET 之前,您可能希望了解两者的优缺点。使用“Visual Studio Tools for Office”,您可以在 Microsoft Office Word 2003 文档和 Microsoft Office Excel 2003 工作簿背后编写托管代码。能够使用自定义属性链接到托管代码程序集的文档或工作簿被称为具有“托管代码扩展”功能。使用托管代码扩展,您可以利用 Microsoft Visual Studio® .NET 和 Microsoft .NET Framework 中的资源,包括安全性、部署、完全支持 XML Web Service、结构化异常处理和 Microsoft Windows® 窗体。但是,也可能存在因没有转换 VBA 代码而受益的情况。
当考虑是否将 VBA 代码转换到 Visual Basic .NET 时,请考虑以下信息:
使用 VBA...
当代码需要与文档紧密绑定时;例如,代码需要与文档一起移动时。
当组织中存在部署限制时,例如,.NET Framework 对最终用户不可用时。
当需要使用 Excel 自定义函数时。
当需要创建截取 Word 自有命令的方法时。
当自定义除 Microsoft Office Word 2003 和 Microsoft Office Excel 2003 以外的 Microsoft Office 应用程序时。“Visual Studio Tools for Office”不支持这些应用程序。
使用 Visual Basic .NET...
当需要利用 Visual Studio .NET 环境(包括服务器资源管理器和增强的智能感知功能)时。
当您的解决方案可以从 .NET Framework 的全部资源中受益时,例如,内置 Web 服务支持、更容易进行 XML 分析和可以访问 .NET Framework 中的所有类。
当需要更简单的代码维护时。程序集中的代码与文档分离,多个文档能够引用同一个程序集。
当需要灵活的部署选项时。程序集可以部署为网络共享;此后,当用户每次打开连接到网络的 Excel 或 Word 文档时,可以立即使用程序集中更新后的代码。
Set 关键字:在 VBA 中,区分对象赋值和对象的默认属性赋值时,需要使用 Set 关键字。由于 Visual Basic .NET 不支持默认属性,因此不需要使用 Set 关键字,也不再支持该关键字。以下示例说明了这一变化:
' VBA
Dim mySelection as Selection
Dim myOtherSelection as String
Set mySelection = Selection
myOtherSelection = Selection
' Visual Basic .NET
Dim mySelection As Word.Selection
Dim myOtherSelection As String
mySelection = ThisApplication.Selection
myOtherSelection = ThisApplication.Selection.Text
数据访问:Microsoft Visual Basic .NET 不支持数据访问对象 (DAO) 和远程数据对象 (RDO) 数据源的数据绑定。为了向后兼容,支持 ActiveX® Data Objects (ADO) 数据绑定;但您可能会考虑转换到 ADO.NET。有关详细信息,请参阅 Comparison of ADO.NET and ADO。
将用户窗体转换成 Windows 窗体:VBA 用户窗体不能被复制或导入到 Visual Studio .NET 中。大多数情况下,您需要重新将窗体创建为 Windows 窗体。拖放控件与 VBA 中创建窗体时相同,但对 Windows 窗体控件的事件处理程序的处理不同。获得的许多新功能使创建窗体比以前更容易,例如:
部署 Visual Basic .NET 应用程序与部署 VBA 应用程序存在非常大的差异。“Visual Studio Tools for Office”项目通常由两个文件组成:包含编译代码的程序集和包含指向该程序集的自定义属性的文档(Excel 工作表或者是 Word 文档或模板)。文档和程序集被单独进行部署。与在文档中嵌入代码的许多 VBA 项目不同,在“Visual Studio Tools for Office”项目中,程序集可以存储在共享的网络位置中,也可以被复制到每个最终用户的计算机中。在网络位置中部署程序集的优点在于更易于更新代码,因为网络共享中只有一份程序集。用户可以修改和自定义自己的文档,每次打开文档时,可以访问更新后的程序集。这会自动发生,无需用户的参与。
转换 VBA 代码
本节介绍如何使用“Visual Studio Tools for Office”将 VBA 代码转换到 Visual Basic .NET,并列举分别来自 Word 和 Excel 的两个例子。附录中提供了这两个例子的完整 Visual Basic .NET 代码。
Word 中的 VBA 代码示例
以下 Word 宏创建一个新样式(如果该样式不存在),然后将该样式应用到活动文档中所有左对齐的段落。
' VBA
Private Sub Document_Open()
Dim currentParagraph As Paragraph
' 调用 CreateStyle,传递样式名称和有关属性。
CreateStyle "MyNewStyle", "Arial", 9.5, True, False, 0.5
' 将样式应用到每个左对齐的段落。
For Each currentParagraph In ActiveDocument.Paragraphs
If currentParagraph.Alignment = wdAlignParagraphLeft Then
currentParagraph.Style = "MyNewStyle"
End If
Next currentParagraph
End Sub
Private Function StyleExists(styleName As String) As Boolean
Dim currentStyle As Style
Dim stylePresent As Boolean
stylePresent = False
' 检查活动文档中是否存在该样式。
For Each currentStyle In ActiveDocument.Styles
If currentStyle.NameLocal = styleName Then
stylePresent = True
Exit For
End If
Next currentStyle
' 返回。
StyleExists = stylePresent
End Function
Private Sub CreateStyle(styleName As String, styleFontName As String, _
styleFontSize As Single, styleBold As Boolean, _
styleItalic As Boolean, Optional styleFirstLineIndent As Single, _
Optional styleSpaceBefore As Single)
' 检查样式是否已经存在。
If Not StyleExists(styleName) Then
' 通过传递的属性创建样式。
ActiveDocument.Styles.Add styleName
With ActiveDocument.Styles(styleName)
.Font.Name = styleFontName
.Font.Size = styleFontSize
.Font.Bold = styleBold
.Font.Italic = styleItalic
.ParagraphFormat.FirstLineIndent = _
InchesToPoints(styleFirstLineIndent)
.ParagraphFormat.SpaceBefore = _
InchesToPoints(styleSpaceBefore)
.ParagraphFormat.Alignment = wdAlignParagraphLeft
End With
End If
End Sub
创建 Visual Basic .NET 项目
要转换 VBA 代码,必须使用“Visual Studio Tools for Office”在 Visual Studio .NET 中创建 Word 文档项目。
要创建新的 Word 文档项目
从 File(文件)菜单中,指向 New(新建),然后单击 Project(项目)。
在 New Project(新建项目)对话框中,展开 Microsoft Office 2003 Projects(Microsoft Office 2003 项目),然后选择 Visual Basic Projects(Visual Basic 项目)。
在 Templates(模板)窗格中,选择 Word Document(Word 文档)。
将项目命名为 Create Word Style(创建 Word 样式),然后单击 OK(确定)。
当出现 Microsoft Office Project Wizard(Microsoft Office 项目向导)时,确保选择了 Create new document(创建新文档),然后单击 Finish(完成)。
然后向 Word 文档添加文本。
要向文档添加文本
打开 Microsoft Office Word 2003 中的 Create Word Style.doc 文档。
提示:您可能已经注意到 Visual Studio .NET Tools(工具)菜单包含 Upgrade Visual Basic 6 Code(升级 Visual Basic 6 代码)菜单项。此工具将转换 Visual Basic 6 语言差异;但是,“Visual Studio Tools for Office”使用 Microsoft Office Word 2003 主互用程序集 (PIA) 作为访问 Word 对象模型的方法(托管代码与 COM 互用的方式),而不能使用升级工具来解决。相反,问题和警告将以注释形式出现在整个代码中。利用当鼠标指针悬停在含有蓝色波浪线的文本上时出现的智能感知功能,将 VBA 代码直接粘贴到 Visual Studio .NET IDE 中时,也可以获得同样的信息。有关 Office 主互用程序集的详细信息,请参阅 Working with the Office XP Primary Interop Assemblies。
转换代码
将 VBA 代码复制到新项目中后,就可以开始转换代码了。
要在 Visual Basic .NET 中转换代码
在 StyleExists 函数的声明语句中:
Dim currentStyle as Style
Dim stylePresent As Boolean
stylePresent = False
Style 对象属于 Word 命名空间,因此必须将其更改为 Word.Style 限定引用。也可以将 stylePresent 的声明语句与将其赋值为 False 的语句合并成一个语句:
Dim currentStyle as Word.Style
Dim stylePresent As Boolean = False
当使用“Visual Studio Tools for Office”创建 Word 文档项目时,将创建 Word.Document (ThisDocument) 和 Word.Application (ThisApplication)。ActiveDocument 必须被更改为 ThisApplication.ActiveDocument。
提示:可以在整个代码中通过执行全局查找和替换操作来快速更改 ActiveDocument。
For Each currentStyle in ThisApplication.ActiveDocument.Styles
提示:如果只使用一个文档,ThisDocument 也可以指活动文档。ThisDocument 实际上是指与程序集相关的文档(创建“Visual Studio Tools for Office”项目时使用的文档)。
在函数的最后一行中:
StyleExists = stylePresent
可以使用关键字 Return 返回变量。将 StyleExists = 更改为 Return:
Return stylePresent
在 CreateStyle 子例程中:
Private Sub CreateStyle(styleName As String, styleFontName As String, _
styleFontSize As Single, styleBold As Boolean, _
styleItalic As Boolean, Optional styleFirstLineIndent As Single, _
Optional styleSpaceBefore As Single )
Private Sub Workbook_Open()
Dim cellRange As Range
Dim styleName As String
Dim cellFormat As String
cellFormat = "_($* #,##0.00_)"
styleName = "NewStyle"
' 设置单元格区域 A1-C2。
Set cellRange = Range("A1:C2")
' 如果样式不存在,则创建该样式并为其设置格式。
If Not StyleExists(styleName) Then
FormatStyle styleName, "Times New Roman", 9, cellFormat
End If
' 对区域应用样式。
cellRange.Style = styleName
End Sub
Function StyleExists(styleName As String) As Boolean
On Error GoTo StyleExists_Err
Dim blnStyleExists As Boolean
' 假定开始时样式不存在。
blnStyleExists = False
ActiveWorkbook.Styles.Add (styleName)
StyleExists_End:
StyleExists = blnStyleExists
Exit Function
StyleExists_Err:
Select Case Err.Number
Case 1004
' 错误号为 1004,因此样式存在。
blnStyleExists = True
Case Else
' 处理其他情况。
End Select
Resume StyleExists_End
End Function
Sub FormatStyle(styleName As String, styleFont As String, _
styleFontSize As Single, styleFormat As String)
' 设置样式的格式。
With ActiveWorkbook.Styles(styleName)
.Font.Name = styleFont
.Font.Size = styleFontSize
.NumberFormat = styleFormat
End With
End Sub
创建项目
要转换 VBA 代码,必须使用“Visual Studio Tools for Office”在 Visual Studio .NET 中创建 Excel 工作簿项目。
要创建新的 Excel 工作簿项目
从 File(文件)菜单中,指向 New(新建),然后单击 Project(项目)。
在 New Project(新建项目)对话框中,展开 Microsoft Office 2003 Projects(Microsoft Office 2003 项目),然后选择 Visual Basic Projects(Visual Basic 项目)。
请注意,不支持 Set 关键字并已经自动从代码中删除该关键字。Range 属性是 Worksheet 对象的成员。要使用 Worksheet 对象,请使用 Ctype 函数初始化对象变量。需要将 Range 属性限定成 ThisApplication.Range。还可以将变量声明及其赋值合并成一个语句:
Dim ThisWorksheet As Excel.Worksheet = _
CType(ThisWorkbook.Worksheets.Item("Sheet1"), Excel.Worksheet)
Dim cellRange As Excel.Range = ThisWorksheet.Range("A1:C2")
更改其他声明以包含变量赋值:
Dim styleName As String = "NewStyle"
Dim cellFormat As String = "_($* #,##0.00_)"
可以直接在 ThisWorkbook_Open 方法中添加结构化异常处理以测试样式是否存在,而不是调用 VBA 示例中的 StyleExists 函数。删除 If 语句并键入以下代码:
' 如果样式不存在,则创建该样式并为其设置格式。
Try
ThisApplication.ActiveWorkbook.Styles.Add(styleName)
Finally
FormatStyle(styleName, "Times New Roman", 9, cellFormat)
End Try
单击 Build(生成)并选择 Build Solution(生成解决方案)以生成解决方案。
当再次打开 Excel 工作簿时,您将发现单元格区域 A1-C2 应用了 NewStyle 样式。
小结
在决定是否将 VBA 代码转换到 Visual Basic .NET 时,应该考虑两者在安全性、部署和代码维护等方面的差异,以及项目是否能从 Microsoft .NET Framework 提供的功能中受益。您需要根据 Visual Basic .NET 中的语言变化来调整自己的代码,重新将 VBA 用户窗体创建为 Windows 窗体,并确保最终用户的计算机上安装有 .NET Framework 和 Office 2003 主互用程序集。在通过主互用程序集访问 Word 和 Excel 对象模型时,您需要更改代码;但是对象模型相同,部分代码不必进行转换。使用“Visual Studio Tools for Office”和本文提供的信息,您可以开始将 Word 和 Excel 中的 VBA 代码转换到 Visual Basic .NET 中。
' Visual Basic .NET
' 当文档被打开时调用。
Private Sub ThisDocument_Open() Handles ThisDocument.Open
Dim currentParagraph As Word.Paragraph
' 调用 CreateStyle,传递样式名称和有关属性。
CreateStyle("MyNewStyle", "Arial", 9.5, True, False, 0.5)
' 将样式应用到每个左对齐的段落。
For Each currentParagraph In ThisApplication.ActiveDocument.Paragraphs
If currentParagraph.Alignment = _
Word.WdParagraphAlignment.wdAlignParagraphLeft Then
currentParagraph.Style = "MyNewStyle"
End If
Next currentParagraph
End Sub
Private Function StyleExists(ByVal styleName As String) As Boolean
Dim currentStyle As Word.Style
Dim stylePresent As Boolean = False
' 检查活动文档中是否存在该样式。
For Each currentStyle In ThisApplication.ActiveDocument.Styles
If currentStyle.NameLocal = styleName Then
stylePresent = True
Exit For
End If
Next currentStyle
' 返回
Return stylePresent
End Function
Private Sub CreateStyle(ByVal styleName As String, ByVal _
styleFontName As String, ByVal styleFontSize As Single, _
ByVal styleBold As Boolean, ByVal styleItalic As Boolean, _
Optional ByVal styleFirstLineIndent As Single = 0, _
Optional ByVal styleSpaceBefore As Single = 0)
' 检查样式是否已经存在。
If Not StyleExists(styleName) Then
' 通过传递的属性创建样式。
ThisApplication.ActiveDocument.Styles.Add(styleName)
With ThisApplication.ActiveDocument.Styles(styleName)
.Font.Name = styleFontName
.Font.Size = styleFontSize
.Font.Bold = styleBold
.Font.Italic = styleItalic
.ParagraphFormat.FirstLineIndent = _
ThisApplication.InchesToPoints(styleFirstLineIndent)
. ParagraphFormat.SpaceBefore = _
ThisApplication.InchesToPoints(styleSpaceBefore)
. ParagraphFormat.Alignment = _
Word.WdParagraphAlignment.wdAlignParagraphLeft
End With
End If
End Sub
Excel 示例
' Visual Basic .NET
' 当工作簿被打开时调用。
Private Sub ThisWorkbook_Open() Handles ThisWorkbook.Open
Dim ThisWorksheet As Excel.Worksheet = _
CType(ThisWorkbook.Worksheets.Item("Sheet1"), Excel.Worksheet)
Dim cellRange As Excel.Range = ThisWorksheet.Range("A1:C2")
Dim styleName As String = "NewStyle"
Dim cellFormat As String = "_($* #,##0.00_)"
' 设置单元格区域 A1-C2。
cellRange = ThisApplication.Range("A1:C2")
' 如果样式不存在,则创建该样式并为其设置格式。
Try
ThisApplication.ActiveWorkbook.Styles.Add(styleName)
Finally
FormatStyle(styleName, "Times New Roman", 9, cellFormat)
End Try
' 对区域应用样式。
cellRange.Style = styleName
End Sub
Sub FormatStyle(ByVal styleName As String, ByVal styleFont As String, _
ByVal styleFontSize As Single, ByVal styleFormat As String)
' 设置样式的格式。
With ThisApplication.ActiveWorkbook.Styles(styleName)
.Font.Name = styleFont
.Font.Size = styleFontSize
.NumberFormat = styleFormat
End With
End Sub
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步