最近更新:'2019-05-16'
- Workbook和Workbooks对象
- Range对象
- Application对象
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.文件路径用反斜杠“\”分隔,而非“/”
2.给对象赋值,必须用set
3.文件打开的其他方式,如下截图:
假设格式和名单顺序完全相同的表格.如何批量打开.
1.2Workbooks.add(新建一个excel文件)
新建一个Excel文件,并将其作为一个Workbook对象返回
案例:
新建一个excel文件,将E3单元格改为2016,并保存在c盘的测试.xlsx
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
代码及其相关的解析如下:
1.6知识点汇总案例(打开,关闭)
自动将某一文件下所有名字为“X月.xlsx”的文件进行汇总到本工作簿中,并将结果保存。
Sub 季度汇总()
Dim i, k, filename, wkPath
Dim w As Worksheet, r As Worksheet, wb As Workbook
'首先,让 r 代表当前工作簿(“季报.xlsm”)的汇总表
Set r = ActiveWorkbook.Worksheets("季度汇总")
'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(行,列)是一种找到单元格对象的方法,而不是单元格对象本身。
以前cells(3,5)是简写了,其实cells(3,5)是个range对象.
因此修改单元格的属性就应该修改range的相关属性.
range在excel可以代表一个单元格,也可以代表整张excel表格所有的单元格.是代表指定区域的单元格.
range("A3")与cells(3,1)代表的单元格是一样的.一般都是使用cells(3,1)这种表达方式.
用range表示单元格的范围,可以有如下几种方式:
2.2Range.Value属性
2.3Range.Font属性
可以使用Font的各种属性,控制该Range内所有单元格的字体
Range.Font.Italic:是否斜体?
Range.Font.Bold:是否粗体?
Range.Font Color:文字颜色
Range.Font.Size:文字大小
让r范围内的单元格都是粗体:
r.Font.Bold=YES让r范围内的单元格都不是粗体:
r.Font.Bold=NO
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
End Sub
代码显示的最终结果如下截图
RGB相关拓展知识,如下截图:
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
代码显示的最终结果如下截图:
以上代码可以用with...end with进行改进
2.5Range.ClearContents & Range.ClearFormats & Range.Clear
- Range.ClearContents :
清除内容,保留格式 - Range.ClearFormats :
清除格式,保留内容 - Range.Clear:
内容和格式全部清除
2.6Range.Merge
将该 Range对象中所有单元格合并为一个单元格。(如果 Range形状特殊,则无法合并)
2.7Range.UnMerge
取消本 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.
3.2 Aplication.ActiveWorkbook & Aplication.ActiveSheet
application.cells(3,5)可以写成application.activesheet.cells(3,5)
application相关的激活状态(最前面,处于编辑修改状态),具体可以参见如下截图:
- application.activeworkbook代表的是处于激活状态的工作簿
- application.activesheet代表的是处于激活状态的工作表
- application.activesheet.cells代表的是处于激活状态的单元格
相关案例如下截图:
Option Explicit
Sub 活动工作簿示例()
Dim w2 As Workbook, w1 As Workbook
Set w1 = Application.ActiveWorkbook
Set w2 = Workbooks.Add
w2.Worksheets(1).Cells(2, 2) = "新文件!"
w1.Worksheets(1).Cells(3, 5) = 7
End Sub
代码及其结果如下:
注意事项:
如果没有表明w1是活动的工作簿,则Cells(3, 5) = 7则会直接赋值在新建的工作表上.
Option Explicit
Sub 活动工作簿示例()
Dim w2 As Workbook
Set w2 = Workbooks.Add
w2.Worksheets(1).Cells(2, 2) = "新文件!"
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
代码显示的最终结果如下截图:
注意事项:
1.m也可以写成,m = Application.WorksheetFunction.Max(Range("B2:D7"))是等价的.
-
m= Application.WorksheetFunction.Max(Range("B2:D7"))不可以写成m= Application.WorksheetFunction.Max("B2:D7")
3.4 Aplication. DisplayAlerts
相关案例如下截图:
Sub 活动工作簿示例()
Dim w2 As Workbook, w1 As Workbook
Set w1 = Application.ActiveWorkbook
Set w2 = Workbooks.Add
w2.Worksheets(1).Cells(2, 2) = "新文件!"
Application.DisplayAlerts = False
w2.SaveAs "C:\Users\Administrator\Desktop\测试.xlsx"
Application.DisplayAlerts = True
w2.Close
End Sub
3.5 Aplication. Quit
应用程序退出.