⽤vba程序进⾏多条件引⽤表格数据_ExcelVBA|可以处理的
数据及对象
VBA(Visual Basic for Application是Visual Basic的⼀种宏语⾔,是微软1993年开发出来在其桌⾯应⽤程序(主要是Microsoft Office
系列软件)中执⾏通⽤的⾃动化(OLE)任务的编程语⾔。主要能⽤来扩展Windows的应⽤程序功能。VBA与传统的宏语⾔不同,提供了⾯向对象的程序设计⽅法,可以使⽤宏记录器记录⽤户的各种操作并将其转换为VBA 程序代码,由使⽤VBA 的Excel、Word、 PowerPoint
等称为宿主(Host)的Office 应⽤程序(Application)来调⽤。
JavaScript也是⼀种脚本语⾔,寄⽣在宿主浏览器中,有⼤量的内置对象(DOM)来调⽤。同样的,VBA也有⼤量的内置对象作为数据来调⽤。当然,程序员也可以定义⾃⼰的类和对象,但主要还是调⽤⽹页或⼯作表等已有的对象,这样的语⾔,也称为是基于对象的语⾔。
1 内置基本类型与变量、常量
变量是存储数据的容器,也可以理解为是⼀段命名的内存单元。
变量的作⽤域分为:过程级、模块级、⼯程级;
常量可以分为直接常量、符号常量、系统常量;
[Public | Private] Const 常量名 [As 数据类型]=常量表达式
系统常量,如vbRed,可以在代码窗⼝输⼊vba.vb,会有提⽰窗⼝;
定义变量除了可以使⽤Dim语句外,⽐较常的还有:static语句,Private语句,Public语句。使⽤不同的语句定义的变量不同的是它们的作⽤作⽤域不同,具体为:
Dim关键词表明了变量的声明。Dim是Dimension(维度)简称,历史要追溯到BASIC语⾔起源的20世纪60年代末。在当时的语⾔中,变量
只是在需要的地⽅被⽤到,不需声明(数组除外)。数组在内存中的排布⽅式决定,在数组被使⽤前,BASIC语⾔编译器必须被告知数组的维度。这就是Dim声明的⽬的。现在,由于对所有变量都进⾏声明被认为是⼀个好习惯,Dim声明就被扩展到所有的变量声明了。
(1)如果在⼀个过程中包含了⼀个Dim或Static语句,此时声明的变量作⽤域为此过程,即本地变量。
(2)如果在⼀个模块的第⼀个过程之前包含了Dim或Prvate语句,此时声明的变量作⽤域为此模块⾥所有的过程,也就是在此模块⾥所有的
过程都可以使⽤它,即模块作⽤域下的变量;
(3)如果在⼀个模块的第⼀个过程之前包含了Public语名,此时声明的变量作⽤域为所有模块,即公有变量。
变量的作⽤域是指变量保留其值的这段时间,也称为变量的⽣成周期,它决定变量可以⽤于哪个模块或过程中。
Private Sub VariablesDemo() Dim password As String password = "123456" Dim num As Integer num = 1234 Dim BirthDay As Date BirthDay = DateValue(⽴即窗⼝:
设置的密码是:123456num的值是:1234Birthday的值是:1998/10/11
2 ⾃定义类型和⾃定义枚举类型
VBA也可以⾃定义数据类型,类似于C语⾔的结构体,使⽤Type来声明:
Type lianxiren '放在模块最前⾯name As StringSex As StringEnd TypeSub selftype() Dim record As lianxiren '声明⼀个lianxiren类型的变量 record.name = "wu" reco ⽴即窗⼝:
姓名: wu性别: male
⾃定义枚举类型的声明和使⽤
⾃定义枚举类型的声明
Public Enum JapaneseWeekDay
⽉曜⽇
⽕曜⽇
⽔曜⽇
⽊曜⽇
⾦曜⽇
⼟曜⽇
⽇曜⽇
End Enum
Public Enum Screen
Width = 1366
Height = 768
End Enum
⾃定义枚举类型的使⽤
Sub Test1() Dim a As Long, b As Long a = JapaneseWeekDay.⾦曜⽇ b = JapaneseWeekDay.⼟曜⽇ MsgBox a + bEnd SubSub Test2() MsgBox Screen.Width * S
3 内置对象
VBA的主要任务是处理Excel中的内置对象。
VBA提供了⾯向对象的程序设计⽅法,类最重要的特性就是封装和继承。
在类中封装属性(对象数据)和⽅法(对象函数成员)。
在类中实现继承,让其对象呈现多继承的层次关系:
应⽤程序对象:Application;
⼯作簿对象:Workbook;
⼯作表对象:Worksheet;
单元格对象:Range;
图形对象:Shape;
图表对象:Chart;
excel数组函数的实例在使⽤对象模型的属性、⽅法和事件之前,必须创建⼀个对包含所需属性、⽅法和事件的类的引⽤。可以先声明⼀个局部对象变量以存储该对象引⽤,然后把对象引⽤赋给该局部变量。
声明对象变量的⽅法和声明其他类型的变量基本上⼀样。有三种声明对象变量的⽅法:
(1) Dim myObject As .
此⽅法指向类的类型库,但没有给该变量赋予任何类的实例。此时,变量myObject被赋值为Nothing。若要⽤这种⽅式引⽤类,就必须利⽤“引⽤”对话框向⼯程添加⼀个对类模块的引⽤。若要将类的实例引⽤赋予该变量,必须在使⽤该变量之前⽤Set语句赋值。如:
Set myObject=.
(2) Dim myObject As New .
此⽅法将类的新实例引⽤赋给Object变量。同样,要⽤这种⽅式引⽤类,必须先利⽤“引⽤”对话框向⼯程添加⼀个对类模块的引⽤。
(3) Dim myObject As Object
此⽅法将myObject变量声明为⼀般的Object数据类型,这在不能预先知道要创建的对象的数据类型时⼗分有⽤。此时,Object变量被赋值为Nothing。若要将对象引⽤赋值给该变量,必须使⽤CreateObject函数或GetObject函数。
可以⽤Private或Public语句替换Dim语句,且对象变量的作⽤域规则和其他类型的变量⼀样。
声明对象变量可以显著地简化代码且加快代码的执⾏速度。
Dim myRange As Object
上⾯的语句声明了⼀个叫做myRange的对象变量。然⽽,实际上只声明对象变量是不够的,在使⽤这个变量于程序⾥之前,你还给这个对象变量赋上确定的值。使⽤关键字Set来给对象变量赋值,关键字Set后⾯是等号,再后⾯是该变量指向的值,例如:
Set myRange = Worksheets("Sheet1").Range(Cells(1,1), Cells(10, 5))
对象变量可以引⽤任意⼀种对象,因为VB有很多种对象,所以,要让你的程序可读性更强,运⾏更快,最好创建引⽤到具体对象类型的对象变量。例如,在过程UseObjVariable中,你可以将myRange对象变量声明为Range对象,⽽不是通常的对象变量(Object):
Dim myRange As Range
如果你要引⽤⼀个具体的⼯作表,你可以声明Worksheet对象:
Dim mySheet As Worksheet
Set mySheet = Worksheets("Marketing")
当对象变量不再需要时,你可以给它赋值Nothing,这将释放内存和系统资源:
Set mySheet = Nothing
4 ⽤户窗体中呈现的数据
VBA也可以使⽤⽤户窗体做为与⽤户交互的界⾯,来进⾏数据的输⼊、输出,与内存,以及在⼯作表中进⾏数据交互。
5 外部数据
VBA可以操作⽂本⽂件,建⽴和引⼊其它office组件对象和数据,以及连接数据库等。
6 数组与集合
Excel⼯作表就是⼀个天然的⼆维数组。⼯作表的⾏、列对应⼆维数组的⾏、列。
⼯作表数据区域与⼆维数组对元素的定位就相当于坐标定位,如⼯作表区域的cells()写法就是就是对应⼯作表的某⼀⾏,某⼀列。
在excel中,数据可以直接使⽤[{}]赋值,列元素⽤逗号,分隔,⾏元素⽤分号;分隔。
⼀维数组可以与⾏或列相互映射,⼆维数据可以与⼀个单元格区域相互映射。所谓相互映射,也就是说数组可以通过单元格区域定义,⽽定义格区域也可以通过数组赋值。
单元格区域可以通过地址引⽤,同样的,数组可以很⽅便地通过索引(下标)引⽤(字典通过key引⽤)。
Dim myarr(5) As IntegerDim myarr(1to5,1to10) As Integer
可以在运⾏时⽤ReDim语句重新指定数组的⼤⼩。
Dim arr(11) As Integer '11相当于数组上标UboundDim arr2(1 To 11) As Integer '数组的长度:11-1
数组可以使⽤数组函数Array()赋值,如:
Dim arr3arr3 = Array(1, 2, 3, 4, 5)
从Visual Basic 4.0开始,Collection对象就作为主要的数据类型替代了⽤户⾃⼰定义的类型。
集合本质上是⼀个数组,但是是⼀个可以随时插⼊、删除某个序号位置元素的“灵活”数组。
这个功能显然⽐⼀般的⼀维数组更有意思。
并且,集合也可以使⽤字典key来关联、定位。所以功能更强⼤⼀些。
集合是⼀个⼀维数组,那么为啥不直接让⽤户⾃建⼀个⼀维数组来存储信息,⽽要开发集合对象⽅法这样⼀个东东呢?
因为集合⽅法中的⼀维数组有以下特点,可以简化处理过程,节省⽤户写代码的时间,也不容易错。
集合可以进⾏写⼊(.Add添加)、读取、删去(.Remove)操作。
其中.Add添加时,不需要地址,总是⾃动添加到集合数组中的最后⼀个位置。
如果是⾃定义数组,也可以做到,但可能会是这样⼦:
Sub test2()Dim arr()For i=1 To 10ReDim Preserve arr(1 To i)'每次在需要向⼀维数组中添加新元素时,需要先扩⼤数组arr(i)=i'然后再添加新元素NextEnd Sub 虽然实际上集合⽅法中也是这么做的,但毕竟通过封装和后台运⾏,减少了⽤户的⿇烦。
直接删去/抹去已经不需要的某个特定位置的信息!
⽅法是Remove:
s.Remove (i),如:s.Remove (1)s.Remove (s.Count)
删去⼀维数组中第 i 个信息,同时⾃动把数组⼤⼩缩减
对应的普通数组做法就会⽐较复杂:
Sub test3() ReDim arr(1 To 10) For i = 1 To 10 arr(i) = i Next Rmv arr, 3End SubSub Rmv(arr, j) For i = j + 1 To UBound(arr) arr(i - 1) = arr(i) Next ReDim 也许集合⽅法中也是这么做的……但毕竟封装、后台运⾏以后,⽤户就省⼼多了。
Sub coltest()Dim col As New Collectioncol.Add "红"col.Add "黄"col.Add "橙
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论