企业项目管理、ORK、研发管理与敏捷开发工具平台

网站首页 > 精选文章 正文

基于对象的Excel VBA的分层对象集合及外部对象库

wudianyun 2025-06-04 02:17:26 精选文章 8 ℃

VBA是基于 Visual basic发展而来的,与VB具有相似的语言结构。从语言结构上讲,VBA是VB的一个子集,它们的语法结构是一样的。两者的开发环境也几乎相同。但是,VB是独立的开发工具,它不需要依附于任何其他应用程序,它有自己完全独立的工作环境和编译、链接系统。VBA却没有自己独立的工作环境,它必须依附于某一个主应用程序,VBA专门用于Office的各应用程序中,如Word、 Excel、 Access等。在 Access中,可以通过VBA编写模块来满足特定的需要。

Excel VBA以子过程和函数为单位,以模块形式出现。

Excel VBA主要基于对象(Object-Based),主要是使用现有的对象模型体系(Excel Application),(和面向对象(object-oriented)不同,其类的定义很少使用,类的继承、重载等有关面向对象语言的功能基本不用。

1 Excel VBA的顶层对象:Application

Application 对象代表整个Excel 应用程序,使用Application 对象可控制应用程序范围的设置和选项。

工作簿(Workbooks)是Excel 文档的基础,基于工作簿的操作主要有新建、打开、保存工作簿,以及工作簿的保护与撤销等。

一个工作簿对象(Workbook)就是一个Excel 文件,多个Workbook 对象组成Workbooks集合。工作簿对象包括工作表对象Worksheet、单元格区域对象Range、图表对象Chart 等。

code demo:

'Active顶级对象    
Application.ActiveWorkbook.Close ("Book1")
Application.ActiveSheet.Range("A1").Value = 11
Application.ActiveCell.Value = 22

Application.Windows("book1.xls").Activate

Set xl = CreateObject("Excel.Sheet")
xl.Application.Workbooks.Open "newbook.xls"

2 Application.Worksheets

Worksheet对象是表示Excel工作簿中的工作表,Worksheet对象是Worksheets集合的成员。Worksheets集合包含某个工作簿中所有的Worksheet对象。

在VBA中,通过Worksheets集合对象可向工作簿中增加、删除工作表,获取对工作表的引用,向工作表中增加、删除行。通过Worksheet对象的事件还可控制工作表的行为,如禁止更改名称、禁止打印输出等。


Application.Worksheet.Range()对应具体的单元格区域。

code demo:

Worksheets(1).Move After:=Sheets(Sheets.Count)
Worksheets.Add Count:=2, Before:=Sheets(1)
Worksheets(1).Visible = False
Application.Worksheets(1).Range("A1") = 123

3 Charts

在Excel 中可以快速简便地创建图表,在程序中,通过VBA 代码也可方便地创建图表。在Excel 中创建的图表,可以嵌入到工作表中数据的旁边,也可插入到一个新的图表工作表中,分别称为嵌入式图表(ChartObjects)和图表工作表(Charts)。通过Chart 对象的Location 方法,可改变图表的放置位置:表达式.Location(Where, Name)

code demo:

Worksheets(1).ChartObjects(1).Activate '嵌入的图表
ActiveChart.Type = xlLine
ActiveChart.HasTitle = True
ActiveChart.ChartTitle.Text = "January Sales"
Charts(1).Activate

With ActiveChart  ' 独立的图表
    .Type = xlLine
    .HasTitle = True
    .ChartTitle.Text = "January Sales"
End With

4 Application.Workbook.Worksheet.Shapes

指定的工作表上的所有 Shape 对象的集合。每个 Shape 对象代表绘图层上的一个对象,如自选图形、任意多边形、OLE 对象或图片。

code demo:

Sub 删除形状()
    For Each sps In ActiveSheet.Shapes
        sps.Delete
    Next sps
End Sub

5 引用外部对象库

如要使用ADO 对象,必须先为当前工程引用ADO 的对象库,在VBE中选择菜单“工具/引用”,打开“引用”对话框,在列表框中找到“Microsoft ActiveX Data Objects 2.8 Library”选项并选中。

即可声明对象:

Dim cnn As ADODB.Connection
Set cnn = CreateObject("ADODB.Connection")
' 使用对象cnn的属性和方法

如使用Scripting 类型库的FileSystemObject对象:

Dim fso As Scripting.FileSystemObject
Set fso = New Scripting.FileSystemObject
' 使用对象fso的属性和方法

微软公司提供的自动化技术可以将某一个应用程序的功能当作一系列的对象提供给其他的外部应用程序,这个外部应用程序就可以使用这些对象,这个过程被称为自动化(Automation)。自动化就是通过一个应用程序来控制另外一个应用程序的处理过程。在Excel环境中,通过自动化技术可控制其他的Office应用程序。

绝大多数支持自动化的应用程序都提供一个对象库。该对象库为控制器应用程序提供了服务器应用程序中可以使用的对象的有关信息。若要使用对象库信息,则需要从控制器应用程序(Excel)引用对象库。

如使用自动化技术来控制Word,就是用Word 作为服务器应用程序,因而需要在Excel 中引用Word对象。

在Excel 的VBE 编辑器中选择菜单“工具/引用”,打开“引用”对话框。在“引用”对话框中选中“Microsoft Word 12.0 ObjectLibrary”复选框。

code demo:

Sub 获取Word 的数据()
    Dim sFName As String, strFilt As String, strTitle As String
    Dim docApp As Word.Application, pg As Word.Paragraph
    Dim i As Long, str1 As String
    strFilt = "Word 文档(*.doc;*.docx;*.docm),*.doc;*.docx;*.docm,"
    strTitle = "打开Word 文档"
    sFName = Application.GetOpenFilename _
    (filefilter:=strFilt, _
    Title:=strTitle)
    If sFName = "False" Then Exit Sub
    Set docApp = CreateObject("Word.Application") '实例化Word 对象变量
    docApp.Documents.Open sFName '打开Word 文档
    i = 1
    With docApp.ActiveDocument
        For Each pg In .Paragraphs '处理Word 中的每一个段落
            str1 = pg.Range.Text '获取段落中的文本
            i = i + 1
            ActiveSheet.Cells(i, 1) = str1
        Next
    End With
    docApp.Quit '退出Word 文档
    Set docApp = Nothing '释放对象变量
End Sub

VBE也包含一个对象模型,通过该对象模型可控制VBA工程的主要元素,可以编写VBA代码添加或删除模块、创建用户窗体、生成VBA代码。

通过编写VBA代码,可显示VBA工程中各主要元素的信息,如工程中组件名称、VBA代码中的子过程名称和详细代码等信息。

每个打开的工作簿或加载宏都有一个VBProject 对象代码,每个工作簿中包含多个VBComponent对象(Excel 对象、窗体、模块和类模块),而Reference 对象则表示工作簿引用的外部模型库,每个外部模型库为一个Reference 对象。

在程序中使用VBE 对象模型前,必须先将VBE 对象模型库添加到当前工程中。在如“引用”对话框中,选中“Microsoft Visual Basic for Applications ExtensibilityLibrary”,将其添加到当前工程中。

code demo:

Sub 显示过程名()
    Dim oVBP As VBIDE.VBProject, oVBC As VBComponent
    Dim oCM As CodeModule, strProcName As String
    Dim r As Long, r1 As Long, r2 As Long
    On Error Resume Next
    Set oVBP = ActiveWorkbook.VBProject
    If Err <> 0 Then
        MsgBox "当前安全设置不允许运行本过程,请修改安全设置!", _
        vbCritical + vbOKOnly, "警告"
        On Error GoTo 0
        Exit Sub
    End If
    With ActiveSheet
        .Columns("A:B").Clear '清除A、B 两列的数据
        .Range("A3:B3") = Array("组件名称", "过程名称") '填充表头
        .Range("A3:B3").Font.Bold = True
        r = 3
        For Each oVBC In oVBP.VBComponents '循环处理每个组件
            Set oCM = oVBC.CodeModule
            r1 = oCM.CountOfDeclarationLines + 1 '跳过声明部分的代码
            r2 = oCM.CountOfLines '获取总的代码行数
            Do While r1 < r2
                r = r + 1
                .Cells(r, 1) = oVBC.Name
                .Cells(r, 2) = oCM.ProcOfLine(r1, vbext_pk_Proc) '当前行的过程名
                r1 = r1 + oCM.ProcCountLines(oCM.ProcOfLine _
                (r1, vbext_pk_Proc), vbext_pk_Proc) '下一过程
            Loop
        Next
        .Columns("A:B").AutoFit
    End With
End Sub

-End-

Tags:

最近发表
标签列表