资源预览内容
第1页 / 共81页
第2页 / 共81页
第3页 / 共81页
第4页 / 共81页
第5页 / 共81页
第6页 / 共81页
第7页 / 共81页
第8页 / 共81页
第9页 / 共81页
第10页 / 共81页
亲,该文档总共81页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第4章 VBA变量、条件与循环语句及应用技术,4.1 VBA变量,VBA语言的变量就像数学中的变量一样,可以赋值。一旦赋值,变量在程序中任何位置即代表所赋值。,代码DimAs即表示定义某个变量为某一数据类型。 VBA变量也可以不定义,如果没有对变量进行定义,VBA就默认为可变的数据类型(Variant)。系统会自动检测,判断变量在程序中的数据类型。,带变量的单元格表示 Excel单元格可以表示为: 如B5,表示第5行第2列单元格; 如Cells(3,1),表示第3行第1列单元格。 如果单元格坐标为变量,则只能采用后一种表示,如Cells(x,1)。这里,横坐标x是一个变量。,示例: 教材P32,使用变量实现人机对话以对话方式输入数据。,4.2 VBA条件与循环语句,4.2.1 条件语句 条件语句的格式为 If Then Else End If,条件放在If Then之间。 满足条件执行If Then与Else之间的代码,而不执行Else与End If之间的代码; 不满足条件则执行Else与End If之间的代码,而不执行If Then与Else之间的代码。,有趣的是,条件语句有另一种表示 If Then End If 满足条件就执行If Then与End If之间的代码,不满足条件则跳过这段代码,顺序执行下面的代码。,4.2.2 循环语句 条件语句用条件来改变代码的执行顺序,代码只执行一次。如果要反复执行某些代码,可以使用循环语句。,1.判断式循环语句 判断式循环语句的结构为 Do While 判断条件 Loop 其意义是,执行时首先判断条件是否满足,满足就循环一次,然后再次判断,直到不满足为止。,2.计数式循环语句 计数式循环语句(For - Next)的基本结构为 For 计数变量=初值 To 终值 Next 计数变量 其意义是,执行时从计数变量的初值开始第一次循环,循环计数进行直至终值(除非指令停止)。,判断式与计数式循环的主要区别: (1)循环条件。判断式循环据条件判断是否继续循环,计数式循环不存在判断问题,而是按设定的次数依次进行循环; (2)循环次数设定。计数式循环的循环次数需要事先设定,而判断式循环的循环次数不定。,4.3 应用示例,4.3.1 确定记录的末行数 示例:教材P35,随着销售的增加,记录的末行数是变动的,可以用代码 x = 1 Do While Not (IsEmpty(Sheets(“销售记录“).Cells(x, 1).Value) x = x + 1 Loop 自动确定记录的末行数,对象,首先,判断“销售记录”工作表第一列第一行单元格值是否为空; 如果不空,就接着判断第一列第二行单元格值是否为空(每循环一次,执行一次“x = x + 1”,x值增加1); 如果又不空,再判断第一列第三行单元格值是否为空,如此循环。,但一旦遇到第一个空单元格即停止循环,x为第一个空单元格的行数,而记录的末行数为x - 1。,4.3.2 给变动区域命名 问题: 承接前例,如果要对“销售记录”工作表的销售记录进行数据处理,则需要确定数据区域。 但是,数据区域随销售记录变动而变动,手工操作很麻烦。,解决方法: 利用宏自动选定包含最新记录的数据区域,而解决这一问题的关键在于给变动区域命名。,区域命名即给某个区域取一个名称。 示例: 教材P36,如何通过人机对话方式给区域命名。 教材P37,如何用程序给区域命名。,给区域B2:D4命名,可以用代码 ActiveWorkbook.Names.Add Name:=“试命名“, RefersToR1C1:= Range(Cells(2, 2), Cells(4, 4) 实现。,Sub 选定包含最新记录的区域示例() x = 1 Do While Not (IsEmpty(Sheets(“销售记录“).Cells(x, 1).Value) x = x + 1 Loop 确定销售记录的末行数,ActiveWorkbook.Names.Add Name:=“Jlk“, RefersToR1C1:=Range(Cells(1, 2), Cells(x - 1, 3) 给销售记录区域Range(Cells(1, 2), Cells(x - 1, 3)命名为Jlk Range(“Jlk“).Select 选定Jlk区域 End Sub,对区域命名的意义是,如果要指定区域,只须指定其名字即可,简单方便。 事实上,代码 Range(“Jlk“).Select 就是这样做的。,对区域命名的另一个意义:如果区域是变动的,在有些情况指定区域必须对区域命名,然后在指定区域时使用区域的名称。,示例:教材P39 计算区域空格数代码 Cells(1, 5) = “=COUNTBLANK(Jlk)” 中区域名称Jlk不能用区域 Range(Cells(1, 2), Cells(x - 1, 3)替代,注意: 给变动区域命名的关键代码是采用“录制”方法得来的。 按前面通过人机对话方式对Book1工作簿的Sheet1工作表中的B2:D4区域命名步骤,采用“录制”方法可以得到代码,Range(“B2:D4“).Select ActiveWorkbook.Names.Add Name:=“试命名“, RefersToR1C1:=“=Sheet1!R2C2:R4C4“,这一代码可以改写为 ActiveWorkbook.Names.Add Name:=“试命名“, RefersToR1C1:=Range(Cells(2, 2), Cells(4, 4) (改写的目的是单元格换为坐标可以用变量表示的方式)。,这样,我们就知道代码 ActiveWorkbook.Names.Add Name:=“Jlk“, RefersToR1C1:=Range(Cells(1, 2), Cells(x - 1, 3) 该怎样写了。,4.3.3 查找某一记录 示例:教材P40,假定要在“名单”工作表的姓名栏(A列)查找是否有张三,若有就选定张三 。,Sub 查找某一记录示例() Dim xm As String 定义xm为字符变量. Found = False 设定Found为False. xm = InputBox(“请输入姓名:“) 弹出要求输入姓名的对话框,输入姓名后赋值于变量xm.,x = 1 Do While Not (IsEmpty(Sheets(“名单“).Cells(x, 1).Value) x = x + 1 Loop 以上4行代码,确定“名单“工作表第1列从第1行起到第1个空行的行数x.,For t = 2 To x - 1 If xm = Sheets(“名单“).Cells(t, 1) Then Found = True Exit For End If Next t,以上6行代码,在“名单“工作表第1列从第2行起到x-1行查找输入的姓名.如果找到了,Found就由False变成True.,If Found = False Then MsgBox “查无此人! “ 执行以上2行程序,如果未找到输入的姓名(Found仍为False),弹出“查无此人!“对话框.确定后,执行以下程序.,Else Cells(t, 1).Select 如果找到输入的姓名就选定它. End If End Sub,查找到的记录行,程序中代码 For t = 5 To x - 1 Next t 为一组计数式循环语句,在程序中利用它查找系统事先设定的人员。,执行时,通过在条件语句中设置的条件xm = Sheets(“名单“).Cells(t, 1),将xm的值与Sheets(“名单“).Cells(t, 1)的值(第1次循环t = 2)逐一进行比对。,即首先判断“名单”工作表第1列第2行单元格值是否为输入的姓名,如果是,Found就由事先设定的False变成True,并停止循环;,否则,接着判断第1列第3行单元格值是否为输入的姓名,如果是,Found就由事先设定的False变成True,并停止循环,如此循环。,如果到记录的最后一个单元格,即第1列第x - 1行单元格仍未找到输入的姓名,那么结束循环。这时,Found仍为False。,代码 xm = Sheets(“名单”).Cells(t, 1) 的意义 比对: xm的值 Sheets(“名单“).Cells(t, 1)的值(第1次循环t = 2),4.3.4 工作表数据的自动结转 示例:教材P41 问题: “凭证”工作表记账凭证中的数据不便进行数据汇总等处理 解决方法: 将“凭证”工作表记账凭证中的“日期”、“摘要”等数据转入“凭证库”工作表的相应栏目,Sub 记账凭证栏目数据转入凭证库() x = 4 Do While Not (IsEmpty(Sheets(“凭证库“).Cells(x, 1).Value) x = x + 1 Loop 执行以上4行程序,确定“凭证库“工作表第1列从第4行起到第1个空行的行数x.,z = 6 Do While Not (IsEmpty(Sheets(ActiveSheet.Name).Cells(z, 2).Value) z = z + 1 Loop 执行以上4行程序,确定当前工作表(即当前记账凭证)第2列从第6行起到第1个空行的行数z.,For y = 6 To z - 1 Sheets(“凭证库“).Cells(x, 1) = Sheets(ActiveSheet.Name).Cells(3, 3) 将当前工作表坐标为(3,3)单元格内容(即记账凭证“日期“)转入“凭证库“工作表坐标为(x, 1) 的单元格(即“凭证库“工作表“日期“栏).,Sheets(“凭证库“).Cells(x, 2) = Sheets(ActiveSheet.Name).Cells(3, 9) Sheets(“凭证库“).Cells(x, 3) = Sheets(ActiveSheet.Name).Cells(4, 3) Sheets(“凭证库“).Cells(x, 4) = Sheets(ActiveSheet.Name).Cells(y, 2) Sheets(“凭证库“).Cells(x, 5) = Sheets(ActiveSheet.Name).Cells(y, 4),Sheets(“凭证库“).Cells(x, 6) = Sheets(ActiveSheet.Name).Cells(y, 7) Sheets(“凭证库“).Cells(x, 7) = Sheets(ActiveSheet.Name).Cells(y, 9) x = x + 1 Next y,以上10行程序,将当前工作表(即当前记账凭证)坐标为(3,3)单元格内容(即日期)、坐标为(3,9)单元格内容(即凭证号)、坐标为(4,3)单元格内容(即摘要)、,坐标为(y, 2)单元格内容(即科目编号)、坐标为(y, 4)单元格内容(即科目名称)、坐标为(y, 7)单元格内容(即借方金额)和坐标为(y, 9)单元格内容(即贷方金额)分别转入“凭证库”工作表从第4行起到第一个空行的第1、2、3、4、5、6和7列单元格. End Sub,程序 For y = 6 To z - 1 Sheets(“凭证库“).Cells(x, 1) =Sheets(
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号