1 EXCEL对象
EXCEL对象逐层级拆解可以分为多层次的对象
1.1 MSDN官网资料
详细见MSDN官网https://docs.microsoft.com/zh-cn/office/vba
1.2 VBE编辑器里,选择对象管理器,也可以打开和查询
2 常用excel对象的属性,方法,事件举例
对象集合 workbooks
对象 workbook,一般都是指各种 excel 对象
属性对象的属性,可能本身也是对象如workbook下的worksheet 是属性也是对象
方法(VBA内置方法)方法是对象的动作,并且需要主动调用
事件(VBA内置事件),事件,是被外在条件激活的,是被动的;而方法,却是主动的。事件,一般只在 workbook, worksheet,等以下的对象层次才有事件是触发性的在VBE里,先选择对象,然后在 事件选择器里 选择事件 后,会自动生成 对应的过程名,不能自己修改
3 工作簿 workbooks
https://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheet.change
3.1 workbooks属性 变量=对象.属性
变量 = 对象.属性需要给变量赋值V1= workbooks.applicationV1= workbooks.countV1= workbooks.creatorV1= workbooks.item() '定义为wb 对象V1= workbooks.parent
Sub t7()
Debug.Print Workbooks.Application '很显然是excel
Debug.Print Workbooks.Count '这是你现在已经打开的 EXCEL表--内存中的
Debug.Print Workbooks.Creator '?
Set a = Workbooks.Item("cs11.xlsm") '对对象的赋值,赋值后也是对象
Debug.Print a.Name '这里不能debug.print a
rem 直接这样不行,必须先定义为对象! Debug.Print Workbooks.Item(cs11.xlsm).Name
rem set a as object
Debug.Print Workbooks.Parent '很显然也是excel
End Sub
3.2 workbooks方法 对象.方法
对象.方法方法是操作,动作等等,不需要给变量赋值workbooks.addworkbooks.openworkbooks.close '一般情况下,都是同时打开多个sheet 同时关闭的。打开1个workbookworkbooks.checkout workbooks.opentext '用来打开txt文件还有很多
Sub t7()
Rem Workbooks.Add ("cs100.xlsm") '默认会去,默认路径去找文件做为范本,可以改路径把? C:\Users\pc\Documents
Workbooks.Add '不能带括号 workbooks.add()是错误的
Workbooks.Add (xlWBATWorksheet) '有几种参数
End Sub
Sub t7()
Rem Workbooks.Open "cs100.xlsm" '语法要求必须"" workbooks.open()这样不行!并且有1堆复杂参数
Rem Workbooks.Close '必须全部关闭,不能只关闭特定表?
Workbooks.OpenText "cs100.txt" '打开txt文件
End Sub
4 工作表 worksheets
worksheets的事件,方法,属性都特别多
4.2 worksheet 的属性(具体在代码窗口敲了对象worksheet. 看)
worksheets().name 或worksheet1.nameworksheets().indexworksheets().codename
4.3 worksheets 的方法(具体在代码窗口敲了对象worksheet. 看)
EXCEL里没有 worksheet的 open close 这种奇怪操作worksheets.addworksheets.deleteworksheet.active
4.4 worksheets 的事件(具体在VBE里查看)
worksheets.activeworksheets.change
5 表 sheets
sheets 包括 worksheets charts window 等等?这3种写法是等效的
Sub test1002()
Debug.Print Sheet1.Name
Debug.Print Sheet1.Index
Debug.Print Sheet1.CodeName & vbCrLf
Debug.Print Sheets(1).Name
Debug.Print Sheets(1).Index
Debug.Print Sheets(1).CodeName & vbCrLf
Debug.Print Sheets("range").Name
Debug.Print Sheets("range").Index
Debug.Print Sheets("range").CodeName & vbCrLf
End Sub
6 range 和 cells(一般 range 和 cells是等价的)
6.1 属性
range.value ----返回或设置单元格中的值range.formula ---返回或设置 A1 样式表示法和宏语言中的对象的公式。String 类型,可读写。range.font ---返回一个font对象,可以设置字体的特征range.interior. 设置背景
6.2 方法 (具体在代码窗口敲了对象worksheet. 看)
range.select ----选中单元格range.clear ----清楚单元格中的值range.copy ----复制单元格中的值range.resize----重新设置区域大小,也是以左上角为准。range.offset----偏移 (cells/range 会整体偏移) 是根据当前range偏移 找另外一个区域range.delete 删除
6.3 具体方法介绍
range.resizeResize(,) resize(:=rows,:=columns)
range.offset()Cells().offset(4,0)Range().offset(4,0) 是根据当前range偏移 找另外一个区域
cells(3,3).delete '只能向左边或上面整体移动不带参数时,默认参数先是 xlup,如果下方无内容,则默认参数为xltoleft或者指定参数cells(3,3).delete(xlup )cells(3,3).delete(xltoleft )
但是下面2种写法是错误的cells(3,3).delete shift:xldown 或者 cells(3,3).delete(xldown )cells(3,3).delete shift:xltoright 或者 cells(3,3).delete(xltoright)
delete 方法执行的时候居然是先删除下方的有值的单元格,逐个删除然后删除右边的有值得单元格,逐个删除可以试试 cells(3,3).delete 就可以看到这个奇妙现象。。。。。。。。。。所以我理解了,为啥这几个会报错cells(3,3).delete shift:xldowncells(3,3).delete shift:xltoright因为单元格总是基于设定在左上角的规则,所以只能是 右边的所有单元格往左移动,或者下面往上移动所以只有 shift:=xlup 和 上 shift:= xltoleft 好用
6.3 事件 (具体在VBE里查看)
range或 cells有事件吗?
7 属性的两种写法格式
7.1 与其他语言的区别:属性的特殊写法
属性:= 属性值 而其他语言一般写法就是 =
7.2 VBA本身属性有两种写法 (可能有问题)
方法(参数)
方法 空格 参数
举例 cells().delete(xlup)
cells(3,3).delete shift:xlup 或者 cells(3,3).delete(xlup)cells(3,3).delete shift:xltoleft 或者 cells(3,3).delete(xltoleft)
参考文档和继续
https://www.jianshu.com/p/f83b298fa34ehttps://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheet.change