VBA续嘘嘘

时间:2024-07-18 18:37:32

什么是VBA?它有什么作用?

A.实现Excel中没有实现的功能。

B.提高运行速度。

C.编写自定义函数。

D.实现自动化功能。

E.通过插入窗体做小型管理软件。

VBA在哪里存放的?怎么运行?

A.模块中

在Excel 2010中若没有“开发工具”项,通过“文件”——“选项”——“自定义功能区”——选中“开发工具”——“确定”(图1)。

(注:为了提高word2010中插入的图片的质量,“文件”——“选项”——“高级”——选中“不压缩文件图像质量”——“确定”。)

VBA续嘘嘘

图1 选中“文件”—“选项”

VBA续嘘嘘

图2 ”自定义功能区”—“开发工具”——“确定”

VBA续嘘嘘

图3 最终的界面多出了“开发工具”选项卡

VBA续嘘嘘

图4 代码存放在“模块”中

B.运行宏

单击向右的绿三角,即可以运行。

VBA续嘘嘘

图5 右绿三角运行

VBA续嘘嘘                                                          图6  选中test并“运行”

VBA续嘘嘘

图7 运行结果

3.什么是宏?宏和VBA有什么关系?

宏(Macro),是一种批量处理。

宏通常既可以录制又可以手动编程,而VBA一般是通过编程完成。宏可以和VBA相结合使用。

4.录制一个宏。

A.“开发工具”——“录制宏”——宏名为“输入100”——“录制”——在A1单元格中输入100——“停止”。

B.“宏”——选中“输入100”——“执行”。

VBA续嘘嘘

VBA续嘘嘘

5.编写一个宏。

A.“开发工具”——“Visual Basic”——“视图”——“工程资源管理器”——“插入”——“模块”——在右侧输入代码:

VBA续嘘嘘

B. 单击绿右三角即可运行。或者关闭VBA编辑窗口,单击“宏”——选中“test”——“执行”。

VBA续嘘嘘

6.VBA语句

A.宏程序语句。

VBA续嘘嘘

B.函数程序语句

VBA续嘘嘘

C.在程序中应运语句。

VBA续嘘嘘

D.循环语句。

VBA续嘘嘘

7.VBA对象

A.工作簿对象

Workbooks 代表工作簿集合,所有的工作簿,Workbooks(N),表示已打开的第N个工作簿

Workbooks ("工作簿名称")

ActiveWorkbook 正在操作的工作簿

ThisWorkBook '代码所在的工作簿

B.工作表对象

Sheets("工作表名称")

Sheet1 表示第一个插入的工作表,Sheet2表示第二个插入的工作表....

Sheets(n) 表示按排列顺序,第n个工作表

ActiveSheet 表示活动工作表,光标所在工作表

worksheet 也表示工作表,但不包括图表工作表、宏工作表等。

C.单元格对象

cells 所有单元格

Range ("单元格地址")

Cells(行数,列数)    Range(“B3”)和Cells(3,2)表示相同的单元格

Activecell 正在选中或编辑的单元格

Selection 正被选中或选取的单元格或单元格区域

8. VBA属性

VBA属性就是VBA对象所具有的特点,表示某个对象的属性如下:对象.属性=属性值

Sub ttt()

Range("a1").Value = 100     ’给单元格a1填充数值100

End Sub

Sub ttt1()

Sheets(1).Name = "工作表改名了"   ’给工作簿重命名为“工作表改名了”

End Sub

Sub ttt2()

Sheets("Sheet2").Range("a1").Value = "abcd"   ’给sheet2工作表的a1单元格填充字符串“abcd”

End Sub

Sub ttt3()

’单元格的内部的填充色

Range("A2").Interior.ColorIndex = 3  ’将A2单元格的背景颜色设置为红色

Range("A2").Font.ColorIndex = 3      ’将A2单元格的字体颜色设置为红色

End Sub

9.VBA方法

VBA方法是作用于VBA对象上的动作,表示用某个方法作用于VBA的对象上,可以用下面的格式:

对象.方法  参数名称:=参数值

Sub ttt4()

’Range("A1").Copy Destination:= Range("A2")

Range("A1").Copy Range("A2")   ’将A1中的内容复制到A2

End Sub

Sub ttt5()

Sheet1.Move before:=Sheets("Sheet3")   ’将sheet1表移动到sheet3之前

End Sub

10.在一个乡*的文件中要求将Excel中一个表格的身份证号,配对并填充到另一个表中。宏代码如下:

