本着全面提升自己的原则,我们往数据分析师上再进一步——了解学习VBA。照例先找一本书自学,了解基本知识后,在考虑练习应用、积累和提高。我选择的是《别怕》系列丛书。从网上找到学习的好经验:“题目不用在网上找,对照书本案例练习也不是最优办法。我个人实验最佳办法是:工作中需要重复进行的项目试着实现自动化。从最简单的开始,从录制宏修改宏开始。比方某常用的报表需要标题涂成固定颜色,固定字体。录制宏试试看,对照宏再对照你手里拥有的书相关知识把宏修改到可以重复使用的地步。然后逐步深入复杂的需要重复的工作进行自动化,然后会渐入佳境。”
一鼓作气,提高自己
VBA的语言(Visual Basic for Applications),实际上VBA是寄生于VB应用程序的版本,结构非常类似。所以,大家大学时期如果计算机二级学的是VB的,就特别轻松了,当然C语言本身也和VB是思路想通的,所以不必害怕。我用间断时间,首先阅读了前两章,初步了解了基本的语句结构,和一点注意点,稍作总结和分享!后面将持续跟进。
使用excel2010的话,打开VBA的方法:开发工具-代码-Visual Basic,即可打开Visual Basic editor,选择宏-编辑或创建也可以,其实宏是属于一种公共的过程,是自己手动录制的、用VBA代码保存的程序,是最简单的VBA程序,优点是方便用户使用,即使不懂VBA也能很容易完成初步的功能、取代重复操作,缺点是不能互动、不够智能和灵活(比如,不能循环和判断)。但正是有了宏,也为我们学习VBA开了挂——实在学不出来想要的代码,可以去试试录制宏,在此基础上改改看?哈哈。另外,开发工具-代码-查看代码,也可以很方便的打开编辑窗口。值得注意的是,我们过程一般保持在模块中,虽然工作表里也可以保存代码。
一、基础了解
1、定义数据类型,可用:dim 变量名 as 变量类型,也可以一次声明多个,用逗号隔开:dim a as string, b as integer;
2、常见对象的引用:例如:application.workbooks("book1").worksheets("sheet2").range("A1")
workbooks("book1") ---工作簿
worksheets("sheet2") ---工作表
range("A1"),或cells(2,"H") ---单元格
表示方式:事实上,加了s后,这些对象也叫作集合,集合也是对象。
3、VBA的调试:将鼠标光标定位在程序的中间,然后可以按F8,能逐词观察程序的执行流程。
4、立即窗口,立即窗口是调试的好工具,有两个功能:(1)执行单句的代码;(2)显示调试代码时产生的结果。 执行方式:输入完后,按回车键,就会弹出一个执行结果。例如在立即窗口中输入:
a="你叫什么名字"
b="我叫张三"
print a b ---这里,print 可以用问号?代替,效果相同
得到:你叫什么名字我叫张三
5、VBA的调试:将鼠标光标定位在程序的任意句子中间,然后可以按F8,能逐词观察程序的执行流程。
二、VBA的基本语句结构:
首先,要了解的最常用语句:条件判断语句if ... then ... elseif ... then ... else... end if语句,循环语句:for ... next 语句,do while ... loop 语句 ----解决循环变量终值不确定的问题,do until ... loop 语句 ---Do while Cells(row, "B") <> "",可以用Do Until Cells(row, "B") = ""代替,for each ... next 语句 ---不用定义循环条件,所以在数组或者集合里循环,更灵活,with语句,goto语句。
举例:
① 如果写成一行:if ... then ... else ...,没有end if,例如:
If Time < 0.5 Then MsgBox "现在是上午" Else MsgBox "现在是下午"
如果写成块状的话:
If Time() < 0.2 Then
MsgBox "凌晨好"
ElseIf Time() < 0.5 Then
MsgBox "上午好"
Else
MsgBox "下午好"
End If ----注意:每个if必须有个 end if
② 在 Select Case 语句中,Is不是运算符,而是关键字!
使用 Is 关键字时,则可以配合比较运算符(除 Is 和 Like 之外)来指定一个数值范围。例如:
Select Case Time
Case Is < 0.2
MsgBox "凌晨好"
Case Is < 0.5
MsgBox "上午好"
Case Else
MsgBox "下午好"
End Select
最后,一点心得
三,几个注意点:
① Range、Cells都可以表达单元格/区域,但二者也有很明显的区别:
Range 中文意思是“区域”,Cells 中文意思是“单元(格)”, Range通常用于区域 ,如Range("A1:B2")。一个单元格是一个特殊区域。
比如说,我们想表示A2:D3这个区域,用Cells()不能实现,那么,用Range()就可以。
因此,单独用Cells()只能表示某个单元格,而不能表示一个区域。
显然,Range是可以兼容Cells的表达方式,但Range更倾向于区域有“固定”因素时使用,当代码里要使用行、列参数都是变量的单元格时,直接用Range来表达的话,就显得不合适了,而Cells()在这时候,就是最好的选择。
另外,VBA中常这样写:Range(cells(y1,x1),cells(y2,x2)).Select,就是指选中以cells(y1,x1)和cells(y2,x2)两单元格为对角线的一个区域。
range("B1"),range("A1:A10")=100 --在单元格A1:A10中输入数值100
cells(1,"H") ---前面是行,后面是列
这三句代码是等效的,选中活动工作表的A1:E10单元格:
· range(cells(1,1),cells(10,5)).select
· range("A1","E10").select
· range(range("A1"),range("E10")).select
② with语句,用with来替代一些重复出现的字段,提高程序运行性能,也增加代码的易读性和清晰性。例如,设置单元格A1中字体的部分属性:
sub fontset()
with worksheets("VBA").range("A1").font
.name ="楷书"
.size = 16
.bold = ture
end with
end sub
③ 排版技巧:
1、tab键:缩进
shift tab键:取消一次缩进
注意,tab宽度默认为四个空格。可以在:工具-选项-编辑器中修改,我改成了2个空格。
2、长句子中,一句话没说完,可以加上:空格 _,然后换行继续写即可。空格不可省!
3、注释:以英文单引号开头,可以在行的后面,也可以单独一行。
④ 遇到问题,可以先录制宏,然后在现成代码的基础上,学习实现自己个性化需求的代码。
,