【工作簿集合Workbooks】
- 工作簿集合Workbooks:由当前所有在内存里打开的工作簿Workbook对象组成。
- 如当前一共打开了两个工作簿,这两个工作簿就组成了Workbooks集合。可以在视图--切换窗口里看到。
【工作簿的引用方法】
- 1.使用索引:第一个打开的工作簿是1号,第二个打开的工作簿是2号,按打开先后顺序(电脑自动)给予号码。不推荐这种方式引用工作簿,容易混乱。
Sub 引用工作簿()
Dim WBK As Workbook
Set WKB = Workbooks(1)'括号里写索引号
Debug.Print WKB.Name
End Sub
- 2.使用工作簿名称引用:
Sub 引用工作簿1()
Dim WBK As Workbook
Set WKB = Workbooks("毛泽东思想.xlsm")
Debug.Print WKB.Name
End Sub
【Sheets集合】:在Wokrbook对象里,Sheets集合的成员一般是Worksheet工作表对象和Chart图表对象。为兼容旧版的Excel,也可以是DialogSheets对象,Excel4MacroSheets对象等。见下图。
Paste_Image.png【引用工作表方法】
- 1.使用索引引用工作表:工作表的索引就是工作表从左到右的顺序。索引与工作表的位置有关系,位置变了其索引也变,和名称没有一毛钱的关系。如图,根据索引来提取工作表的名称。
Sub 工作表索引()
Dim i As Integer
For i = 1 To 5
Debug.Print Worksheets(i).Name '用索引表示工作表
Next
End Sub
Paste_Image.png
- 将工作表的位置调整一下,如下图
- 再执行上面的代码:工作表索引,结果如下图
- 如工作簿索引一样,一般也不推荐用工作表索引来表示工作表,容易混乱。
- 当工作簿中只有工作表没有图表工作表的时候,Worksheets(索引)和Sheets(索引)表示同一个工作表,而存在图表工作表时,Sheets(索引)可能会表示图表工作表。如下图中工作簿有这么些表......
-
Worksheets(2)和Sheets(2)并不表示同一个对象。
Paste_Image.png
- 2.使用名称引用工作表
Sub 工作表名称()
'[周星星]这个工作表的单元格A1值为"周星星",单元格A2值为"吴孟达"
Sheets("周星星").Range("a1") = "周星星"
Worksheets("周星星").Range("a2") = "吴孟达"
'和索引对比
Sheets(3).Range("b1") = "周星星"
Worksheets(2).Range("b2") = "吴孟达"
End Sub
- 以上四种方法都引用‘周星星’工作表,并对其中的单元格赋值。
- 3.使用工作表的CodeName引用工作表
图中红色框内的就是工作表的CodeName,这个CodeName是固定不变的,建立工作表的时候,电脑就分配了的,不能修改。改变工作表的名称,CodeName也不会变。如下图
Paste_Image.png- 下面代码都是引用当前工作簿中同一个工作表--‘周星星’
Sub 工作表()
'工作表名称引用
Sheets("周星星").Range("a1") = "周星星"
Worksheets("周星星").Range("a2") = "吴孟达"
'工作表索引引用
Sheets(3).Range("b1") = "周星星"
Worksheets(2).Range("b2") = "吴孟达"
'CodeName引用
Sheet1.Range("c1") = "周星星"
Sheet1.Range("c2") = "吴孟达"
End Sub
CDDENAME
总结:推荐使用CodeName和名称来引用工作表.
【引用单元格】单元格VBA一般用Range或Cells来引用。
- 完整的写法应该是:工作簿.工作表.单元格
- 如下面语句是让[当前活动工作表]中的单元格A1的值为‘周星星’,它并没有具体指定是那一个工作表。当前正在使用的工作表是[周星星],运行代码,则工作表[周星星]的单元格A1为‘周星星’;切换到工作表[吴孟达],运行代码,则工作表[吴孟达]的单元格A1为‘周星星’......
Range("a1") = "周星星"
- 因此有必要指定工作表
Sheets("周星星").Range("a1") = "周星星"
- 假如当前打开了2个或2个以上的工作簿,每个工作簿都有名称为[周星星]的工作表,那么运行上面的代码(同上),编辑的是当前正在使用的工作簿中工作表[周星星]单元格A1,因此有必要指定工作簿。
Workbooks("马克思主义.xlsm").Sheets("周星星").Range("a1") = "周星星"
Workbooks("邓小平理论.xlsm").Sheets("周星星").Range("a1") = "周星星"
- 是否需要完整的写法,可视乎实际情况而定。在写代码时候,忘记指定工作簿工作表这个问题上镜的机率很高,要注意。
- 单元格的Range属性和Cells属性
- 下面代码功能是:代替鼠标选中单元格A1
Range("a1").Select
Cells(1, 1).Select
- Range直接引用的是平常常使用的单元格名称(字母不区分大小写,注意不要漏双引号),Cells是通过 (行、列)的坐标定位来确定单元格(位置),A1单元格的坐标是第1行第1列,C10单元格的坐标是第10行第3列.
- Cells(行,列),其中行,列一般是用数字来表示;当然,列也可以用字母(不区分大小写,带双引号)来表示。下面代码都是选中单元格C10.
Cells(10, 3).Select
Cells(10, "C").Select
- 表示单元格区域
'单元格A1:D10
Range("a1:d10").Select '方法1
Range("a1", "d10").Select '方法2
- 再来看下面的代码,将上面代码方法2的"a1", "d10"单元格分别用Cells表示。Cells(1, 1)为单元格A1,Cells(10, 4)为单元格D10。如下
Range(Cells(1, 1), Cells(10, 4)).Select '同样表示单元格A1:D10
- 不连续的单元格选择,运行代码如下图1.1
Range("a1:a3, d6:e8, j2").Select
1.1
- 非活动工作表中的单元格引用:上面的代码都没有指定单元格属于具体的工作表,在活动的工作簿中,我们只需要指定具体的工作表就能引用单元格,而不需要去激活工作表。如下面代码,不需要激活[周星星]工作表就可以通过代码使其单元格A1的值为‘周星星’。
Sheets("周星星").Range("a1")="周星星"
- 常犯的错误
- 1.假设要对Sheet1工作表的A1:A10求和,调用Sum函数
Sub 求和()
MsgBox Application.WorksheetFunction.Sum(Range("a1:a10"))
End Sub
- 2.当我们正在操作工作表Sheet1时,此代码没有问题;一旦切换到工作表Sheet2,再运行代码,则会得不到想要的结果。
'指定工作表Sheets("sheet1"),再运行代码,结果就对了。
MsgBox Application.WorksheetFunction.Sum(Sheets("sheet1").Range("a1:a10"))
hhh.gif
- 题目:将下表中科目分数大于等于90的改为优秀。上次我们用For each Next写的,这次改动一下。
姓名 | 语文 | 数学 | 英语 | 化学 | 物理 | 生物 |
---|---|---|---|---|---|---|
A | 90 | 63 | 73 | 49 | 98 | 58 |
B | 56 | 84 | 51 | 61 | 48 | 72 |
C | 43 | 42 | 98 | 96 | 82 | 70 |
D | 86 | 84 | 49 | 74 | 66 | 96 |
E | 44 | 86 | 72 | 62 | 100 | 94 |
Sub 优秀()
Dim x As Integer, y As Integer
For x = 2 To 6 '遍历行,确定Cells的行坐标
For y = 2 To 7 '遍历列,确定Cells的列坐标
If Cells(x, y).Value >= 90 Then '如果单元格的值大于等于90
Cells(x, y).Value = "优秀" '则值改为优秀
End If
Next y
Next x
End Sub
- 上面代码用了两个For....Next,一个For循环嵌套在另一个For循环里面,这叫循环嵌套。这个代码的运行路线是:从B2单元格开始,C2,D2,E2...G2,遍历完第2行,然后开始从B3开始遍历第三行,完毕,从B4开始遍历第4行....直到结束。
- 这里单元格没有指定工作表,则将代码放到对应的工作表中。结果如图
- 将代码略有改动,用F8本地窗口,运行代码。红色标记遍历的路线。看下面GIF.
Sub 优秀()'辅助代码可以删除,不影响。
Dim x As Integer, y As Integer
For x = 2 To 6 '遍历行,确定Cells的行坐标
For y = 2 To 7 '遍历列,确定Cells的列坐标
X的值 = x 'x的值从2到6,辅助代码
y的值 = y 'y的值从2到7,辅助代码
Cells(x, y).Interior.ColorIndex = 3'辅助代码,背景颜色设为红色
If Cells(x, y).Value >= 90 Then '如果单元格的值大于等于90
Cells(x, y).Value = "优秀" '则值改为优秀
End If
Next y
Next x
End Sub
网友评论