VBA Programming In MS Office
发表:2006-7-30 22:35:58 出处:
你的博客网(yourblog.org)
VBA is a powerful tool in office,but not a good developing tool.You can use it to do what you can imagine in the office set.Here are some basic knowledges about it.You know,it’s such a emjoyable experience when you were watching the screen flashing fast and excel was running as you wish by itself...oh,woderful feeling.
单元格在VBA的表示方法:1、Range("单元格地址") 如Range("a1") 即为A1单元格;2、CELLS(行,列) 如CELLS(1,1)也为A1单元格,CELLS(2,1)为 A2单元格;工作表在VBA中表示方法:sheets("工作表名")
单个调用时每个函数前都要加Application.WorksheetFunction.
如果是多个调用就可以用WITH语句省去后面的
如Sub 矩形1_单击()
Dim i As Integer
For i = 1 To 20
Sheets("sheet1").Cells(i, 1) = i
Next
With Application.WorksheetFunction
Range("a21").value = .Sum(Range("a1:a20")) 注意SUM前面要有个点才行
Range("a22").value = .Average(Range("a1:a20"))
End With
End Sub
COLUMN是指列,COLUMNS是指列的集合
ROW是表示行,ROWS是行的集合
如果用Sheets("sheet1").columns.select 会选定所有列即整个工作表
SUB 语句,需要有个事件触发它,才能执行,就比如一个箱子,只有去搬、推等外力施加与它时,它才会动。设置个按纽目的就是为了执行SUB语句
Range("A1:A22").ClearContents该语句是清除内容的语句
Private 的中文意思是私有的,Private Sub中的程序只能在本程序内部运行而不能被其他程序调用,而SUB语句则可以
如:
SUB BB()
END SUB
SUB AA()
BB
END SUB
Range("B65536").End(xlUp).Row
是指B列最后一个非空单元格,END(XLUP)是向上数第一个非空单元格,为了准备找到最下面的非空单元格,当然要从RANGE("B65536")开始向上找了
MSGBOX 有时带()
比如AAA=MSGBOX()
这种情况下可以取到用户点击对话框按纽的返回值,以确定下一步该怎么做
而不带括号只是提示的作用,不能取得返回的值
如MSGBOX ......
向右是End(xltoright) 向左End(xltoleft)
K=K+1是在原来的基础加1
如选取Sheet1第一行有内容单元格区域(假设A1不为空):
sheets("sheet1").range("a1",range("a1").end(xltoright)).select
选取B列有内容单元格区域:(假设B1不为空):
sheets("sheet1").range("B1",range("B65536").end(XLUP)).select
工作表SHEETS的属性和方法很多,介绍几个常用的
Sheets.Count 工作薄中工作表的数量
Sheets(1).name 返回第一个工作表的名子
sheets("sheet1").activate 设置sheet1为活动工作薄
sheets("sheet1").Delete 删除sheet1
Sheets("SHEET1").Move AFTER:=Sheets(Sheets.Count) 把Sheet1移到最后
sheets("sheet1").Protect PASSWORD:=123 保护工作表
sheets("sheet1").unProtect PASSWORD :=123 解除工作表保护
sheets("sheet1").usedrange 工作表中已使用的单元格区域
sheets("sheet1").visible=true(false) 工作表是否隐藏
sheets("sheet1").ScrollArea="$A$1:$A$10" 工作表的控制区域为A1:A10
有两个方法,是在对工作簿open、saveas操作时非常有用的:getopenfilename、getsaveasfilename。
这两个方法是用于打开“打开”、“另存为”对话框,获取要open、saveas的工作簿路径名称。
使用这两个方法,可以在需要打开或另存的时候跳出对话框,由用户直接选取打开文件或另存文件的路径、文件名。
fileToOpen = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
If fileToOpen <> False Then
MsgBox "Open " & fileToOpen
End If
这是帮助中的一段代码,可以将它放入sub中测试一下,注意运行后并不真正打开选取的文件,只是取得该文件的路径、文件名,真正打开还要使用workbooks.open方法。
补充一点:
Application.Dialogs(5).Show是调用另存为对话框,
Application.Dialogs(1).Show是调用打开对话框
如果想了解更多对话框对应的参数
设置一个按纽运行下面的宏(看下一个时按ESC)
Sub 矩形1_单击()
on error resume next
For I = 1 To 100
MsgBox "下面的对话框参数将对应参数" & I
Application.Dialogs(I).Show
Next
End Sub
如果你想让EXCEL自动为你服务(如打开、关闭文件、单击单元格、更换工作表就自动执行你设置的程序,而不需要去点击按纽或宏--执行宏来触发宏的运行)就考虑用事件程序,也就是放到 MIRCROSOFT EXCEL对象中,如果程序要用手工控制,如点击某个按纽或通过宏选项执行宏才让程序运行,这种情况下用宏按纽方便。
举个例子:填充非空单元格颜色
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.value <> "" Then
Target.Interior.ColorIndex = 3
End If
End Sub
上面是一个事件程序,当工作表内容改变时就运行Target.Interior.ColorIndex = 3
如果这用宏来完成则很不方便,如果这样则,在单元格中每填入一个数字都要点一下按纽运行下面的宏
Sub 矩形1_单击()
If ActiveCell.value <> "" Then
ActiveCell.Interior.ColorIndex = 3
End If
End Sub
在VBA中,单元格常用的表示方法有两种,
一种是RANGE
如A1在VBA的表示方法是Range("a1")
A1:100的表法方法是: Range("A1:A100")
和以前一样,大家先在工作表中插入一个矩形作为执行宏的按纽
在按纽上单击右键,单击指定宏,再单击新建,在VBE窗口中的代码窗口会出现
Sub 矩形1_单击()
End Sub
在两句中间输入
Range("a1")=1000
Range可以代表一个单元格区域,也可以代表一个单元格,通过Range("a1")=1000 也可以看出,它的用法是Range后括号中带上"A1" 就可以表示我们平时在工作表用到的中的A1单元格了,
它在表示一个连续区域时是这个的,Range("区域的左上角单元格:区域的右下角单元格")
请把刚才的代码再加上一句:Range("a1:a10")=1000
如果是不连续的单元格多个区域,它是这样表示的:
Range("单元格区域1,单元格区域2.....")
把刚才的代码替换为:
Range("a1:a10,c1:c10,e1:e10") = 100
[A1]是Range("A1")的简写.二者在用法上没有什么区别,但在输入时有点不同,如当你输入[A1]后加点时,后面不会出现属性和方法列表,而输入Range("A1")加点后则会出现属性列表供你选取Union是求多个单元格区域的并集,用法是Union(单元格区域1,单元格区域2.....)
它返回的是所有区域的所有单元格集合
Range("C16").Select
ActiveCell.FormulaR1C1 = "100"
Range("C11").Select
其实我只是在C16单元格中填入数值100,就会出现这么一大堆代码,这此代码可以优化为:
Range("C16").="100"
Application.Intersect(Range("a1:a10"), Range("a3:c4")).Select
这一句的意思是选中区域A1:A10 和 A3:C4重叠的区域,即两个区域共有的区域,此名代码运行的结果是选中区域A3:A4
注意Intersect 方法是一个非常实用的一个方法,比如我们在动态选取工作表Sheet1A列中已存在数据的区域时,就会用到它。在介绍这个用法前还要介绍一下另一个工作表中非常实用的属性:Usedrange
你可以选试着运行一下:Activecell.usedrange.Select
运行Activecell.usedrange.Select你会发现,在当前工作表中的所有用过的区域全被选中了。你明白了吗,其实usedrange就是工作表中所有已存在内容的矩形区域,为什么不说是存在内容的单元格呢?原因是比如你在一个空工作表中的B3和C5单元格任意输入一个数值,运行Activecell.usedrange.Select后选取的不只是B3和C5单元格,而是B3:C5单元格区域
2003支持activesheet.usedrange.select
Sheet1.UsedRange.Select
我们平时在程序中会看到
Activesheet
worksheets("sheet1")
sheet1
sheets("sheet1")
Sheets(1)
顺便说一说他们的区别
Activesheet是指当前活动工作表,即你正在操作的工作表
worksheets("sheet1")等同于sheets("sheet1")是特指工作表Sheet1,注意这时的Sheet1是工作表的名子,就如同"员工工资表"一样是工作表的名称,而Sheet1和Sheets(1),不管你如何命名,Sheet1和Sheets(1)就只代表第一个工作表,Sheet2和Sheets(2)代表第二个工作表。。。。
Intersect(Range("a:a"), Sheets("sheet1").UsedRange).Select
Range("a:a")是A列,Sheets("sheet1").UsedRange是工作表sheet1已使用的所有单元格区域,用Intersect求二者的共有区域,结果就是我们所要的A列已用所有区域
其实这中间有个规律:如果你输入的是非数字的字符,即使你删除了,也被当做已用区域(已用过的区域),而当你删除的是你输入的数字时则不受这个限制)
cellS(行数,列数)
如 A1:Cells(1,1) 用range表示: range("a1")
b2: cells(2,2) 用range表示: range("b2")
c100: cells(100,3) 用range表示: range("c100")
cells也是一个常用的单元格表示方法,它和Range在表示单元格时有什么共同点和区别呢?
Range可以表示单元格,也可以表示单元格区域cells也是这样,但除了cells作为一外集合对象外其他只能表示一个独立的单元格,如:
Cells.select 选取工作表所有单元格
Cells(2,2).select 选取B2单元格
所以在表示单元格区域时,除表示全部单元格外,其他均需用Range来表示如:range("a1:b20").
offset 是单元格或单元格区域的移动 offset (移动行数,移动列数)
resize 是单元格或单元格区域的行数和列数重新设置后范围大小 resize (变动后行数,变动后列数)
例:
Range("A1:B2").Select
选取A1:B2区域
Range("A1:B2").Offset(3, 0).Select
A1:B2区域向下移动三行,结果是选中A4:B5区域
Range("A1:B2").Resize(2, 4).Select
A1:B2区域重新设置,行数为2,列数为4, 结果为选取A1:D2
Range("A1:B2").Resize(Range("A1:B2").Rows.Count + 2, Range("A1:B2").Columns.Count + 4).Select
A1:B2区域重新设置,在原来行数的基础上加2行,在原来列数的基础上加4列,运行结果为:结果是选取A1:F4