VBA-JC第9节|工作簿、单元格以及Application对象
最近更新:'2019-05-16'
1. Workbook和Workbooks对象
1.1Workbooks.open(文件路径)
打开指定路径的Exce文件,并返回一个 Workbook对象。
Sub 打开工作簿示例()
'定义一个指向 workbook类对象的变量wb
Dim wb As Workbook
'打开C盘的4月.xlsx文件
Set wb = Workbooks.Open("C:\Users\Administrator\Desktop\19\4月.xlsx")
'在该工作簿的第一张工作表的A1单元格写入"HELLO"
wb.Worksheets(1).Cells(1, 1) = "HELLO"
End Sub
代码显示的最终结果如下截图:
1.3Workbook.SaveAs“路径及文件名”(保存指定路径和名称的excel文件)
将该 Workbook对象代表的工作表的工作簿保存为指定路径和名称的Excel文件。
注意事项:
特别注意:Workbook.SaveAs,在不需要将返回值赋值给变量时,该过程或函数不能写括号!
1.4Workbooks.Close(关闭excel文件)
关闭这个 Workbook对象所代表的excel文件
1.5知识点汇总案例(打开,关闭)
Option Explicit
Sub 季度汇总()
Dim wAll As Worksheet, wPer As Worksheet, filename, wb As Workbook
Dim i, k
Set wAll = Worksheets("季度汇总")
'循环生成每个月份的文件名,然后打开这些文件
For i = 4 To 6
filename = i & "月.xlsx"
Set wb = Workbooks.Open("C:\Users\Administrator\Desktop\19\" & filename)
Set wPer = wb.Worksheets(1)
'循环扫描该月报表的第3-10行,依次添加到汇总表的同一行
For k = 3 To 10
'以下四行代码可以用循环的方式改下,更加方便
wAll.Cells(k, 3) = wAll.Cells(k, 3) + wPer.Cells(k, 3)
wAll.Cells(k, 4) = wAll.Cells(k, 4) + wPer.Cells(k, 4)
wAll.Cells(k, 5) = wAll.Cells(k, 5) + wPer.Cells(k, 5)
wAll.Cells(k, 6) = wAll.Cells(k, 6) + wPer.Cells(k, 6)
Next k
wb.Close
Next i
End Sub
代码及其相关的解析如下:
'ActiveWorkbook.Path属性可以返回本工作簿所在的文件夹,
'因此当其他待处理工作簿跟本工作簿在同一文件夹下时,可以用Path找到它们。
wkPath = ActiveWorkbook.path
'循环生成每个月的文件名,并打开相应工作簿
For i = 4 To 6
filename = i & "月.xlsx"
Set wb = Workbooks.Open(wkPath & "\" & filename)
'让 w 指向该月文件的第一张工作表(即月报表)
Set w = wb.Worksheets(1)
'循环扫描该工作表的第3-10行,依次加到汇总表的同一行
For k = 3 To 10
'以下四行代码可以用循环的方式改写,更加方便
r.Cells(k, 3) = r.Cells(k, 3) + w.Cells(k, 3)
r.Cells(k, 4) = r.Cells(k, 4) + w.Cells(k, 4)
r.Cells(k, 5) = r.Cells(k, 5) + w.Cells(k, 5)
r.Cells(k, 6) = r.Cells(k, 6) + w.Cells(k, 6)
Next k
'关闭该月的工作簿文件,保持桌面清洁
wb.Close
Next i
'新建一个工作簿文件,并让 wb 指向该工作簿
Set wb = Workbooks.Add
'将季报汇总的工作表复制到新的工作簿中第一张工作表之前
r.Copy before:=wb.Worksheets(1)
'将新工作簿即 wb 命名保持,然后关闭。
'在大多数版本的Excel中,不指定文件夹时,文件默认保存到当前目录下。
wb.SaveAs wkPath & "\季度报表.xlsx"
wb.Close
End Sub
注意事项如下:
部分技巧没有介绍,但很容易理解,包括:用ActiveWorkbook.Path打开同一文件夹下的文件;将工作表复制到新建的工作簿中并保持等。执行代码后,可以在同一文件夹下发现新建的“季报汇总.xlsx”结果文件。
2. Range对象
2.1Range属性
cells(行,列)是一种找到单元格对象的方法,而不是单元格对象本身。
2.4Range.Interior属性:
单元格的内部特点,比如颜色( Range.Interior.Color)、填充模式( Range.Interior.Pattern)等等。
Sub rangeTest()
Dim r As Range
Set r = Range("a3:b7,d6,a2:f4")
r.Value = 5
r.Font.Size = 15
r.Font.Color = RGB(255, 0, 0)
r.Font.Bold = True
r.Font.Italic = True
r.Interior.Color = RGB(255, 255, 0)
End Sub
代码显示的最终结果如下截图:
取消本 Range中的单元格合并,将其全部拆分。
3. Application对象
单元格归工作表所有,工作表归工作簿所有,工作簿归excel这个程序进行管理.而application就是代表excel这个程序对象.
3.1 Aplication.Cells属性
当前正处于激活状态的工作表(即“活动工作表”)的单元格。
application.cells(3,5)=7可以写成cells(3,5)=7,因为cells归application管理,代表的是当前excel表排在最前面,处于激活状态的工作表.cells归application管理,因此可以忽略application.
application.cells(3,5)可以写成application.activesheet.cells(3,5)
application相关的激活状态(最前面,处于编辑修改状态),具体可以参见如下截图:
application.activeworkbook代表的是处于激活状态的工作簿
application.activesheet代表的是处于激活状态的工作表
application.activesheet.cells代表的是处于激活状态的单元格
Set w2 = Workbooks.Add
w2.Worksheets(1).Cells(2, 2) = "新文件!"
w1.Worksheets(1).Cells(3, 5) = 7
End Sub
代码及其结果如下:
3.3 Aplication.WorksheetFunction
在VBA代码中直接调用Exce表格公式
有一些Exce公式没有被包在Aplication.WorksheetFunction属性中,因为VBA已经提供了类似的系统函数.比如cos等等.
Sub 最高销量()
Dim r As Range, m
Set r = Range("B2:D7")
m = Application.WorksheetFunction.Max(r)
Cells(9, 4) = m
End Sub
代码显示的最终结果如下截图: