|
楼主 |
发表于 2003-8-20 13:04
|
显示全部楼层
转换 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 文档。
因为您还没有编译该程序集,可能会出现一个警告,提示程序集名称或程序集链接位置属性被破坏。单击 OK(确定)关闭警告。
添加多段文本,设置不同的段落对齐。例如,居中对齐标题,左对齐一些段落并右对齐另一些段落。
保存并关闭 Word 文档。
复制代码
然后,必须将 VBA 代码复制并粘贴到 Visual Studio .NET 的新 Word 文档项目中。
要将 VBA 代码复制并粘贴到 Word 项目中
在 Visual Basic .NET 项目中,定位 OfficeCodeBehind 类。
复制 Document_Open 子例程中的 VBA 代码(不包括 Sub 和 End Sub 关键字)并粘贴到 ThisDocument_Open 方法中。
将完整的 StyleExists 函数和 CreateStyle 子例程复制并粘贴到 ThisDocument_Close 方法下面(未包含在此方法中)的 OfficeCodeBehind 类中。
请注意,某些对象(Style、ActiveDocument)具有蓝色波浪下划线,这说明代码中的这些对象存在问题。还要注意,在粘贴代码时,ByVal 将自动添加到函数 StyleExists 的参数列表中,而不是添加到 CreateStyle 子例程的参数列表中。这是因为 CreateStyle 子例程具有需要默认值的可选参数,这将在本文后面介绍。
提示:您可能已经注意到 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
在 For Each 语句的第一行中:
For Each currentStyle in ActiveDocument.Styles
在 VBA 中,ActiveDocument 是 Application 对象的成员。因为是在应用程序中直接编写代码,所以自动引用 Application 对象。在 VBA 中,您可以(但不是必须)写成 Application.ActiveDocument。
当使用“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 )
可选参数后的逗号下面出现的蓝色波浪线表明代码中存在问题。将鼠标指针放在波浪线上,将会显示工具提示“可选参数必须指定默认值。”
为每个可选参数添加默认值 0,如下例所示。
Optional ByVal styleFirstLineIndent as Single = 0, _
Optional ByVal styleSpaceBefore As Single = 0)
请注意,当可选参数被解析时,将向每个参数自动添加 ByVal。
提示:在 Visual Basic .NET 中,使用可选参数的首选方法是创建重载方法。有关详细信息,请参阅 Overloaded Properties and Methods。
在设置 FirstLineIndent 的行中:
ParagraphFormat.FirstLineIndent = _
InchesToPoints(styleFirstLineIndent)
InchesToPoints 方法是 Application 对象的成员。将方法更改为 ThisApplication.InchesToPoints。
ParagraphFormat.FirstLineIndent = _
ThisApplication.InchesToPoints(styleFirstLineIndent)
与此类似,在下一行中,将 InchesToPoints 方法更改为 ThisApplication.InchesToPoints。
ParagraphFormat.SpaceBefore = _
ThisApplication.InchesToPoints(styleSpaceBefore)
在下一行中:
ParagraphFormat.Alignment = wdAlignParagraphLeft
需要完全限定 wdAlignParagraphLeft 常量的枚举名称:
ParagraphFormat.Alignment = _
Word.WdParagraphAlignment.wdAlignParagraphLeft
在 ThisDocument_Open 方法的变量声明语句中:
Dim currentParagraph As Paragraph
Paragraph 对象属于 Word 命名空间,因此需要将其更改成 Word.Paragraph 限定引用,如下所示:
Dim currentParagraph As Word.Paragraph
在 For Each 语句中,向 ActiveDocument 添加 ThisApplication 限定符(如果已经执行了全局查找和替换操作,这可能已经被更改):
For Each currentParagraph In _
ThisApplication.ActiveDocument.Paragraphs
在下一行中:
If currentParagraph.Alignment = wdAlignParagraphLeft Then
需要完全限定 wdAlignParagraphLeft 常量的枚举名称:
If currentParagraph.Alignment = _
Word.WdParagraphAlignment.wdAlignParagraphLeft Then
单击 Build(生成)并选择 Build Solution(生成解决方案)以生成解决方案。
当再次打开 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 |
|