Sub 配对()

Dim I, J As Integer

For I = 3 To 225

For J = 4 To 930

If Sheets("Sheet4").Range("b" & I).Value = Sheets("黄门乡").Range("b" & J).Value Then

Sheets("Sheet4").Range("e" & I).Value = Sheets("黄门乡").Range("d" & J).Value

End If

Next J

Next I

End Sub

’竟然没写入End IF,提示错误“Next 缺少 For”

11.判断语句

A.if判断语句

Sub 判断1() '单条件判断

If Range("a1").Value > 0 Then

Range("b1") = "正数"

Else

Range("b1") = "负数或0"

End If

End Sub

B.IIF判断语句

Sub 判断4()

Range("a3") = IIf(Range("a1") <= 0, "负数或零", "负数")

End Sub

C.select判断

Sub 判断1() '单条件判断

Select Case Range("a1").Value

Case Is > 0

Range("b1") = "正数"

Case Else

Range("b1") = "负数或0"

End Select

End Sub

Sub 判断2() '多条件判断

Select Case Range("a1").Value

Case Is > 0

Range("b1") = "正数"

Case Is = 0

Range("b1") = "0"

Case Else

Range("b1") = "负数"

End Select

End Sub

Sub 判断3()

If Range("a3") < "G" Then

MsgBox "A-G"

End If

End Sub

D.区间判断

Sub if区间判断()

If Range("a2") <= 1000 Then

Range("b2") = 0.01

ElseIf Range("a2") <= 3000 Then

Range("b2") = 0.03

ElseIf Range("a2") > 3000 Then

Range("b2") = 0.05

End If

End Sub

Sub select区间判断()

Select Case Range("a2").Value

Case 0 To 1000

Range("b2") = 0.01

Case 1001 To 3000

Range("b2") = 0.03

Case Is > 3000

Range("b2") = 0.05

End Select

End Sub

12.循环语句

A.单语句代码

Sub t1()

Range("d2") = Range("b2") * Range("c2")   ’将b2单元格与c2单元格相乘并赋值给d2单元格

Range("d3") = Range("b3") * Range("c3")   ’将b3单元格与c3单元格相乘并赋值给d3单元格

Range("d4") = Range("b4") * Range("c4")   ’将b4单元格与c4单元格相乘并赋值给d4单元格

Range("d5") = Range("b5") * Range("c5")   ’将b5单元格与c5单元格相乘并赋值给d5单元格

Range("d6") = Range("b6") * Range("c6")   ’将b6单元格与c6单元格相乘并赋值给d6单元格

End Sub

B.For each 循环语句

Sub s1()

Dim rg As Range

For Each rg In Range("a1:b7,d5:e9")

If rg = "" Then

rg = 0

End If

Next rg

End Sub

’注:在a1到b7单元区域和d5到e9单元格区域中的遍历所有单元格,若为空,就赋值0。

C、For Next语句

Sub t2()

Dim x As Integer

For x = 10000 To 2 Step -3

Range("d" & x) = Range("b" & x) * Range("c" & x)

Next x

End Sub

注:将10000行数据中每隔3行的b列和c列相乘赋值给d列。

D、For Each语句(应用offset方法来制定单元格)

Sub t3()

Dim rg As Range

For Each rg In Range("d2:d18")

rg = rg.Offset(0, -1) * rg.Offset(0, -2)

Next rg

End Sub

’注:offset就是偏移,针对d2而言,Offset(0, -1)指的就是向左移动1个单元格,即c2;而Offset(0, -2)指的就是向左移动2个单元格,即b2;第一个参数是垂直移动,正为向上,负为向下;第二个参数是水平移动,正为向右,负为向左。

VBA续嘘嘘

图12 offset函数分析图

E.Do ……Loop Until语句

Sub t4()

Dim x As Integer

x = 1

Do

x = x + 1

Cells(x, 4) = Cells(x, 2) * Cells(x, 3)

Loop Until x = 18

End Sub

’注:Cell(行,列),即上文中的x指的是行。将第二列和第三列相乘赋值给第四列。

F.Do While……Loop语句

Sub t5()

x = 1

Do While x < 18

x = x + 1

Cells(x, 4) = Cells(x, 2) * Cells(x, 3)

Loop

End Sub

’注:Cell(行,列),即上文中的x指的是行。将第二列和第三列相乘赋值给第四列。

