第一章 VBA是什么
Visual Basic Application
一个Excel文件就是一个工作簿(Workbook),一个Excel应用程序可以打开多个Excel文件,这些工作簿文件统称为工作簿集合(Workbooks),可以用Workbooks("xxx.xlsx")来表示某个工作簿。一个工作簿文件可以有多个工作表(Worksheet),同一个工作簿的所有工作表统称为工作表集合(Worksheets),可以用Workbooks("xxx.xlsx").Worksheets("Sheet1")来表示工作簿(xxx.xlsx)中的名称为Sheet1的工作表。ThisWorkbook表示当前工作簿。
类似的,某个工作表中的所有单元格集合用Cells来表示。Workbooks("xxx.xlsx").Worksheets("Sheet1").Cells(1,1)表示(A1)单元格。
某个单元格区域用Range来表示。Workbooks("xxx.xlsx").Worksheets("Sheet1").range("A1")或Workbooks("xxx.xlsx").Worksheets("Sheet1").range("A1:D100")表示相应的单元格区域。
第二章 第一个VBA程序
调出“开发工具”选项卡: Alt+T、O =>“自定义功能区”的“主选项卡”下方勾选“开发工具”选项=>“确定”
打开VB编辑器(Visual Basic 编辑器):在“开发工具”选项卡中或Alt+F11
代码可以写在多个地方(可以用相对路径来简化对象指代),一般是写在模块中。
运行代码:将光标置于所要执行的过程中,点击运行按钮或F5
含有VBA代码的文件要以.xlsm为后缀名来保存。
在未设置的Excel中打开.xlsm中会有警告信息弹出,可以在Excel选项中添加“受信任位置”(某个文件夹路径)来设置以后打开该类文件不再提示警告信息。
第三章 VBA中的等号
这一章就4页。。。太汗了吧
就说了VBA中等号“=”就两层含义:1、赋值;2、比较。
文中还说了VBA复制的let可省略, Let a=1 可以写作 a=1,还有,每行代码前加一个以英文冒号结束的标签,该标签并不影响代码的运行。如,L01: Let a = 1
第四章 VBA编程再探索
这一章也很短,还把一段代码重复多次,并用单元格名称的方式把变量有啰嗦了一遍,唉,这样太温柔了吧,拜托,咱能简单粗暴点不。。。
第五章 正式开始VBA编程之旅
就是讲到一个循环语句: For ... to ... Next
For r = 1 to 50000 Step 1 ‘Step省略时,步长为1
...
Next
这里在讲解循环时用到了单步执行(F8),这是调试的一种方法。
讲到一点是新建的工作簿文件未保存前是没有后缀名的,可是保存后有后缀名的,要注意代码中相应的调整,避免出现指代错误。
讲到了“录制宏”功能,可以通过录制宏来看看相应操作对应的VBA代码,从而减轻我们记忆负担。罗刚君也强调,我们录制宏并不是为了得到宏,而是为了得到相应的VBA对象和属性。
讲到一个结构: With ... End With
With Selection.Interior
.Color = 255
End With
下面三段代码做的事情一样,只是形式上越来越简化
Range("A1:A10").Select
With Selection.Interior
.Color = 255
End With
With ... End With的作用是省去每次写对象名
Range("A1:A10").Select
Selection.Interior.Color = 255
Select返回一个Selection对象
Range("A1:A10").Interior.Color = 255
Cells(3, 4) 和 Range("D3")效果是一样的,但是有各有特长。
Range("A1:D10") Range("A1", "D10") Range(Cells(1,1), Cells(10,4)) Range("A1").Resize(10, 4)
CurrentRegion指的是当前区域由周围空行或空列围成的最小区域。
第六章 VBA是一种语言
条件结构
If 条件 Then
条件为真时执行的语句
End If 条件为假时则什么都不执行
稍微复杂一点的条件结构
If 条件 Then
条件为真时执行的语句
Else
条件为假时执行的语句
End If
Cells.Clear 可以清除单元格的内容及格式
更复杂一些的条件结构
If 条件1 Then
条件1为真时执行的语句
ElseIf 条件2
条件2为假时执行的语句
...
Else
以上条件都为假时执行的语句
End If
分支语句,从上面的多条件结构已经可以延伸出分支语句了。
Select Case 表达式或变量
Case 值1
为值1时执行的语句
Case 值2
为值2时执行的语句
...
Case Else
不为以上所有值时执行的语句
End Select
循环结构,之前已经有了For ... to ... Next,下面还有For Each
For Each mysht In ThisWorkbook.Worksheets
mysht.Cells(1, 1).Value = "a111bc" 'Value可以省略
Next
此外,还有Do Until循环
Do Until 退出循环条件
循环语句
Loop
UsedRange对象(数据占用区域),.Rows.Count .Columns.Count有其独特的用法。
Exit For Exit Loop 可以用在跳出相应的循环体(这显然不是一个好主意,最好还是别用)。
第七章 Excel就是小怪兽
这一章又是重复,并且通过“小怪兽”的例子来把抽象的计算机概念具体化、形象化。怎么说呢,面向初学者吧,减缓学习曲线的陡峭程度,重复呢,是加深印象,便于记忆吧。
第八章 对象! 对象!!
其实对象在计算机语言中,就是一个实体,它有着自己的属性、方法,并且能够响应特定的事件。
介绍了Worksheet、Workbook的内置的事件。
有个小技巧,按住Shift键打开文件可以忽略自动执行的宏。
这一章内容不少,尤其是8.7小节的案例,我觉得可以独立开一章了,值得细细体会。
第九章 VBA变量类型
Sub myVar141()
Dim dMyNum As Long
Dim sMyString As String
sMyString = "1112"
MsgBox sMyString
dMyNum = sMyString
MsgBox dMyNum
End Sub
Sub Example_08_146()
Dim mySheet As Worksheet
Set mySheet = ThisWorkbook.Worksheets("Sheet1")
For r = 1 To 10
mySheet.Cells(r, 1).Value = r
mySheet.Cells(r, 1).Interior.Color = vbRed
mySheet.Cells(r, 1).Font.Color = vbWhite
Next
End Sub
Sub my100num148()
Dim myNum(99)
For i = 1 To 100
myNum(i - 1) = i
ThisWorkbook.Worksheets(1).Cells(i, 1).Value = myNum(i - 1)
Next
End Sub
Sub arrayDemo151()
Dim a(2) As String
a(0) = "one"
a(1) = "two"
a(2) = "three"
ThisWorkbook.Worksheets("Sheet1").Range("A1:E5") = a()
MsgBox UBound(a(), 1)
End Sub
Sub array2DDemo152()
Dim b(2, 3) '3行4列的数组 数组从0开始计数,UBound返回最大序数,个数=最大序数+1
For i = 1 To 3
For j = 1 To 4
b(i - 1, j - 1) = 10 * i + j
Next
Next
ThisWorkbook.Worksheets("Sheet1").Range("A1:E5") = b()
MsgBox b(1, 1) ' 22
MsgBox UBound(b(), 1) ' 2
MsgBox UBound(b(), 2) ' 3
End Sub
Sub arrayUBoundDemo153()
Dim b(2, 3)
MsgBox UBound(b(), 1)
MsgBox UBound(b(), 2)
End Sub
Sub arrayDemo155()
Dim a()
Dim mySheet As Worksheet
Set mySheet = ThisWorkbook.Worksheets("Sheet1")
a() = mySheet.Range("A1:D3") '.value可以省略 '3行4列的数组,这种从表格中转换过来的数组从1开始计数,UBound返回最大序数,个数=最大序数
MsgBox a(1, 1) ' 11
MsgBox UBound(a(), 1) ' 3
MsgBox UBound(a(), 2) ' 4
mySheet.Range("H8").Resize(UBound(a(), 1), UBound(a(), 2)) = a()
End Sub
Sub cellsClear()
Cells.Clear
End Sub