VBA基础入门实例讲座 Excel VBA作为一种对面对Excel的编程语言,以其强大的功能和简单易 学的特点,受到越来越多的Excel用户的喜爱。俗话说万事开头难,VBA 也是头三脚难踢。可能很多人还没有接触过VBA程序的编写,所以如果 一开始就讲VBA的语法也许会让不少人望而却步或失去兴趣?所以本次 讲座就以工作中的实例来讲 本次讲座要点: 2 了解VBA的功能 2 宏的结构?工作表?单元格的表示和输入方法 2 学会让按钮执行宏 2 With语句的使用 2 变量的简单使用 2 学会使用End方法获取单元格顶点 2 单元格的查找?删除方法 2 Msgbox函数的简单使用 2 错误处理语句的使用 1 ? VBA有什么功能 VBA有什么功能呢,看下面的问题: 在一个含有众多工作表的工作簿里,经常需要取所有工作表的隐藏,而excel只能一次取消一个,而用VBA可以轻轻一点按钮,1秒钟完成这些任务。 也许你的表中数据量非常大,是不是出现过太多的公式而极大影响工作表的打开和编辑速度呢?VBA可以在瞬间完成指定的多个任务。 你的数组公式学的不是很好,也设计不出复杂的公式。这里你就可以用VBA来编写自定义函数。 也许你经常会遇到众多个工作表或工作簿需要合并和汇总,函数对于这些基本上是无能为力的,而VBA中的ADO可以轻松帮你解决。 也许工作中你想拥有自已更灵活的进销存软件或人事管理等工具,那么也可以用VBA来完成一个更适合自已的软件。 总结一下:VBA编写的程序,可以自动的、智能的完成你指定给他的多个任务,提高你的工作效率。 我们怎么来学这些节课 大家打开示例文件的“主界面工作表”,在课前预习的视频中我已讲过今天的任务是完成工作表中所示的“输入”、“查询”、“删除”、“修改”四个功能代码的编写。如果让大家现在就开始做,可能还是丈二和尚摸不着头脑,不知道从何入手,我们这节的方法是每个功能都要先满成更小的功能,然后再组合成这四个大的功能。如果还不明白,下面我们就开始一起做吧 注:可能有不少会员会对这个工作表中设置的界面很感兴趣,其实这些都是用单元格的边线和填充色完成的,以前在一段段前培训时也讲过如何制,感兴趣的可以到excel水平测试中心版块看一下相应的讲义。 3 ?编写在单元格D5输入自已名子的程序? 如果用手工来输入,每个人都能完成。但怎么样能用VBA来完成的呢?下面我们一步步来一起做吧。一定要亲自动手。 1、 在当前工作表标签上单击右键,然后再点击“查看代码”命令。然后会弹出一个窗口,这个窗口是什么呢?它是VBE编辑器,简单的说是编写VBA代码的工具,编写完成的代码也会存放在这个VBE编辑器中。使用VBA代码编写了小程序,我们在才能在工作表中完成输入自已姓名的功能。 注:打开VBE编辑器后,可能好多菜单和栏目都是我们所陌生的,不要紧,随着我们学习的深入,我们将来会对这个窗口非常的熟悉。 1、 我们打开了VBE编辑器,可我们该在哪里编写和存放代码呢?下面我们先给代码建一个“小家”。方法是在打开的VBA窗口中执行插入菜单/模块命令。然后我们看右上角有一个工程窗口,在工程窗口中就会看到一个刚建的模块:模块1。看下图: 模块插入后,在右边同时也打开了一个窗口。这是一块空白的区域,这里就是我们编写代码的地方。 1、 下面我们就开始用VBA编写在单元格D5中输入自己姓名的程序。可能没有接触过VBA的学员双是一头雾水:要实现的功能我知道,但怎么来编写啊。别急,我们先编写出来,然后再看是怎么编写的。在插入模块后,在打开的右边的代码窗口中输入以下代码: Sub shuru() Range("d5") = "雨中漫步" End Sub 下面是代码说明: A、我们要编写的完成输入程序是运行后自动完成一个输入过程,过程程序也叫宏程序,在VBA中它的结构是: Sub 程序名称() 完成相应功能需要的代码 End Sub 注:sub和程序名之间要空格分隔,程序名称后的括号内可以存放一些传递的参数,这里我们先不需要了解。宏程序有开始语句也要有结束语句End Sub B、在VBA中,表示单元格的方法主要有以下两种, 一种是: Range(“单元格或单元格区域地址”) 如表示单元格A5为:Range(“A5”) 一种是: Range(“单元格或单元格区域地址”) 如表示单元格A5为:Range(“A5”) C?向单元格中输入内容可以用: Range(“单元格”)=”单元格输入的内容” 如果清除单元格的内容,可以使用: Range("单元格") = "" 大家可以试着把刚才程序代码的range表示方法换成cells表示 这里有一点需要补充 Sub shuru() Range("D5") = "兰色幻想" End Sub 中的shuru是程序名 , 它是自已定义的, 不是EXCEL指定的 1、 代码编写完成后了,怎么运行它呢?方法有两种,一种是放在光标放在程序中位置,然后按F5,另一种也是把光标放在程序中,点击工具栏中的运行子过程小按钮。如下图。 大家把原来主界面D5的内容删除 , 然后运行一下程序 看看效果 运行程序后,结果是什么呢,我们在D5单元格中输入“兰色幻想”四个字。 如果要完成多个单元格的输入呢?方法是在程序中继续追加代码。 小练习:补充代码,执行后除了输入姓名外,在D7、D9、D11中输入自已的年龄、性别和工作年限。 Sub 练习() Range("d5") = "雨中漫步" Range("d7") = 35 '数值不要加引号,文本要加引号 Range("d9") = "男" Range("d11") = "10年" End Sub 单元格清除有很多方法 , 根据不同的情况使用不同的方法 Cells(5, 4).ClearContents 是清除内容 还是文字左,数字右 excel默认就是这样 , 文本靠左对齐, 数字靠右对齐 前面我们编写了代码,但每次都在打开VBE编辑器才能执行显示很麻烦,我们能不能让按钮来执行代码呢? 我们继续一起做: 第一步:插入一个按钮。方法:执行视图菜单/工具栏/窗体,可以打开窗体工具栏,然后用鼠标点击按钮形状的控件,左键不松拖到工作表中以拖画出一个按钮。 第二步:拖画出按钮后会弹出一个指定宏的对话框,在下面的列表中可以看到我们刚才编写的宏程序名称“shuru”,选取shuru后点击“确定”按钮完成。 大家把D5、D7、D9、D11的内容删除,然后单击按钮试下效果。 练习: 编写一段清空D5?D7?D9?D11内容的程序 注:添加新的代码可以新建模块,也可以在原来的模块里添加新的程序。 大家做完这段代码后休息10钟吧,10分种后亮一下自已编写的代码. 继续 , 大家安静, 等下会有讨论时间 5 ?向其他工作表的单元格输入数据? 前面我们学会在在当前工作表中的单元格中输入数据,下面我们学习如何把数据输入到其他工作表中。 下面我们需要完成一个任务:向“数据库”工作表中的A4单元格输入当前工作表D5的姓名。 具体步骤: 1、 新建或在刚才的代码后,再输入下面的程序: Sub sheetshuru() Sheets("数据库").Cells(4, 1) = Sheets("主界面").Range("D5") End Sub 如果程序是在主界面工作表中运行 , 可以写为 Sub sheetshuru() Sheets("数据库").Cells(4, 1) = Range("D5") End Sub 补充说明: 在同一个模块中 , 不能有两个相同的程序名称 下面是代码说明: A? 在VBA中表示具体工作表的方法是: Sheets(“工作表名称”) 也可以用sheets(序号)来表示工作表,如第3个工作表可以写为:sheets(3) 这里sheet后的s不能缺省,括号中的数字不能加引号 A? 表示指定工作表中某个单元格的方法是: Sheets(“工作表名称”).cells(行数,列数) 或 Sheets(“工作表名称”).Range(“单元格地址”) 工作表和单元格之间用点隔开 一个单元格的值等于另一个单元格值用=连接即可,等号后的单元格值会输入到等号前的单元格中。 小练习:在刚才的程序中补充,完成"数据库"工作表中的A4、B4、C4、D4单元格分别等于"主界面"工作表的D5、D7、D9、D11单元格值. 结果是: Sub sheetshuru() Sheets("数据库").Cells(4, 1) = Sheets("主界面").Range("D5") Sheets("数据库").Cells(4, 2) = Sheets("主界面").Range("D7") Sheets("数据库").Cells(4, 3) = Sheets("主界面").Range("D9") Sheets("数据库").Cells(4, 4) = Sheets("主界面").Range("D11") End Sub 从代码我们可以看出,每句代码都带有Sheets("数据库"),如果有很多行这样的代码,会造成过多的重复录入。我们是否可以只写一次,后面的工作表代码(Sheets("数据库"))可以省略呢? 答案是肯定的,我们可以用with语句。使用with后的代码更改为: Sub sheetshuru() With Sheets("数据库") .Cells(4, 1) = Sheets("主界面").Range("D5") .Cells(4, 2) = Sheets("主界面").Range("D7") .Cells(4, 3) = Sheets("主界面").Range("D9") .Cells(4, 4) = Sheets("主界面").Range("D11") End With End Sub with作用就是可以省略共同的 "主语" 如果程序执行时当前工作表名称是主界面工作表,则sheets("主界面")可以省略 6 ?返回最后一个非空单元格行数 以上我们通过编写代码,可以把主界面的信息输入到数据库工作表中第四行的1-4列,但实际上数据会不停的添加,输入的位置也会不断的下移,并不是固定的,所以我们在输入前需要确定数据库中输入的行数。 如何用VBA来定位呢?方法是 Range(“A65536”).End(xlup)就表示A列最下边一个非空单元格。 就是从A列最下边一个单元格,按 ctrl+向上箭头 End(xlup)=按 ctrl+向上箭头 Range("A65536").End(xlup)返回的是一个单元格,如何得到它的行数呢 Range(“A65536”).End(xlup).Row 单元格.Row 可以得到单元格所在的行数 而Range(“A65536”).End(xlup).row+1则是我们需要输入新记录的位置所在的行 有关end用法大家可以参考vba自带的帮助 输入的行数我们得到了。我们就可以完成第一个输入按钮的大部分任务,即不断的向数据库工作表添加新的人员信息。 Sub luru() With Sheets("数据库") .Cells(.Range("A65536").End(xlUp).Row + 1, 1) = Range("D5") .Cells(.Range("A65536").End(xlUp).Row + 1, 2) = Range("D7") .Cells(.Range("A65536").End(xlUp).Row + 1, 3) = Range("D9") .Cells(.Range("A65536").End(xlUp).Row + 1, 4) = Range("D11") End With End Sub 上面的代码中把以前的4替换成了可变的行数 解决这个问题的方法是,先把行数交给一个"东东"保存,这个"东东"就是VBA所说的变量 使用变量后的代码如下: Sub 录入() Dim myrow As Long With Sheets("数据库") myrow = .Range("A65536").End(xlUp).Row + 1 .Cells(myrow, 1) = Range("D5") .Cells(myrow, 2) = Range("D7") .Cells(myrow, 3) = Range("D9") .Cells(myrow, 4) = Range("D11") End With End Sub A、 在使用变量之前有时需要先声明一下它,即向程序隆重推出:我要在程序中使用变最了,它是***类型的。即:"Dim 变量名称 as 数据类型" B\ 数值类型有整数,有长整数(long)这里由于需要输入的行数在1-65536行。所以使用了long的数据类型 ,具体的变量数据类型请参考帮助或其他图书资料。 变量的作用就是临时存放数据 A、 myrow = .Range("A65536").End(xlUp).Row + 1,这句的意思就是把取得的输入行数放在变量myrow中,然后在后面myrow就代替了需要输入的行数。 就是因为输入了A列数据后 , 后来.Range("A65536").End(xlUp).Row的结就变化了 输入的主要功能完成了,下面的让大家来做,要求添加代码,在输入完成后把主界面的D5、D7、D9、D11单元格清空。 Sub luru() Dim myrow As Long With Sheets("数据库") myrow = .Range("A65536").End(xlUp).Row + 1 .Cells(myrow, 1) = Range("D5") .Cells(myrow, 2) = Range("D7") .Cells(myrow, 3) = Range("D9") .Cells(myrow, 4) = Range("D11") End With Range("D5") = "" Range("D7") = "" Range("D9") = "" Range("D11") = "" End Sub
教如何判断单元格的数值是整数? 答:int(a)=a 好 , 最后一小功能, 讲完今天的课结束 7 ?使用提示信息? 以上我们完成输入的功能,下面呢我还想实现一个要求,即在输入完成后弹出一个提示框,提示:输入成功。 要完成如上功能,需要使用msgbox函数,使用方法很简单,只须要在程序的结尾添加下面的一句: MsgBox "录入完成" 很简单啊 , 判断行数是否为1, 如果是1就不删除 Sub luru() Dim myrow As Long With Sheets("数据库") myrow = .Range("A65536").End(xlUp).Row + 1 .Cells(myrow, 1) = Range("D5") .Cells(myrow, 2) = Range("D7") .Cells(myrow, 3) = Range("D9") .Cells(myrow, 4) = Range("D11") End With Range("D5") = "" Range("D7") = "" Range("D9") = "" Range("D11") = "" MsgBox "录入成功" End Sub 后面还有三个按钮的功能 , 咱们明天或后天再讲, 大家可以在VBA帮助中先学习一下FIND方法的使用 |