G.Do ……Loop Until语句

Sub s2()

Dim x As Integer

Do

x = x + 1

If Cells(x + 1, 1) <> Cells(x, 1) + 1 Then

Cells(x, 2) = "断点"

Exit Do

End If

Loop Until x = 14

End Sub

’判断第1列中的数据不连续,就在其后的单元格输入一个“断点”。

13. 学习变量

A、什么是变量?

所谓变量,就是可变的量。就好象在内存中临时存放的一个小盒子,这个小盒子放的什么物体不固定。

Dim m As Integer

Sub t1()

Dim X As Integer 'x就是一个整形变量

For X = 1 To 10

Cells(X, 1) = X

Next X

End Sub

B、小盒子里可以放什么?

1、放数字   2、放文本

Sub t2()

Dim st As String    ’st存放字符串

Dim X As Integer    ’X存放整数类型

For X = 1 To 10

st = st & "Excel精英培训"

Next X

End Sub

3、 放对象

Sub t3()

Dim rg As Range      ’rg是单元格类型

Set rg = Range("a1") ’Set关键词就是给对象变量指定值

rg = 100

End Sub

4、 放数组

Sub t4()

Dim arr(1 To 10) As Integer, X As Integer

For X = 1 To 10

arr(X) = X

Next X

End Sub

’数组arr(1),arr(2),arr(3)……arr(10)都是整形类型

C、变量的类型和声明

1 变量的类型

(1)整型(Integer):

表示-32768至32767之间的整数           例如:10   110   20

(2)长整型(Long):

表示-2,147,483,648至2,147,483,647之间的整数

例如:长整型的书写:    23454444554

(3)单精度实型(Single):

有效数为7位 表示-3.37E+38至3.37E+38之间的实数

(4)双精度实型(Double):

有效数为15位

(5)字符型(String)

在VB中字符串常量是用双引号“ ”括起的一串字符,例 如"ABC","abcdefg","123","0","VB程序设计"等。

(6) 逻辑型(Boolean)

逻辑型又称布尔型,其数据只有True(真)和False(假)两个值

(7)日期型(Date)

表示日期和时间

用两个“#”符号把日期和时间的值括起来       如:#08/20/2001#、#2001-08-20#

2 为什么要声明变量

变量通过索引可以存储更多的值,在循环结构中的作用大。

3 声明变量

dim public

D、变量的存活周期

1 过程级变量:过程结束,变量值释放

'如t1

2 模块级变量:变量的值只在本模块中保持,工作簿关闭时随时释放

Sub t6()

m = 1

End Sub

Sub t5()

MsgBox m

m = 7

End Sub

3 全局级变量: 在所有的模块中都可以调用,值会保存到EXCEL关闭时才会被释放。

' public 变量

Sub t7()

MsgBox qq

End Sub

E、变量的释放

一般情况下,过程级变量在过程运行结束后就会自动从内存中释放,而只有一些从外部借用的对象变量才需要使用set 变量=nothing进行释放。

14.函数与公式

A、用VBA在单元格中输入普通公式

Option Explicit

Sub t1()

Range("d2") = "=b2*c2"   ’将b2乘以c2赋值给d2

End Sub

VBA续嘘嘘

Sub t2()

Dim x As Integer

For x = 2 To 6

Cells(x, 4) = "=b" & x & "*c" & x     ’将b列乘以c列赋值给d列

Next x

End Sub

VBA续嘘嘘

B、用VBA在单元格输入带引号的公式

Sub t3()

Range("c16") = "=SUMIF(A2:A6,""b"",B2:B6)" '遇到单引号就把单引号加倍

End Sub

注:在A2:A6单元格区域中,找到b项,共两个,将所对应的B列中的单元格值相加,即3+5=8。

VBA续嘘嘘

C、用VBA在单元格中输入数组公式

Sub t4()

Range("c9").FormulaArray = "=SUM(B2:B6*C2:C6)"

End Sub

’注:将b列和c列相乘的结果

D、利用单元格公式返回值

Sub t5()

Range("d16") = Evaluate("=SUMIF(A2:A6,""b"",B2:B6)")

Range("d9") = Evaluate("=SUM(B2:B6*C2:C6)")

End Sub

E、借用工作表函数

Sub t6()

Range("d8") = Application.WorksheeFunction.CountIf(Range("A1:A10"), "B")

End Sub

F、利用VBA函数

Sub t7()

