EXCELVBA学习笔记

更新时间:2023-10-26 10:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 VBA 基础知识 1-2 宏在工作中的运用 1.宏的定义 宏:macro

形容词:巨大的;大量的;宏观的 名词:[电脑]巨(宏)指令

定义:一组可以让自动执行的代码(VBA) 宏的录制相当于摄像机的功能。 2.总结:

优点:重复执行相同操作,提高工作效率 缺点:不够智能化,无法交互工作,代码冗余 解决方案:VBA 3.宏在excel中的地位

虽然看起来不够灵活,但对于学习VBA编程却非常重要。 1.提高代码编写效率 2.帮助学习VBA知识 1-4 代码编写规则

代码换行(下划线+空格+换行) Sub aa() Msgbox _ “学习VBA” End sub

1-7 属性

VBA属性:指对象所具有的特性

人的属性:姓名、年龄、身份证号、住址…… VBA对象属性的赋值 Sub 属性赋值()

Sheet2.name=”改变自己” Sheet2.range(“a1”)=”学习VBA” End sub 1-8 方法

方法:实际上就是对对象的操作,它是一种动作,一种行为。 Sub 选择方法()

Range(\End Sub Sub 复制方法()

Sheets(1).Range(\

Sheets(1).Range(\End Sub Sub 删除方法() Sheets(3).Delete End Sub 1-9 常量与变量

1.常量:常量是定义了之后就不做变化了。

常量定义格式:const 常量名=常量表达式 2.变量:在定义之后还能再次赋值 变量定义格式:dim 变量 as 变量类型

3.A.VBA允许使用未定义的变量,默认是变体变量(Variant) B.变量的强制声明:Option explicit 4.变量名的命名规则 以字母开头 不能用保留字 不超过255个字符 同一范围内必须是唯一 1-10 数据类型 类型 Integer Single Double Long String Currency

注释 整型 单精度 双精度 长整型 字符型 货币型

简写 % ! # & $ @

占用内存 2byte 4byte 8byte 4byte 定长或变长 8byte

1-12 IF语句

VBA中的IIF函数与工作表函数IF的语法结构一致 Sub iif函数应用()

Cells(2,3)=iif(cells(1,2)>80,”优秀”,”不优秀”)

End sub 1-12B

1.单行形式1(if…then) If 条件判断 then 条件成立结果

注意:在单行形式中,按照if…then判断的结果也可以执行多条语句。所有语句必须在同一行上并且以冒号分开。 Sub test()

If 11>10 then a=a+1:b=1+a:c=1+b End sub

2.单行形式(if 条件判断 then 条件成立 else 条件不成立) Sub test2()

If 2 > 1 Then MsgBox \End Sub

3.块形式(if…then…end) If 条件判断 then 条件成立结果 End if Sub test3() If 11 > 10 Then a = 1 + a b = 1 + a c = 1 + b

End If End Sub

4.块形式的if嵌套 If 条件判断 then 成立时的结果 Elseif 条件判断 then 成立时的结果 …… Else

不成立时的结果 End if 1-13

Select case 语句 根据表达式的值,来决定执行几组语句中的其中之一。

sub select单条件判断() i = -1 Select Case i Case Is > 0 MsgBox \正数\ Case Else MsgBox \负数\ End Select

End Sub

1-14 循环语句之DO…LOOP

Do……loop循环语句,直到满足某个条件 Sub 基本示例() Dim a% Do a = a + 1 If a > 10 Then

MsgBox a & \终于大于10\Exit Do End If Loop End Sub

1-15 循环语句do loop 实例 Sub 基本示例() Dim rs% rs = 1 Do rs = rs + 1 If rs > 10 Then Exit Do 'exit sub Else

If Cells(rs, 2) >= 90 Then Cells(rs, 3) = \√\ End If Loop End Sub

Sub 循环语句while() Dim rs% rs = 2

Do While Cells(rs, 2) <> \

If Cells(rs, 2) > 90 Then Cells(rs, 3) = \√\ rs = rs + 1 Loop End Sub

1-17 循环语句 do until Sub dountil() Dim rs% rs = 2

Do Until Cells(rs, 2) = \

If Cells(rs, 2) > 90 Then Cells(rs, 3) = \√\ rs = rs + 1 Loop End Sub Sub 隔行填色()

Dim rs% rs = 2

Do Until Cells(rs, 1) = \

Range(\ rs = rs + 2 Loop End Sub

1-18 循环语句之while与until位置变化

While与until不但可以放在do后面,也可以放在loop后面 事实上有时在循环的最后一行进行判断,更具有意义。 Sub doloop的最后判断循环() Dim pss$, i% Do i = i + 1

If i > 3 Then Exit Do

pss = InputBox(\请输入密码:\Loop Until pss = \loop while pss<>”123” End Sub

1-18b do…loop语法小结 'do [{while | until} 表达式] '[执行的一条或多条语句] '[exit do]

'[执行的一条或多条语句] 'Loop

'while:当这个条件为true时就循环 'until:直到这个条件为true时就跳出循环 '或者可以使用下面这种语法: 'Do

'[执行的一条或多条语句] '[exit do]

'[执行的一条或多条语句] 'Loop [{while | until} 表达式] '用do…loop循环要注意的几点:

'1.while与until是放在do后面还是loop后面,取决于是先判断再循环(放在do后面),还是先循环再判断(放在loop后面) '2.可以在do…loop中的任何位置放置任意个数的exit do语句,随时跳出do…loop

'3.do…loop+if…then+exit do通常结合使用

'4。如果exit do使用在嵌套的do…loop语句中,则exit do会将控制权转移到exit do所在位置的外层循环。 Sub test() Dim a% Do a = a + 1

If a > 5 Then

MsgBox a & \终于大于5了!\ Exit Do End If Loop End Sub

Sub test2() '注意这是一个死循环,按f8运行(中止死循环,ctrl+暂停键) Do b = b + 1 Do

a = a + 1

If a > 3 Then MsgBox \即将跳出内层循环\ Loop

MsgBox \即将进行外层循环\Loop End Sub

1-19 循环语句之for each next

当需要处理集合成员时,一般会用for each…next,实际上就是处理对象。 Sub foreachnext()

Dim rng As Range, wsh As Worksheet, n As Byte

For Each rng In Sheets(1).Range(\ If rng = \Next

For Each wsh In Worksheets n = n + 1

Sheets(1).Cells(n, 3) = wsh.Name Next End Sub

1-20 循环语句之for…next

'for…next也是循环语句,与之前的do…loop不同之处在于,for next又一个内置的计数器 Sub fornext循环() Dim i!, j! For i = 1 To 100 j = j + i Next MsgBox j End Sub Sub fornextxh() Dim rng! For rng = 2 To 10 Sheets(1).Cells(rng,

3)

=

Sheets(1).Cells(rng,

1)

*

Sheets(1).Cells(rng, 2) Next End Sub

1-21 for…next小结与实例 'for…next语句

'以指定次数来重复执行一组语句 '语法:

'for 计数变量=初始值 to 终止值 [step 步长值] '[执行的一条或多条语句] '[exit for]

'[执行的一条或多条语句] 'next [计数变量]可以忽略不写

'1.循环中可以在任何位置放置任意个exit for语句,随时退出循环

'2.exit for与if…then经常一起使用,目的是:找到符合条件后,跳出循环,而不必再进行不必要的循环 Sub test3() For i = 1 To 16

If Cells(i, 1) = \班\Next For j = 1 To 16

If Cells(j, 1) = \班\

Next

MsgBox \班的人数为:\End Sub

'3.可以将一个for…next循环放置在另一个for…next循环中,组成嵌套循环 'for i=1 to 10 ' for j=1 to 10 ' for k=1 to 10 ' …… ' next ' next 'next

Sub 理解计数变量的运行() For i = 1 To 2 For j = 1 To 3

k = \外层的第\次的,内层的第 Next Next End Sub

Sub 九九乘法表() Dim a%, b% For a = 1 To 9

\次\ For b = 1 To 9 If b > a Then Exit For Else

Sheets(2).Cells(a, b) = b & \×\=\ End If Next Next End Sub

1-22 exit与end语句 Exit是退出当前语句

Exit do;exit for;exit function;exit sub End结束一个过程或块

End;end function;end if;end select;end sub 1-23 跳转语句

'GoTo Line 无条件地转移到过程中指定的行。

'注意: 太多的goto 语句,会使程序代码不容易阅读及调试 '尽可能使用结构化控制语句(do…loop,for…next,if…then…else,select) Sub gotoline() Dim str$, k! line:

k = k + 1

If k > 3 Then Exit Sub

str = InputBox(\请录入用户名!\ If str <> \End Sub 'GoTo …return Sub gotoreturn() Dim i! For i = 2 To 10

If Cells(i, 1) > 1 / 3 Then GoSub 100 Next Exit Sub 100:

Cells(i, 2) = \迟到\Return End Sub

1-24、错误分支语句 Sub onerrorresume() Dim i!

On Error Resume Next '当错误的时候继续执行下去 For i = 2 To 8

Cells(i, 4) = Cells(i, 3) + Cells(i, 2)

Next End Sub

'on error goto 当错误的时候去哪儿? Sub onerrorgoto() On Error GoTo 100 For i = 2 To 8

k = Cells(i, 2) + Cells(i, 3) Next 100:

MsgBox \对不起,错误发生在第\行\End Sub 1-25 with语句

'with语句,当对某个对象执行一系列的语句时,不用重复指出对象的名名称。 Sub with语句()

a = Range(\ b = Range(\ Range(\End Sub Sub with语句2() With Range(\ a = .Address

b = .Parent.Name .Value = \ End With End Sub Sub with嵌套()

Range(\?\ Range(\ Range(\ Range(\End Sub Sub with嵌套2() With Range(\ .Value = \ .Parent.Name = \ With .Font .Size = 20 .Bold = True End With End With End Sub 1-26 VBA与公式

'在VBA中也可以像在工作表中一样录入公式

Sub vba中的做法() Dim i% For i = 1 To 10

Range(\Next End Sub Sub 普通公式()

Sheets(1).Cells(1, 3) = \End Sub Sub 批量计算() Dim i As Integer For i = 1 To 10

Sheets(1).Cells(i, 4) = \Next i End Sub Sub 数组公式()

Range(\End Sub

Sub 带工作表函数的计算() Dim i As Integer For i = 1 To 10

Sheets(1).Cells(i, 3) = \

Next i End Sub

Sub 公式带引号的计算()

Cells(2, 5) = \Cells(3, 5) = \End Sub '借用工作表函数 Sub 运用工作表函数()

MsgBox Application.WorksheetFunction.CountIf(Range(\\钢笔\

MsgBox WorksheetFunction.CountIf(Range(\钢笔\MsgBox Application.CountIf(Range(\钢笔\End Sub 'VBA函数 Sub VBA函数()

MsgBox VBA.Format(Range(\年m月d日\MsgBox Format(Range(\年m月d日\End Sub '自定义函数() Function sex(rng As Range)

sex = IIf(Mid(rng, 15, 3) Mod 2, \男\女\End Function

'定义:运算符是代表VBA某种运算功能的符号 '⑴赋值运算符:=

'②数学运算符:&(字符连接符)、+、-、mod(取余)、\\(整除)、*、/、-(负号)、^(指数)

'③逻辑运算符:not(非)、and(与)、or(或)、xor(异或)、eqv(相等)、imp(隐含)

'④关系运算符:=(相同)、<>(不等)、>(大于)、<(小于)、>=、<=、like

'like用来比较两个字符串 '?任何单一字符 '*零个或多个字符 '#任何一个数字(0-9)

'[charlist]charlist中的任何单一字符 '[!charlist]不在charlist中的任何单一字符 *### *E* NED#

最后三个是数字 包含E字

以NED开始,然后接一个数字

[A-Z][A-Z]### 两个任意字母开始,再接三个任意数字 ????

编号为四个字符

1-32、综合运用(盘点清单核对) Sub 核对清单()

Dim rng As Range, rngs As Range, k%

For i = 1 To rs

Range(\ rng = Range(\ If rng > 2500 Then lj = lj + rng: k = k + 1 End If Next

MsgBox \大于2500的平均工资是:\End Sub

Sub 动态引用行列区域() Dim a%, b%

a = Application.CountA(Range(\ b = Application.CountA(Range(\ Range(Cells(1, 1), Cells(a, b)).Select End Sub

Sub 动态引用使用区域()

a = Application.CountA(Columns(1)) b = Application.CountA(Rows(1)) Range(\End Sub

Sub chr函数字符循环() Dim i&

For i = 1 To 65535 Cells(i, 1) = i Cells(i, 2) = Chr(i) Next End Sub Sub 行列引用()

i = Range(\ j = Range(\

k = Range(\ l = Range(\

m = Range(\End Sub Sub row应用()

For Each rw In Rows(\ If rw.Row Mod 2 = 0 Then rw.RowHeight = 5 End If Next

For Each cl In Columns() If cl.Column Mod 2 = 0 Then cl.ColumnWidth = 1 End If

Next End Sub

For Each rng In [a2:a27] For Each rngs In [b2:b7] If rng = rngs Then GoTo 100 End If Next k = k + 1

Cells(k + 1, 3) = rng 100: Next End Sub

Sub 按钮1_Click()

Dim rng As Range, rngs As Range, k! [c2:c400].Clear

For Each rng In [a2:a400]

For Each rngs In Range(\ If rng = rngs Then GoTo 100 End If Next rngs k = k + 1

Cells(k + 1, 3) = rng

100: Next rng End Sub

第二章EXCEL工作簿和工作表操作 2-0 工作簿与工作表基础知识 Sub 拆分到工作簿()

Dim wk As Workbook, ss$, k% Application.DisplayAlerts = False

For Each sht In Workbooks(\工作簿名称\ Set wk = Workbooks.Add k = k + 1

Workbooks(1).Sheets(k).Copy Workbooks(2).Sheets(1) ss = ThisWorkbook.Path & \ wk.SaveAs ss wk.Close Next

Application.DisplayAlerts = True MsgBox \拆分工作簿完成!\End Sub

2-1 工作簿表示方法 Sub 工作簿名称表示法() MsgBox ThisWorkbook.Name

MsgBox Workbooks(ThisWorkbook.Name).Parent End Sub

Sub 工作簿索引号表示法() MsgBox Workbooks(2).Name End Sub

Sub 窗口表示法()

MsgBox Windows.Count

MsgBox Windows(1).Parent.Name End Sub

Sub 工作簿实例workbooks法() Dim i

For i = 1 To Workbooks.Count Cells(i, 8) = Workbooks(i).Name Next End Sub

Sub 工作簿实例windows方法() Dim i

For i = 1 To Windows.Count

Cells(i, 9) = Windows(i).Parent.Name Next End Sub

2-2 当前工作簿与活动工作簿

Thisworkbook 当前工作簿,代码所在工作簿 Activeworkbook 活动工作簿,被激活的工作簿

'Workbooks 由当前所有在内存中打开的workbook对象组成 '向workbooks添加workbook对象 '新建工作簿 Sub 新建工作簿() Dim wkb As Workbook Set wkb = Workbooks.Add wkb.SaveAs \End Sub

Sub 打开工作簿() Dim wkb As Workbook

Set wkb = Workbooks.Open(\End Sub Sub 关闭()

Workbooks(\End Sub

Sub 文件复制与删除()

FileCopy \ Kill \End Sub Sub 多表合并()

Dim i!, rs!, rss!, st As Worksheet, zst As Worksheet Set zst = Sheets(\汇总南区\ For Each st In Worksheets

If st.Name <> \汇总南区\ rs = st.Range(\ rss = zst.UsedRange.Rows.Count + 1 st.Range(\ zst.Cells(rss, 9).Resize(rs - 3) = st.Name End If Next End Sub Sub 插入合计() Dim r!, k%, i%, j% Do

r = 17 + k * 16 Rows(r).Insert Cells(r, 1) = \合计\ For i = 2 To 4 For j = 1 To 15

Cells(r, i) = Cells(r, i) + Cells(r - j, i)

或{ Cells(r, i) = Cells(r, i) + Cells(r - 15, i)(j)} Next

本文来源:https://www.bwwdw.com/article/b7s2.html

Top