一、从录制宏开始
一个快捷键,一次录制,尽量少包含多余操作,就可以通过快捷键重复录制的内容
录制宏包括:
绝对引用 只对固定的单元格有效,一般是在录制宏的过程中选中了特定单元格
相对引用 对任意单元格都有效,可以延伸至其他单元格
先点击使用相对引用 再录制宏就可以使用相对应用
快捷使用录制宏
录制宏不仅可以通过快捷键来调用也可以通过指定一个空间把宏赋给它,以后点击控件即可调用
二、for循环提高自动水平
之前的方法还要一直点按钮或者快捷键,通过for循环可以做到一劳永逸
F8逐步调试vba程序,视图-本地窗口可以监测变量值
for 初值 to 末值 step 步长
执行的语句
next
第一个vba程序实现啦
For 的另一种使用方法是For each x in y:—next
其中y是包含x的一个集合
三、加油站
补充知识
CELLS(X,Y).SELECT可以选中(X,Y)位置的单元格
MSGBOX 可以打印信息到消息框
RANGE对象
1.表示连续区域
Range(“A1”)表示单个单元格A1,同cells(1,1);
Range(“A1:C5”)或Range(“A1″,”C5”)表示A1:C5区域; range(cells(1,1))可以组合
Range(cells(i,j),cells(m,n))表示第i行第j列的单元格到第m行n列的单元格区域,有时cells前需加worksheets(“sheet1”).之类;
2.表示不连续区域
Range(“A1:B2,C3:D4”)表示A1:B2和C3:D4两个区域;
3.表示整行和整列
Range(“1:1”)表示第一行,同rows(1);
Range(“A:A”)表示第一列,同columns(1)或columns(“A”);
来源:https://blog.csdn.net/csdndscs/article/details/103958424
CELL,RANGE对象的entirerow,entirecolumns可以选择整行整列(range(“a2”).entirerow.select)
xlUp,xlDown的使用
Rows("6:6").Select #选第六行
For i = 1 To 100 Step 1#循环step可以不写
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove#加空格
ActiveCell.Offset(5, 0).Rows("1:1").EntireRow.Select#选行
Next
End Sub
代码一:
Worksheets("Sheet1").Range("A1").Select
selection.End(xlDown).Select ——最终被选中的单元格是A2
代码二:
Worksheets("Sheet1").Range("A2").Select
selection.End(xlDown).Select ——最终被选中的单元格是A4
代码三:
Worksheets("Sheet1").Range("A10").Select
selection.End(xlUp).Select ——最终被选中的单元格是A7
通过这三个例子,我们可以更好地理解xlDown和xlUp的用法。
xlDown:从被选中的单元格向下寻找,如果被选中单元格为空,则一直向下走到第一个非空单元格;如果被选中单元格为非空,则向下走到最后一个非空单元格。
xlUp:只需要将xlDown的规则倒过来,就是xlUp的规则
.clear方法可以使得选中的单元格或者区域清空
.delete方法可以使得选中的单元格或区域删除 不过具体的填充方法参考以下代码
Selection.Delete Shift:=xlToLeft '右侧单元格左移
Selection.Delete Shift:=xlUp '下侧单元格上移
案例
‘为vba中的注释符号
Sub合并列()
range("J:J").clear
Dim x,y As lnteger 'x是列号,y是J列的行号
For x = 1 To 3
Cells(2,x).Select
Range(Selection,Selection.End(xlDown)).Select
Selection.Copy
y=Range("j10000").End(xlUp).Row + 1 #从下往上数第一个不为空的单元格+1则是指向下一个空的单元格
Range("J"& y).Select
ActiveSheet.Paste
Next
End Sub
'实现三列合并到J列
四、IF的使用
形式一:
IF 条件表达式 then
代码
else
代码
End if
形式一:
IF 条件表达式 then
代码
elseif 条件表达式
代码
else
代码
End if
如果利用if跳出循环可以使用
Exit for跳出for
Exit sub跳出sub
五、认识工作表
Sheet表示单个工作表
Sheets表示所有本工作簿所有工作表的集合
要注意的是,每个表有大名和小名,大名不可变由excel的命名逻辑来,小名可变由用户的命名来
工作表的选择
用大名选择表的方法
大名.select 如sheet1.select
用小名选择表的方法
sheets(“小名”).select
用序列号选择表的方法
sheets(n).select n=1……k为表的排列次序下标从1开始 遍历时常常用到这个方法
案例:取出所有工作表的名字
dim i as Integer
for i=1 to sheets.count
range("A"& i )=sheets(i).Name '对单元格赋值操作
更改工作表属性
sheets(1).visible=False 就不可见了,工作表属性在视图-属性里有
六、认识对象属性和方法
对象:有实际意义的区域、单元格、工作表、工作簿等等,对象有自己的属性和方法
属性:对象一些参数设置
方法:对象支持的一些行为,增删改查这些
七、操作工作表
我们将从增、删、查、复制四个方面来处理
1.查就是select 在认识工作表时候已经提及不过多赘述
2.增就是add 我们通过录制宏也可以比较简单的看出操作原理
Sheets.Add After/before:=ActiveSheet(默认为活动单元格,也可以是表大名),count:=要插入的数量,type:=类型
3.删就是delete,先选中sheet再delete即可
4.复制就是copy,与add类似
sheet1.copy After/before:=ActiveSheet(默认为活动单元格,也可以是表大名)
八、操作工作簿
工作簿的打开与关闭
workbooks.open 路径+文件名 '打开工作簿
activeworkbook.close savechange:=Ture '活动工作簿关闭,保存,没有参数会提示你是否保存
工作簿另存为
thisworkbook.path '获取当前工作簿路径,不包括最后一层的反斜杠
workbook.add'新建工作表
workbook对象.saveas (path)&"文件名" '实现保存到path路径下
实例:批量把工作表保存为工作簿
for i=1 to 12
sheets(i&"月").copy
activeworkbook.saveas path&i&"月.xlsx"
next
我们不难发现执行这种批量构建文件的过程屏幕会一直闪一直刷新
利用
application.ScreenUpdate=False '就可以不闪,加最前面
sub 隔行填充()
dim x as integer
for x=2 to 17 step 2
range("a"&x":e"&x).Interior.color=vbgreen
next
end sub
隔列填充的话为了方便起见可以使用cells因为cells支持用序列号定位单元格,而单凭range就不那么简单了
单元格偏移
对于range,cells对象有offset(x,y)方法,实现向上/下,左/右偏移,正方向是下/右 小TIP:相对引用是基于单元格偏移来实现的哦
单元格重选
对于range,cells对象有resize(x,y),实现以现有单元格左上方为顶点扩展出x,y大小的选区
单元格选区边界的获取
对于range对象,有End方法end的使用
全选单元格
思路从a100000往上找,从"ddd8"往左找,找出来有值的两个边界
通使用range("a1").resize(irow,icolumn)
单元格格式
range("a1").Interior.color=vbgreen '也可以是颜色代码51422这样
获取颜色代码
msgbox range("a1").Interior.colorindex
取消填充
range("a1").Interior.pattern=xlnone
加粗
range("a1").font.bold=true
斜体
range("a1").font.italic=true 'False为取消
字体填充
range("a1").font.color=vbgreen '也可以是颜色代码51422这样
我们会发现我们写的代码重复度很高比如都是range(“a1”).font开头,这时候可以使用with
with range("a1").font
加粗
.bold=true
斜体
.italic=true
字体填充
.color=vbgreen '也可以是颜色代码51422这样
更多的单元格格式可以通过录制宏来实现哦
十、拆分工作表
案例:按照某列的不同值拆分为不同的表
for i=3 to 7
Sheets(总表).Select
Range("D1").Select
Selection.AutoFilter "打开筛选
ActiveSheet.Range("5A$1:$K$771").AutoFilter Field:=11, Criteria1:=sheets(i).name '第11列,筛选出表名相同的值的行'
Range("A1").Select
Range(Selection,Selection.End(xlToRight)).Select
Range(Selection,Selection.End(xlDown)).Select ’selection可以实现叠加哦
Selection.Copy
Sheets(i).Select
Range("A1").Select
activesheet.paste
next
Sheets("总表").select
application.cutcopymode=False
selection.autofilter '关闭筛选
Comments NOTHING