将代码从 VBA 转换到 Visual Basic .NETKathleen McGrath 2003 年 6 月 适用于: 摘要:介绍将 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...
使用 Visual Basic .NET...
VBA 与 Visual Basic .NET 之间的差异了解 VBA 与 Visual Basic .NET 之间的差异有助于您在转换代码时作出更明智的决定。本节介绍以下方面的差异:
语言差异由于 Visual Basic .NET 是为利用 .NET Framework 而设计的,它包含非常多的改动,在许多地方已经不再与以前的语言版本兼容。以下列出了 Visual Basic .NET 中 Visual Basic 语言的部分修改。有关详细信息,请参阅 Introduction to Visual Basic .NET for Visual Basic Veterans。
项目管理差异当开始使用 Visual Basic .NET 来创建 Office 解决方案时,您将注意到代码在项目中的位置发生了改变。当使用 VBA 创建 Office 解决方案时,代码位于 Word 模板、Word 文档或 Excel 工作簿的模块、用户窗体和类模块中。当使用“Visual Studio Tools for Office”时,代码位于被编译到程序集的类和 Windows 窗体中,并被 Word 或 Excel 文档引用。 虽然 Visual Studio .NET IDE 具有增强功能,但在许多方面与 VBA IDE 相似。两者都具有查看项目、模块、窗体和参考的资源管理器。两者都提供属性窗口、工具箱、对象浏览器和调试功能。表 1 列出了管理项目时您可能会注意到的一些差异。 表 1:VBA 与 Visual Studio .NET IDE 之间的差异
在使用 ActiveX 控件过程中,您将发现两者之间的另一个不同之处。在 VBA 中,ActiveX 控件是顶级对象并支持智能感知。而在 Visual Basic .NET 中,必须使用“Visual Studio Tools for Office”中的 FindControl 方法为控件定义变量并将它们转换成严格类型以便使用智能感知。 安全性差异Microsoft .NET Framework 提供了 VBA 中没有提供的安全功能。在 VBA 中,有三种基本的安全选项:
具有使用 Visual Basic .NET 创建的托管代码扩展功能的 Word 和 Excel 文档不使用依赖于 Office 证书存储的 Office 宏安全。它们融合了 Microsoft .NET Framework 1.1 中的标准安全功能,例如:
有关设置 .NET Framework 中安全措施的详细信息,请参阅“Visual Studio Tools for Office”帮助主题“使用托管代码扩展的 Office 解决方案中的安全性”或参阅 An Overview of Security in the .NET Framework。 部署差异部署 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 文档项目
然后向 Word 文档添加文本。 要向文档添加文本
复制代码然后,必须将 VBA 代码复制并粘贴到 Visual Studio .NET 的新 Word 文档项目中。 要将 VBA 代码复制并粘贴到 Word 项目中
转换代码将 VBA 代码复制到新项目中后,就可以开始转换代码了。 要在 Visual Basic .NET 中转换代码
当再次打开 Word 文档时,您将发现所有左对齐的段落都被应用了 NewStyle 样式。 Excel 中的 VBA 代码示例以下 Excel VBA 宏创建一个新样式(如果该样式不存在),并将其应用到一个单元格区域 (A1-C2)。 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 工作簿项目
然后需要向 Excel 工作簿添加文本。 要向工作簿添加文本
复制代码然后需要将 VBA 代码复制到新的 Excel 工作簿项目中。将复制除了 StyleExists 方法以外的所有代码。 要将 VBA 代码复制并粘贴到 Excel 项目中
转换代码将 VBA 代码复制到新项目中后,就可以开始转换代码了。 要转换 Visual Basic .NET 中的代码
小结在决定是否将 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 中。 附录本节包含 Word VBA 和 Excel VBA 示例的完整 Visual Basic .NET 代码。 Word 示例 ' 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 相关文章Visual Studio Tools For Office |
取于
http://www.microsoft.com/china/MSDN/library/archives/library/odc_vsto2003_ta/html/VBAconvert.asp
转载于:https://www.cnblogs.com/cowbird/articles/20433.html