(工作需要,临时啃vba)
输入数据
Sub 输入100() //输入100 Macro // 宏由 Lenovo User 录制,时间: 2011-4-22 Range("A1").Select ActiveCell.FormulaR1C1 = "100" Range("B4").Select End Sub删除数据 Sub 删除A1的内容() ’ ’ 删除A1的内容 Macro ’ 宏由 Lenovo User 录制,时间: 2011-4-22 ’
’ Range(“A1”).Select Selection.ClearContents End Sub
1语句:
'VBA中的代码的基本结构与组成部分 'VBA语句 '一、宏程序语句(填充) '运行后可以完成一个功能 Sub test() '开始语句 Range("a1") = 100 End Sub '结束语句 '二、函数程序语句(调用函数) '运行后可以返回一个值 Function shcount() shcount = Sheets.Count End Function '三、在程序中应用的语句(调用test这个宏) Sub test2() Call test End Sub Sub test3()(循环语句,在1-100中填充1-100) For x = 1 To 100 'for next 循环语句 Cells(x, 1) = x Next x End Sub'VBA中的对象其实就是我们操作的具有方法、属性的excel中支持的对象
'Excel中的几个常用对象表示方法:
’1、工作簿
' Workbooks 代表工作簿集合,所有的工作簿,Workbooks(N),表示已打开的第N个工作簿 ' Workbooks ("工作簿名称") ' ActiveWorkbook 正在操作的工作簿 ' ThisWorkBook '代码所在的工作簿’2、工作表
'Sheets("工作表名称") 'Sheet1 表示第一个插入的工作表,Sheet2表示第二个插入的工作表.... 'Sheets(n) 表示按排列顺序,第n个工作表 'ActiveSheet 表示活动工作表,光标所在工作表 'worksheet 也表示工作表,但不包括图表工作表、宏工作表等。’3、单元格
'cells 所有单元格 'Range ("a1:a10,c2") 'Cells(行数,列数) 'Activecell 正在选中或编辑的单元格 'Selection 正被选中或选取的单元格或单元格区域'VBA属性就是VBA对象所具有的特点 '表示某个对象的属性的方法是:
’对象.属性=属性值 (赋值)
Sub ttt() Range("a1").Value = 100 End Sub(改名)
Sub ttt1() Sheets(1).Name = "工作表改名了" End Sub(工作表的单元格的值)
Sub ttt2() Sheets("Sheet2").Range("a1").Value = "abcd" End Sub(把单元格改成红色的背景色) ’Range(“A2”).Interior.ColorIndex = 3 (修改背景色) ‘Range(“A2”).Font.ColorIndex = 3 (修改字体颜色)
Sub ttt3() Range("A2").Interior.ColorIndex = 3 End Sub'VBA方法是作用于VBA对象上的动作
'表示用某个方法作用于VBA的对象上,可以用下面的格式:
对象.方法 参数名称 := 参数值 (把a1的内容复制到a2中)
Sub ttt4() Range("A1").Copy Range("A2") End Sub()
Sub ttt5() Sheet1.Move before:=Sheets("Sheet3") End Sub(删除工作表)
Sub ttt4() sheets("sheet2").Delete End Sub1.if判断语句
If 条件 Then 语句1 Else 语句2 End If单条件判断
Sub 判断1() If Range("a1").Value > 0 Then Range("b1") = "正数" Else Range("b1") = "负数或0" End If End Sub多条件判断
If 条件1 Then 语句1 Else If 条件2 Then 语句2 Else If 条件3 Then 语句3 End If Sub 判断2() ' If Range("a1").Value > 0 Then Range("b1") = "正数" ElseIf Range("a1") = 0 Then Range("b1") = "等于0" ElseIf Range("B1") <= 0 Then Range("b1") = "负数" End If End Sub If 条件1 And 条件2 Then 语句 End If(IF语句具有多条件判断优势,if使用较多)
Sub 多条件判断2() If Range("a1") <> "" And Range("a2") <> "" Then Range("a3") = Range("a1") * Range("a2") End If End Sub2.select-case 先找到判断对象;再根据情况进行操作。
(单条件判断)
Select Case 判断对象 Case 条件1 语句1 Case Else 语句2 End Select Sub 判断1() Select Case Range("a1").Value Case Is > 0 Range("b1") = "正数" Case Else Range("b1") = "负数或0" End Select End Sub('多条件判断)
Select Case 对象 Case 条件1 语句1 Case 条件2 语句2 Case Else 语句3 End Select 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 Sub3.IFF函数
只能作为简单的判断在简化语句时使用;
Sub 判断4() Range("a3") = IIf(Range("a1") <= 0, "负数或零", "负数") End Sub4.区间判断 使用IF: 需求:根据a2判断b2的取值
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使用select-case: 注:可以使用to来创造区间
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(复杂做法)
Sub t1() Range("d2") = Range("b2") * Range("c2") Range("d3") = Range("b3") * Range("c3") Range("d4") = Range("b4") * Range("c4") Range("d5") = Range("b5") * Range("c5") Range("d6") = Range("b6") * Range("c6") End Sub(1.构造循环,有数字规律时使用for-to-step)
Sub t2() Dim x As Integer '声明一个变量 For x = 10000 To 2 Step -3 //For x = 2 To 6 Step 1(从2到6,按1递增) Range("d" & x) = Range("b" & x) * Range("c" & x) Next x End Sub(2.构造循环,有位置规律时使用for-each-in-range)
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(在一定区域的空白单元格内填充0) (注:如果找不到数字规律,看看是否可以使用for-each-in-range来达到目的)
Sub case1() Dim rg As Range //声明单元格对象 For Each rg In Range("a1:b7,d5:e9") //定位两个修改范围(类似于选定两个班级) If rg = "" Then rg = 0 //空白区域填充0 End If Next rg //循环 End Sub3.do循环 注意:很容易造成死循环
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(do-while:终止条件放到前面)
Sub t5() x = 1 //计数器 Do While x < 18 //循环结束条件 x = x + 1 Cells(x, 4) = Cells(x, 2) * Cells(x, 3) Loop //语句 End Sub(用do语句寻找数据中存在的断点)
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 //如果一直找不到断点,在第14行结束循环 End Sub’变量 一、什么是变量? 所谓变量,就是可变的量。就好象在内存中临时存放的一个小盒子,这个小盒子放的什么物体不固定。
Sub t1() Dim X As Integer //x就是一个整数型变量 For X = 1 To 10 Cells(X, 1) = X Next X End Sub二、小盒子里可以放什么? 1 放数字:如t1
2 放文本
Sub t2() Dim st As String Dim X As Integer For X = 1 To 10 st = st & "Excel精英培训" Next X End Sub3 放对象
Sub t3() Dim rg As Range Set rg = Range("a1") //把a1单元格这个对象,放进rg这个对象变量中,此后,rg就代表了单元格a1(注:给对象变量赋值,一定要使用set关键词) rg = 100 End Sub4 放数组
Sub t4() Dim arr(1 To 10) As Integer, X As Integer //声明变量 dim-as For X = 1 To 10 arr(X) = X Next X End Sub三、变量的类型和声明 帮助-语言参考-数据类型 1 变量的类型
详见帮助文件
2 为什么要声明变量 物尽其用,人尽其才。 3 声明变量 dim public
四、变量的存活周期
1 过程级变量:过程结束,变量值释放 如t1
2 模块级变量:在模块顶上声明的变量 变量的值只在本模块中保持,工作簿关闭时随时释放 例:
Sub t6() m = 1 End Sub Sub t5() MsgBox m m = 7 End Sub3。 全局级变量: 在所有的模块中都可以调用,值会保存到EXCEL关闭时才会被释放。 public 变量名称 as 类型
Sub t7() MsgBox qq End Sub五 变量的释放
一般情况下,过程级变量在过程运行结束后就会自动从内存中释放,而只有一些从外部借用的对象变量才需要使用set 变量=nothing进行释放。
一、在单元格中输入公式
1、用VBA在单元格中输入普通公式
例1:
Sub t1() Range("d2") = "=b2*c2" End Sub修改例1:
Sub t2() Dim x As Integer For x = 2 To 6 Cells(x, 4) = "=b" & x & "*c" & x //与上面的公式相比,只需要把行号x的位置独立出来(变量和字符串连接一定要使用&符号) Next x End Sub'2、用VBA在单元格输入带引号的公式(一般字符串需要加双引号)
Sub t3() Range("c16") = "=SUMIF(A2:A6,""b"",B2:B6)" //遇到单引号就把单引号加倍 End Sub3、用VBA在单元格中输入数组公式
Sub t4() Range("c9").FormulaArray = "=SUM(B2:B6*C2:C6)" //使用数组公式,计算:b2*c2+b3*c3+b4*c4+b5*c5+b6*c6 End Sub’二、利用单元格公式返回值(单元格公式)
Sub t5() Range("d16") = Evaluate("=SUMIF(A2:A6,""b"",B2:B6)") //使用公式把表达式返回成数值 Range("d9") = Evaluate("=SUM(B2:B6*C2:C6)") End Sub’三、借用工作表函数(工作表函数)
Sub t6() Range("d8") = Application.WorksheeFunction.CountIf(Range("A1:A10"), "B") //调用sum函数 End Sub’四、利用VBA函数(VBA函数)
Sub t7() Range("C20") = VBA.InStr(Range("a20"), "E")//查找字符串的位置 End Sub'五、编写自定义函数
Function wn() wn = Application.Caller.Parent.Name End Function’一、VBE的窗口 ’1、工程窗口
'A 显示工作簿工作表对象 'B 窗体 'C 模块 'D 类模块'range(“a1”)=10
'对应工程窗口的对象和模板,显示其所具体的一些特征。
’3、代码窗口 'A 注释文字的设置 'B 代码缩进的设置 'C 代码强制转行的设置(在想要转行的地方,先输入空格,再输入下划线,回车) 'D 代码运行和调试 '逐句运行(调试-逐语句/F8) '设置断点(点击左边边栏,设置断点) 'E 对象列表框和过程列表框 ’4、立即窗口 (各种窗口在视图中寻找)
'立即窗口可以把运行过程中的值立即显示出来,主要用于程序的调试 (Debug.Print方法,把结果显示到立即窗口中)
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’5、本地窗口
在本地窗口中可以显示运行中断时对象信息、变量值、数组信息等。
Sub d1() Dim x As Integer, k As Integer For x = 1 To 10 k = k + Cells(x, 1) Next x End Sub一、END语句 作用:强制退出所有正在运行的程序。
二、Exit语句
'退出指定的语句
'1、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 '2、Exit function Function ff() Dim x As Integer For x = 1 To 100 If x = 5 Then Exit Function //退出整个function End If Next x ff = 100 End Function3、Exit for
Sub e2() Dim x As Integer For x = 1 To 100 Cells(1, 1) = x If x = 5 Then Exit For //退出整个for循环 End If Range("b1") = 100 End Sub Next x'4、Exit do
Sub e3() Dim x As Integer Do x = x + 1 Cells(1, 1) = x If x = 5 Then Exit Do //退出do循环 End If Loop Until x = 100 Range("b1") = 100 End Sub二.分支语句(按照需要跳转到指定位置)
1.Goto语句:无条件跳转到指定的地方
Sub t1() Dim x As Integer Dim sr 100: //设置行号 sr = Application.InputBox("请输入数字", "输入提示") //读取用户输入 If Len(sr) = 0 Or Len(sr) = 5 Then GoTo 100 //如果没有输入或者点击取消(false),则启动跳转设置 End Sub2.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 //当x运行完1-10时,不需要再运行100后面的语句,直接退出程序。 100: Cells(x, 1) = "偶数" Return '跳到gosub 100 这一句 End Subon 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 Subon 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 Subon 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一.excel文件和工作簿
excel文件就是excel工作簿,excel文件打开需要excel程的支持;
Workbooks 工作簿集合,泛指excel文件或工作簿;
Workbooks(“A.xls”),名称为A的excel工作簿;
Sub t1() Workbooks("A.xls").Sheets(1).Range("a1") = 100 //某个工作簿的某个工作表的某个单元格=100 End Subworkbooks(2),按打开顺序,第二个打开的工作簿;
Sub t2() Workbooks(2).Sheets(2).Range("a1") = 200 End SubActiveWorkbook ,当打开多个excel工作簿时,你正在操作的那个就是ActiveWorkbook(活动工作簿); Thisworkbook,VBA程序所在的工作簿,无论你打开多少个工作簿,无论当前是哪个工作簿是活动的,thisworkbook就是指它所在的工作簿; (区别:一个是正在操作的工作簿,一个是代码所在的工作簿)
工作簿窗口
Windows(“A.xls”),A工作簿的窗口,使用windows可以设置工作簿窗口的状态,如是否隐藏等;
Sub t3() Windows("A.xls").Visible = False //工作簿界面隐藏(使用名称) End Sub Sub t4() Windows(2).Visible = True //第几个打开的工作簿窗口 End Sub二.操作技巧 ’1 判断A.Xls文件是否存在
Sub W1() If Len(Dir("d:/A.xls")) = 0 Then //判断是否存在 MsgBox "A文件不存在" Else MsgBox "A文件存在" End If End Sub’2 判断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’3 excel文件新建和保存
Sub W3() Dim wb As Workbook //声明一个工作簿类型变量(盒子中只能放工作簿) Set wb = Workbooks.Add //使用set给对象变量赋值,使用add方法 wb.Sheets("sheet1").Range("a1") = "abcd" //单元格赋值 wb.SaveAs "D:/B.xls" //工作簿保存 End Sub’4 excel文件打开和关闭
Sub w4() Dim wb As Workbook //声明对象变量 Set wb = Workbooks.Open("D:/B.xls") ///打开文件,放入wb变量 MsgBox wb.Sheets("sheet1").Range("a1").Value wb.Close False //不保存并关闭文件 End Sub’5 excel文件保存和备份
Sub w5() Dim wb As Workbook //声明 Set wb = ThisWorkbook //赋值 wb.Save //保存 wb.SaveCopyAs "D:/ABC.xls" //备份 End Sub’6 excel文件复制和删除
Sub W6() FileCopy "D:/ABC.XLS", "E:/ABCd.XLS" //被复制的文件-存放的文件和路径 Kill "D:/ABC.XLS" //删除文件 End Sub1.excel工作表的分类 excel工作表有两大类,一类是我们平常用的工作表(worksheet)-,另一类是图表、宏表等。这两类的统称是sheets; (sheets 工作表集合,泛指excel各种工作表)* Sheets(“A”):是指名称为A的excel工作表
Sub t1() Sheets("A").Range("a1") = 100 End Subworkbooks(2),按打开顺序,第二个打开的工作簿。(按照从左到右的先后顺序,包含隐藏的工作表)
Sub t2() Sheets(2).Range("a1") = 200 End SubActiveSheet ,当打开多个excel工作簿时,你正在操作的那个就是ActiveSheet
2.操作技巧
’1 判断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’2 excel工作表的插入
Sub s2() Dim sh As Worksheet Set sh = Sheets.Add //添加 sh.Name = "模板" sh.Range("a1") = 100 End Sub’3 excel工作表隐藏和取消隐藏
Sub s3() Sheets(2).Visible = True //可见 End Sub’4 excel工作表的移动
Sub s4() Sheets("Sheet2").Move before:=Sheets("sheet1") //sheet2移动到sheet1前面 Sheets("Sheet1").Move after:=Sheets(Sheets.Count) //sheet1移动到所有工作表的最后面 End Sub’6 excel工作表的复制
Sub s5() '在本工作簿中 Dim sh As Worksheet Sheets("模板").Copy before:=Sheets(1) Set sh = ActiveSheet sh.Name = "1日" sh.Range("a1") = "测试" End Sub 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’7 保护工作表
Sub s7() Sheets("sheet2").Protect "123" End Sub Sub s8() '判断工作表是否添加了保护密码 If Sheets("sheet2").ProtectContents = True Then MsgBox "工作簿保护了" Else MsgBox "工作簿没有添加保护" End If End Sub’8 工作表删除
Sub s9() Application.DisplayAlerts = False Sheets("模板").Delete Application.DisplayAlerts = True End Sub’9 工作表的选取
Sub s10() Sheets("sheet2").Select End Sub’1 表示一个单元格(a1)
Range(“a1”).Select; Cells(1, 1).Select; Range(“A” & 1).Select; Cells(1, “A”).Select; Cells(1).Select; [a1].Select;
’2 表示相邻单元格区域(a1:c5这个区域)
Range(“a1:c5”).Select Range(“A1”, “C5”).Select Range(Cells(1, 1), Cells(5, 3)).Select Range(“a1:a10”).Offset(0, 1).Select //offset(上下偏移量,左右偏移量) Range(“a1”).Resize(5, 3).Select //a1为顶点,Resize(行数, 列数)
’3 表示不相邻的单元格区域
Range(“a1,c1:f4,a7”).Select //注意:只用一对双引号; Union(Range(“a1”), Range(“c1:f4”), Range(“a7”)).Select;//连接多个单元格对象,作为一个整体表示 (union示例)
Sub dd() Dim rg As Range, x As Integer For x = 2 To 10 Step 2 If x = 2 Then Set rg = Cells(x, 1) //先给rg进行初始化 Set rg = Union(rg, Cells(x, 1)) //在旧的单元格容器中,通过循环,不断增加新的单元格 Next x rg.Select //选取连接起来的所有单元格 End Sub4 表示行
Rows(1).Select //第一行 Rows(“3:7”).Select //第三行到第七行 Range(“1:2,4:5”).Select //选取不连续的行 Range(“c4:f5”).EntireRow.Select //EntireRow用于返回单元格区域所在的行
’5 表示列
Columns(1).Select Columns(“A:B”).Select Range(“A:B,D:E”).Select Range(“c4:f5”).EntireColumn.Select //选取c4:f5所在的行
’6 重置坐标下的单元格表示方法
Sub cc() Range("b2").Range("a1") = 100 //以B2作为新的坐标,将新坐标的A1单元格赋值100 End Sub’7 表示正在选取的单元格区域
Sub d2() Selection.Value = 100 End Sub’1 已使用的单元格区域
Sub d1() Sheets("sheet2").UsedRange.Select //选取已经使用过的区域 wb.Sheets(1).Range("a1:a10").Copy Range("i1") //将内容复制到以i1为顶点的单元格区域 End Sub’2 某单元格所在的连续单元格区域(无论有边还是顶点重叠,都是连续区域)
Sub d2() Range("b8").CurrentRegion.Select //选择以B8为顶点的连续区域 End Sub’3 两个单元格区域共同的区域(选取区域的交集)
Sub d3() Intersect(Columns("b:c"), Rows("3:5")).Select End Sub’4 调用定位条件选取特殊单元格(含空格、含注释、含常量、含公示)
Sub d4() Range("A1:A6").SpecialCells(xlCellTypeBlanks).Select //选取区域内的空单元格 End Sub’5 端点单元格
Sub d5() Range("a65536").End(xlUp).Offset(1, 0) = 1000 //从最后一个单元格向上找最近的一个非空空单元格,并向下偏倚一行 End Sub Sub d6() Range(Range("b6"), Range("b6").End(xlToRight)).Select //从左向右选 End Sub例:查找客户首次还款月份
Sub test() Dim x As Integer //声明 For x = 2 To 6 //选择范围,遍历 If Cells(x, 2) > 0 Then Cells(x, "N") = "1月" Else Cells(x, "N") = Range("b" & x).End(xlToRight).Column - 1 & "月" //从B列向右找,得到非空单元格所在列数,根据数量关系求得相应月份 End If Next x End Sub