VBA中对workbook、worksheet、range的选择和操作
(2020-12-23 08:29:45)
标签:
excelvba |
分类: Excel相关 |
Workbooks对象是Microsoft Excel 应用程序中当前打开的所有 Workbook
对象的集合。有close、add、open等方法。
Workbooks.close
' 关闭所有打开的工作簿。
Workbooks.Add
' 创建一个新工作簿。
ActiveWorkbook
'返回当前处于活动状态的工作簿。
Workbooks.open Filename:="TEST.XLSX",
ReadOnly:=True
' 将文件TEST.XLSX打开为只读工作簿
Workbook对象是一个Microsoft Excel
工作簿。有Name、Path等属性。有SaveAs等方法。有Open、Activate等事件。
使用 Workbooks(index)(其中 index 是工作簿名称或索引号)可返回一个 Workbook
对象。index指创建或打开工作簿的顺序。Workbooks(1) 是创建的第一个工作簿,而
Workbooks(Workbooks.Count)Workbooks返回最后一个打开的工作簿。激活某工作簿并不更改其索引号。所有工作簿均包括在索引计数中,即便是隐藏工作簿也是。
Workbooks(1).Activate
'
激活工作簿一(创建或打开的第一个工作簿)。
Workbooks("TEST.xlsx").Worksheets("Sheet1").Activate
'
激活名为“TEST.xlsx”的工作簿(该工作簿必须已经在 Microsoft Excel 中打开)中的 Sheet1。
ActiveWorkbook.Author = "Jean Selva"
' 设置活动工作簿作者的名称。
Sheets集合是指定的或者活动工作簿中所有的工作表(图表工作表Chart和工作表Worksheet)的集合。有Add等方法。
使用 Sheets(index)(其中 index 是工作表名称或索引号)可返回一个 Chart 或 Worksheet
对象。工作表索引号指示该工作表在工作簿的标签栏上的位置。所有工作表均包括在索引计数中,即便是隐藏工作表也是。
Worksheets(1)
'工作簿中第一个(最左边的)工作表
Worksheets(Worksheets.Count)
'最后一个打开的工作表。
Sheets(1).Activate
' 激活活动工作簿中的工作表二。
Sheets("sheet1").Activate
'
激活活动工作簿中名为“Sheet1”的工作表。
Sheets(Array("Sheets4", "Sheet5")).Move
before:=Sheets(1)
' 将名为"Sheet4"和"Sheet5"的工作表移到活动工作簿的开头。
Worksheets对象是指定的或者活动工作簿中所有WorkSheet对象的集合。有Add等方法。
使用 Worksheets(index)(其中 index 是工作表索引号或名称)可返回一个 Worksheet
对象。工作表索引号指示该工作表在工作簿的标签栏上的位置。所有工作表均包括在索引计数中,即便是隐藏工作表也是。
Worksheets(1)
'工作簿中第一个(最左边的)工作表
Worksheets(Worksheets.Count)
'最后一个工作表。
Worksheets.move After:=Sheets(SHeets.Count)
'
将所有工作表都移到工作簿的尾部,即将图表工作表都放在工作表之前。
Worksheets.Add count:=2, Before:=Sheets(1)
' 在活动工作簿的工作表一之前创建两个新工作表。
Worksheets(1).Visible = False
' 隐藏活动工作簿中的工作表一。
Worksheet对象代表一个工作表。有Name等属性。有Activate、Delete等方法。有Name、Cells等属性。有Activate、Change等事件。
使用 Worksheets(index)(其中 index 是工作表索引号或名称)可返回一个 Worksheet
对象。工作表索引号指示该工作表在工作簿的标签栏上的位置。所有工作表均包括在索引计数中,即便是隐藏工作表也是。工作表名称是工作表的标签上显示的名称。
ActiveSheet
'返回当前处于活动状态的工作表。如果没有活动的工作表,则返回Nothing。
Worksheets(1)
'是工作簿中第一个(最左边的)工作表
Worksheets(Worksheets.Count)
'最后一个工作表
Range对象代表某一单元格、某一行、某一列、某一选定区域(可包含一个或多个连续单元格区域)或某一三维区域。有Clear、Copy等方法。有Cells、Value、Font等属性。
Range("A1).Value = "test"
Worksheets("sheet1").Range("A5").Value =
"test"
Worksheets("Sheet1").Range("A1:H8").Formula =
"=Rand()"
Worksheets(1).Range("Criteria").ClearContents
Range("1:4").Select
' 选择第1到4行
Range("A:C").Select
' 选择A到C列
Range("A:C").EntireColumn.Insert
'
在第1列左边插入三列空白列
使用 Cells(row, column)(其中 row 是行号,column
是列标)可返回一个单元格。当工作表激活以后,使用 Cells
属性时不必明确声明工作表(它将返回活动工作表上的单元格)。column列标可以是字母格式的,例如Cells(1,"A");也可以是数字格式的。row行号和column列标可以为变量。
Worksheets("sheet1").Cells(1,1).Value = "test"
使用 Range(cell1, cell2)(其中 cell1 和 cell2 是指定起始和终止单元格的 Range
对象)可返回一个 Range 对象。
Worksheets(1).Range(Worksheets(1).Cells(1,1),
Worksheets(1).Cells(10,10)).Borders.LineStyle = xlThick
Worksheets("Sheets1").Range("A5:H8").Cells(1,1).Formula =
"=Rand()"
'为A5单元格设置公式。
使用Union可返回多块区域,即该区域由多个连续的单元格区域所组成。
Union(Range("A1:B2", Range(C3:D4")).Select
'
选定多块区域。
Range.Areas属性将多区域选定内容拆分为单个的Range对象,并将对象返回为一个集合。
x = Selection.Areas.Count
Range.CurrentRegion属性返回一个Range对象,该对象表示当前区域(当前区域是以空行与空列的组合为边界的区域)。
ActiveCell.CurrenRegion.Select
' 选定活动单元格所在的当前区域。
ListObject对象代表工作表中的表格/列表对象(即在工作表中插入表格后形成的列表)。
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$B$2"), ,
xlYes).Name = "表1"
ActiveSheet.ListObjects("表1").Name = "表ABC"
ActiveSheet.ListObjects("表ABC").Resize
Range("$A$1:$B$10")
Range.Row属性返回区域中第一个子区域的第一行的行号。
x = Selection.Row
Range.Rows属性返回一个Range对象
Worksheets("Sheet1").Rows(3).Delete
x = Selection.Rows.Count
可以直接使用单元格地址进行选择和操作,但地址中不可包含变量。
[b7].Select
'
选定B7单元格。单元格地址用字符串表达,如A1、B3等,字母可小写。注意用中括号括起单元格地址。
[a1:B5].Select
'
选择单元格区域
Range("A1", "E10").Select
Range(Range("A1"), Range("E10")).Select
'与上一语句等价
[a1:a3,c1:c5].Select
'
选择多个单元格区域
ActiveSheet.Cells.Select
'选中活动工作表的所有单元格
Range("B3:E9").Select
'选中活动工作表中B3:E9单元格区域
多区域选择
1、引用多个不连续的区域,用逗号隔开
2、用空格而不是逗号,则表示选中区域交集部分
其他获取单元格的方式(除了Range、Cells外)—Rows
ActiveSheet.Rows
'选中活动工作表的所有行
ActiveSheet.Rows(3).Select
'选中活动工作表的第3行
ActiveSheet.Rows(3).EntireRow.Select
'选中活动工作表的第3行整行
ActiveSheet.Rows("3:3").Select
'选中活动工作表的第3行
ActiveSheet.Rows("3:5").Select
'选中活动工作表的第3行到第5行
Rows("3:10").Rows("1:1").Select
'选中第3行到第10行区域内的第一行
ActiveCell.EntireRow.Select
' 选择这个单元格所在的整行
ActiveCell.EntireRow.Offset(1, 0).Cells(1).Value
= 2
ActiveCell.Offset(rowOffset:=3,
columnOffset:=3).Activate
ActiveCell.CurrentRegion
'激活单元格的当前区域
其他获取单元格的方式(除了Range、Cells外)—Columns
ActiveSheet.Columns
'选中活动工作表的所有列
ActiveSheet.Columns (6)
'选中活动工作表中的第6列
ActiveSheet.Columns (6).EntireColumn
'选中活动工作表中的第6列整列
ActiveSheet.Columns ("F:G")
'选中活动工作表中的F至G列
Columns("B:G").Columns("B:B").Select
'选中B:G区域中的第2列
ActiveCell.EntireColumn.Select
'选中单元格的整列
ActiveCell.EntireColumn.Cells(1).Value = 2
‘ 选择任意一个单元格,然后将值2输入到包含这个活动单元格的列的第一个单元格中。
Application的Union方法
Union方法像一支强烈的粘合剂,将不连续的多个单元格区域粘在一起,可以同时对其进行操作。
Sub rngUnion()
End Sub
Range对象的Offset属性
Offset(x,y)两个参数,x表示行移动,即x>0表示向下移动,x<0表示向上移动;y表示列移动,即y>0表示向右移动,y<0表示向左移动。
Sub rngOffset()
End Sub
Range对象的Resize属性
Resize共有两个参数,第一个参数确定新区域的行数,第二个参数确定新区域的列数,两个参数的值都是正整数,最小为1.
新区域把该对象最左上角的单元格当成自己左上角第一个单元格
Sub rngResize()
End Sub
Worksheet对象的UsedRange属性
Sub rngUsed()
End Sub
Range对象的CurrentRegion属性
CurrentRegion返回当前区域,即以空行和空行的组合为边界的区域
Sub rngUsed()
End Sub
Range对象的End属性
Sub rngEnd()
End Sub
共有4个参数,说明如下:
xlUP
向上
xlDown 向下
xltoleft
向左
xltoright 向右
什么情况会用到End属性?工作表中记录的行数随时都在变化,应该把新记录写入工作表的第5行还是第10行?
可以用End属性解决这个问题
复制代码
Sub rngEnd()
End Sub
Sub rngUsed()
End Sub
Sub rngCurr()
End Sub
单元格内容-Value
Range("A1:B2").Value = "abc"
Range("A1:B2") = "abc"
'Value是Range的默认属性,在给区域赋值时可以省略。
单元格个数-Count
Range("B4:F10").Count
'统计单元格数量
ActiveSheet.UsedRange.Rows.Count '统计活动单元格的行数
ActiveSheet.UsedRange.Columns.Count
'统计活动单元格的列数
单元格地址-Address
选中单元格-Active与Select
以下两组代码是等效的。
选择性清除单元格-Clear
Range("B2:B15").Clear '清除B2:B15单元格所有内容(包括批注、内容、注释、格式等)
Range("B2:B15").ClearComments '清除B2:B15单元格批注
Range("B2:B15").ClearContents '清除B2:B15单元格内容
Range("B2:B15").ClearFormats '清除B2:B15单元格格式
复制&粘贴单元格区域-Copy&Paste
录制复制和粘贴的宏内容如下:
Sub Macro1()
End Sub
但在执行复制或者粘贴操作之前并不需要选中单元格,所以代码可以简化为:
Sub Macro1()
End Sub
带参数的复制-Destination
Sub Macro1()
End Sub
带参数的复制-CurrentRegion
Sub Macro1()
End Sub
想粘贴源区域的数值(以下两个式子等价)
Sub rngCopyValue_1()
End Sub
Sub rngCopyValue_2()
End Sub
剪切单元格-Cut
Sub rngCut()
End Sub
删除单元格-Delete
Range("B5").Delete Shift:=xlToLeft '删除B5单元格,删除后右侧单元格左移
Range("B5").Delete Shift:=xlUp '删除B5单元格,删除后下方单元格上移
Range("B5").EntireRow.Delete '删除B5单元格所在的行
Range("B5").EntireColumn.Delete '删除B5单元格所在的列
单元格名称,Names集合
Excel中定义的名称就是给单元格区域(或数值、常量、公式)取的名字,一个自定义的名称及时一个Name对象,Names是工作簿中定义的所有名称的集合。
新建名称
录制的宏告诉我们,怎样新建一个名称
ActiveWorkbook.Names.Add Name = "date",
RefersToR1C1:="Sheet1!R5C[-2]"
R5C[-2]说明:R后面的数值表示行号,C后面的数值表示列号,[]中括号表示相对引用,默认是绝对引用,相对应用时R>0表示向下移动,C>0表示向右移动
R[2]C[3]:对活动单元格下方的第二行与右边的第3列相交的单元格的引用
R2C3:对工作表中第二行与第3列相交的单元格的引用
另一种单元格引用方式:A1样式引用
ActiveWorkbook.Names.Add Name = "date",
RefersTo:="Sheet1$B$4"
定义名称更简单的方式
Range("A1:C10") = "date"
怎样引用名称
ActiveWorkbook.Names("date").Name = "姓名"
ActiveWorkbook.Names("姓名").Name = "张三"
也可以使用名称索引引用名称
Sub UseName()
End Sub
单元格批注,Comment对象
一个批注就是一个Comment对象,Comments是工作簿中所有Comment对象的集合
给单元格增加批注
Range("B5").AddComment Text:="我用VBA新建的批注"
怎么知道单元格是否有批注
Sub wbComment()
End Sub
操作批注
Sub operComment()
End Sub
给单元格化妆
Sub FontSet()
End Sub
给单元格增加底纹-Interior
Sub InteriorSet()
End Sub
给表格设置表框
Sub InteriorSet()
End Sub
编写一个程序,按要求创求的一个新的工作簿,并把它保存到指定的文件夹。
Sub wbAdd()
End Sub
判断工作簿是否打开
'判断"成绩表.xls"工作簿是否打开
Sub isWbOpen()
End Sub
Sub isShtOpen()
End Sub
Sub isShtOpen()
End Sub
判断工作簿是否存在
Sub isExistWb()
End Sub
向未打开的工作簿中录入数据
Sub WbInput()
End Sub
隐藏活动工作表外的所有工作表
Sub ShtVisible()
End Sub
批量新建工作表
Sub shtAdd()
End Sub
批量对数据分类
Sub fenLei()
End Sub
清除工作表内容
Sub shtClear()
End Sub
将工作表保存为新工作簿
Sub SaveToFile()
End Sub
换种写法:
Sub 自动拆分工作表()
End Sub
快速合并多表数据
Sub HeBing()
End Sub
汇总同文件夹下多个工作簿数
Sub HzwWb()
End Sub
为工作表建立目录
Sub mkdir()
End Sub