Range("C20") = VBA.InStr(Range("a20"), "E")

End Sub

G、编写自定义函数

Function wn()

wn = Application.Caller.Parent.Name

End Function

15. VBE编辑器

A、工程窗口

a 显示工作簿工作表对象

b 窗体

c 模块

d 类模块

range("a1")=10

'对应工程窗口的对象和模板,显示其所具体的一些特征。

VBA续嘘嘘

B、代码窗口

a 注释文字的设置

b 代码缩进的设置

c 代码强制转行的设置

d 代码运行和调试

'逐句运行

'设置断点

e 对象列表框和过程列表框

C、立即窗口

立即窗口可以把运行过程中的值立即显示出来,主要用于程序的调试

Sub d()

Dim x As Integer, st As String

For x = 1 To 10

st = st & Cells(x, 1)

Debug.Print "第" & x & "次运行结果:" & st

Next x

End Sub

D、本地窗口

'在本地窗口中可以显示运行中断时对象信息、变量值、数组信息等

Sub d1()

Dim x As Integer, k As Integer

For x = 1 To 10

k = k + Cells(x, 1)

Next x

End Sub

16.VBA分支语句与End语句

A、END语句

作用:强制退出所有正在运行的程序。

B、 Exit语句:退出指定的语句

a、Exit Sub语句

Sub e1()

Dim x As Integer

For x = 1 To 100

Cells(1, 1) = x

If x = 5 Then

Exit Sub

End If

Next x

Range("b1") = 100

End Sub

b、Exit function语句

Function ff()

Dim x As Integer

For x = 1 To 100

If x = 5 Then

Exit Function

End If

Next x

ff = 100

End Function

c、Exit for语句

Sub e2()

Dim x As Integer

For x = 1 To 100

Cells(1, 1) = x

If x = 5 Then

Exit For

End If

Next x

Range("b1") = 100

End Sub

d、Exit do 语句

Sub e3()

Dim x As Integer

Do

x = x + 1

Cells(1, 1) = x

If x = 5 Then

Exit Do

End If

Loop Until x = 100

Range("b1") = 100

End Sub

C、VBA分支语句

Option Explicit

a、Goto语句,跳转到指定的地方

Sub t1()

Dim x As Integer

Dim sr

100:

sr = Application.InputBox("请输入数字", "输入提示")

If Len(sr) = 0 Or Len(sr) = 5 Then GoTo 100

End Sub

注:“100:”就是一个Goto语句可以跳入的标志。“Len(sr)=0”表示输入框没有输入,“Len(sr) = 5”表取消。其实质就是“false”是5个字符。

VBA续嘘嘘

b、gosub..return ,跳过去,再跳回来

Sub t2()

Dim x As Integer

For x = 1 To 10

If Cells(x, 1) Mod 2 = 0 Then GoSub 100

Next x

Exit Sub

100:

Cells(x, 1) = "偶数"

Return    '跳到gosub 100 这一句

End Sub

c、on error resume next '遇到错误,跳过继续执行下一句

Sub t3()

On Error Resume Next

Dim x As Integer

For x = 1 To 10

Cells(x, 3) = Cells(x, 2) * Cells(x, 1)

Next x

End Sub

d、on error goto  '出错时跳到指定的行数

Sub t4()

On Error GoTo 100

Dim x As Integer

For x = 1 To 10

Cells(x, 3) = Cells(x, 2) * Cells(x, 1)

Next x

Exit Sub

100:

MsgBox "在第" & x & "行出错了"

End Sub

e、on error goto 0 '取消错误跳转

Sub t5()

On Error Resume Next

Dim x As Integer

For x = 1 To 10

If x > 5 Then On Error GoTo 0

Cells(x, 3) = Cells(x, 2) * Cells(x, 1)

Next x

Exit Sub

End Sub

17、Excel文件操作的几个概念

A、excel文件和工作簿概念

excel文件就是excel工作簿,excel文件打开需要excel程的支持

Workbooks  工作簿集合,泛指excel文件或工作簿

Workbooks("A.xls"),名称为A的excel工作簿

Sub t1()

Workbooks("A.xls").Sheets(1).Range("a1") = 100

End Sub

workbooks(2),按打开顺序,第二个打开的工作簿。

Sub t2()

Workbooks(2).Sheets(2).Range("a1") = 200

End Sub

ActiveWorkbook ,当打开多个excel工作簿时,你正在操作的那个就是ActiveWorkbook(活动工作簿)

Thisworkbook,VBA程序所在的工作簿,无论你打开多少个工作簿,无论当前是哪个工作簿是活动的,thisworkbook就是指它所在的工作簿。

B、工作簿窗口

Windows("A.xls"),A工作簿的窗口,使用windows可以设置工作簿窗口的状态,如是否隐藏等。

Sub t3()

Windows("A.xls").Visible = False

End Sub

Sub t4()

Windows(2).Visible = True

End Sub

18、Excel文件的操作

A、 判断A.Xls文件是否存在

Sub W1()

If Len(Dir("d:/A.xls")) = 0 Then

MsgBox "A文件不存在"

Else

MsgBox "A文件存在"

End If

End Sub

B、 判断A.Xls文件是否打开

Sub W2()

Dim X As Integer

For X = 1 To Windows.Count

If Windows(X).Caption = "A.XLS" Then

MsgBox "A文件打开了"

Exit Sub

End If

Next

End Sub

C、excel文件新建和保存

Sub W3()

Dim wb As Workbook

Set wb = Workbooks.Add

wb.Sheets("sheet1").Range("a1") = "abcd"

wb.SaveAs "D:/B.xls"

End Sub

D、 excel文件打开和关闭

Sub w4()

Dim wb As Workbook

Set wb = Workbooks.Open("D:/B.xls")

MsgBox wb.Sheets("sheet1").Range("a1").Value

wb.Close False

End Sub

E、 excel文件保存和备份

Sub w5()

Dim wb As Workbook

Set wb = ThisWorkbook

wb.Save

wb.SaveCopyAs "D:/ABC.xls"

End Sub

F、 excel文件复制和删除

Sub W6()

FileCopy "D:/ABC.XLS", "E:/ABCd.XLS"

Kill "D:/ABC.XLS"

End Sub

19、工作表的概念

A、excel工作表的分类

excel工作表有两大类,一类是我们平常用的工作表(worksheet),另一类是图表、宏表等。这两类的统称是sheets

sheets  工作表集合,泛指excel各种工作表

Sheets("A"),名称为A的excel工作表

Sub t1()

Sheets("A").Range("a1") = 100

End Sub

' workbooks(2),按打开顺序,第二个打开的工作簿。

Sub t2()

Sheets(2).Range("a1") = 200

End Sub

'ActiveSheet ,当打开多个excel工作簿时,你正在操作的那个就是ActiveSheet

20、工作表的操作

A、判断A工作表文件是否存在

Sub s1()

Dim X As Integer

For X = 1 To Sheets.Count

If Sheets(X).Name = "A" Then

MsgBox "A工作表存在"

Exit Sub

End If

Next

MsgBox "A工作表不存在"

End Sub

B、 excel工作表的插入

Sub s2()

Dim sh As Worksheet

Set sh = Sheets.Add

sh.Name = "模板"

sh.Range("a1") = 100

End Sub

C、 excel工作表隐藏和取消隐藏

Sub s3()

Sheets(2).Visible = True

End Sub

D、 excel工作表的移动

Sub s4()

Sheets("Sheet2").Move before:=Sheets("sheet1") 'sheet2移动到sheet1前面

Sheets("Sheet1").Move after:=Sheets(Sheets.Count) 'sheet1移动到所有工作表的最后面

End Sub

E、 excel工作表的复制

Sub s5() '在本工作簿中

Dim sh As Worksheet

Sheets("模板").Copy before:=Sheets(1)

Set sh = ActiveSheet

sh.Name = "1日"

sh.Range("a1") = "测试"

End Sub

F、工作表的保存

Sub s6() '另存为新工作簿

Dim wb As Workbook

Sheets("模板").Copy

Set wb = ActiveWorkbook

wb.SaveAs ThisWorkbook.Path & "/1日.xls"

wb.Sheets(1).Range("b1") = "测试"

wb.Close True

End Sub

G、 保护工作表

Sub s7()

Sheets("sheet2").Protect "123"

End Sub

Sub s8() '判断工作表是否添加了保护密码

If Sheets("sheet2").ProtectContents = True Then

MsgBox "工作簿保护了"

Else

MsgBox "工作簿没有添加保护"

End If

End Sub

H、工作表删除

Sub s9()

Application.DisplayAlerts = False

Sheets("模板").Delete

Application.DisplayAlerts = True

End Sub

I、工作表的选取

Sub s10()

Sheets("sheet2").Select

End Sub