楼主 kevinchengcw |
附件工作簿列数了常用事件和方法,也包含了一些小的例程,供VBA初学者入门使用。 来源为网络收集,本人只是做了些整合的工作,在此感谢原创作者,这个东西对我帮助很大。 一簿打尽常用对象属性、vba函数(大全)超链接版.rar |
2楼 kevinchengcw |
再来一批 VBA语句集 定制模块行为 (1) Option Explicit '强制对模块内所有变量进行声明 Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示 Option Compare Text '字符串不区分大小写 Option Base 1 '指定数组的第一个下标为1 (2) On Error Resume Next '忽略错误继续执行VBA代码,避免出现错误消息 (3) On Error GoTo ErrorHandler '当错误发生时跳转到过程中的某个位置 (4) On Error GoTo 0 '恢复正常的错误提示 (5) Application.DisplayAlerts=False '在程序执行过程中使出现的警告框不显示 (6) Application.ScreenUpdating=False '关闭屏幕刷新 Application.ScreenUpdating=True '打开屏幕刷新 (7) Application.Enable.CancelKey=xlDisabled '禁用Ctrl+Break中止宏运行的功能 工作簿 (8) Workbooks.Add() '创建一个新的工作簿 (9) Workbooks("book1.xls").Activate '激活名为book1的工作簿 (10) ThisWorkbook.Save '保存工作簿 (11) ThisWorkbook.close '关闭当前工作簿 (12) ActiveWorkbook.Sheets.Count '获取活动工作薄中工作表数 (13) ActiveWorkbook.name '返回活动工作薄的名称 (14) ThisWorkbook.Name '返回当前工作簿名称 ThisWorkbook.FullName '返回当前工作簿路径和名称 (15) ActiveWindow.EnableResize=False '禁止调整活动工作簿的大小 (16) Application.Window.Arrange xlArrangeStyleTiled '将工作簿以平铺方式排列 (17) ActiveWorkbook.WindowState=xlMaximized '将当前工作簿最大化 工作表 (18) ActiveSheet.UsedRange.Rows.Count '当前工作表中已使用的行数 (19) Rows.Count '获取工作表的行数(注:考虑向前兼容性) (20) Sheets(Sheet1).Name= "Sum" '将Sheet1命名为Sum (21) ThisWorkbook.Sheets.Add Before:=Worksheets(1) '添加一个新工作表在第一工作表前 (22) ActiveSheet.Move After:=ActiveWorkbook. _ Sheets(ActiveWorkbook.Sheets.Count) '将当前工作表移至工作表的最后 (23) Worksheets(Array("sheet1","sheet2")).Select '同时选择工作表1和工作表2 (24) Sheets("sheet1").Delete或 Sheets(1).Delete '删除工作表1 (25) ActiveWorkbook.Sheets(i).Name '获取工作表i的名称 (26) ActiveWindow.DisplayGridlines=Not ActiveWindow.DisplayGridlines '切换工作表中的网格线显示,这种方法也可以用在其它方面进行相互切换,即相当于开关按钮 (27) ActiveWindow.DisplayHeadings=Not ActiveWindow.DisplayHeadings '切换工作表中的行列边框显示 (28) ActiveSheet.UsedRange.FormatConditions.Delete '删除当前工作表中所有的条件格式 (29) Cells.Hyperlinks.Delete '取消当前工作表所有超链接 (30) ActiveSheet.PageSetup.Orientation=xlLandscape 或ActiveSheet.PageSetup.Orientation=2 '将页面设置更改为横向 (31) ActiveSheet.PageSetup.RightFooter=ActiveWorkbook.FullName '在页面设置的表尾中输入文件路径 ActiveSheet.PageSetup.LeftFooter=Application.UserName '将用户名放置在活动工作表的页脚 单元格/单元格区域 shaps(n).topleftcell 判断图片是否在指定单元格上 (32) ActiveCell.CurrentRegion.Select 或Range(ActiveCell.End(xlUp),ActiveCell.End(xlDown)).Select '选择当前活动单元格所包含的范围,上下左右无空行 (33) Cells.Select '选定当前工作表的所有单元格 (34) Range("A1").ClearContents '清除活动工作表上单元格A1中的内容 Selection.ClearContents '清除选定区域内容 Range("A1:D4").Clear '彻底清除A1至D4单元格区域的内容,包括格式 (35) Cells.Clear '清除工作表中所有单元格的内容 (36) ActiveCell.Offset(1,0).Select '活动单元格下移一行,同理,可下移一列 (37) Range("A1").Offset(ColumnOffset:=1)或Range("A1").Offset(,1) '偏移一列 Range("A1").Offset(Rowoffset:=-1)或Range("A1").Offset(-1) '向上偏移一行 (38) Range("A1").Copy Range("B1") '复制单元格A1,粘贴到单元格B1中 Range("A1:D8").Copy Range("F1") '将单元格区域复制到单元格F1开始的区域中 Range("A1:D8").Cut Range("F1") '剪切单元格区域A1至D8,复制到单元格F1开始的区域中 Range("A1").CurrentRegion.Copy Sheets("Sheet2").Range("A1") '复制包含A1的单元格区域到工作表2中以A1起始的单元格区域中 注:CurrentRegion属性等价于定位命令,由一个矩形单元格块组成,周围是一个或多个空行或列 (39) ActiveWindow.RangeSelection.Value=XX '将值XX输入到所选单元格区域中 (40) ActiveWindow.RangeSelection.Count '活动窗口中选择的单元格数 (41) Selection.Count '当前选中区域的单元格数 (42) GetAddress=Replace(Hyperlinkcell.Hyperlinks(1).Address,mailto:,"") '返回单元格中超级链接的地址并赋值 (43) TextColor=Range("A1").Font.ColorIndex '检查单元格A1的文本颜色并返回颜色索引 Range("A1").Interior.ColorIndex '获取单元格A1背景色 (44) cells.count '返回当前工作表的单元格数 (45) Selection.Range("E4").Select '激活当前活动单元格下方3行,向右4列的单元格 (46) Cells.Item(5,"C") '引单元格C5 Cells.Item(5,3) '引单元格C5 (47) Range("A1").Offset(RowOffset:=4,ColumnOffset:=5) 或 Range("A1").Offset(4,5) '指定单元格F5 (48) Range("B3").Resize(RowSize:=11,ColumnSize:=3) Rnage("B3").Resize(11,3) '创建B3:D13区域 (49) Range("Data").Resize(,2) '将Data区域扩充2列 (50) Union(Range("Data1"),Range("Data2")) '将Data1和Data2区域连接 (51) Intersect(Range("Data1"),Range("Data2")) '返回Data1和Data2区域的交叉区域 (52) Range("Data").Count '单元格区域Data中的单元格数 Range("Data"). Columns.Count '单元格区域Data中的列数 Range("Data"). Rows.Count '单元格区域Data中的行数 (53) Selection.Columns.Count '当前选中的单元格区域中的列数 Selection.Rows.Count '当前选中的单元格区域中的行数 (54) Selection.Areas.Count '选中的单元格区域所包含的区域数 (55) ActiveSheet.UsedRange.Row '获取单元格区域中使用的第一行的行号 (56) Rng.Column '获取单元格区域Rng左上角单元格所在列编号 (57) ActiveSheet.Cells.SpecialCells(xlCellTypeAllFormatConditions) '在活动工作表中返回所有符合条件格式设置的区域 (58) Range("A1").AutoFilter Field:=3,VisibleDropDown:=False '关闭由于执行自动筛选命令产生的第3个字段的下拉列表 名称 (59) Range("A1:C3").Name="computer" '命名A1:C3区域为computer 或Range("D1:E6").Name="Sheet1!book" '命名局部变量,即Sheet1上区域D1:E6为book 或 Names("computer").Name="robot" '将区域computer重命名为robot (60) Names("book").Delete '删除名称 (61) Names.Add Name:="ContentList",_ RefersTo:="=OFFSET(Sheet1!A2,0,0,COUNTA(Sheet2!$A:$A))" '动态命名列 (62) Names.Add Name:="Company",RefersTo:="CompanyCar" '命名字符串CompanyCar (63) Names.Add Name:="Total",RefersTo:=123456 '将数字123456命名为Total。注意数字不能加引号,否则就是命名字符串了。 (64) Names.Add Name:="MyArray",RefersTo:=ArrayNum '将数组ArrayNum命名为MyArray。 (65) Names.Add Name:="ProduceNum",RefersTo:="=$B$1",Visible:=False '将名称隐藏 (66) ActiveWorkbook.Names("Com").Name '返回名称字符串 公式与函数 (67) Application.WorksheetFunction.IsNumber("A1") '使用工作表函数检查A1单元格中的数据是否为数字 (68) Range("A:A").Find(Application.WorksheetFunction.Max(Range("A:A"))).Activate '激活单元格区域A列中最大值的单元格 (69) Cells(8,8).FormulaArray="=SUM(R2C[-1]:R[-1]C[-1]*R2C:R[-1]C)" '在单元格中输入数组公式。注意必须使用R1C1样式的表达式 图表 (70) ActiveSheet.ChartObjects.Count '获取当前工作表中图表的个数 (71) ActiveSheet.ChartObjects("Chart1").Select '选中当前工作表中图表Chart1 (72) ActiveSheet.ChartObjects("Chart1").Activate ActiveChart.ChartArea.Select '选中当前图表区域 (73) WorkSheets("Sheet1").ChartObjects("Chart2").Chart. _ ChartArea.Interior.ColorIndex=2 '更改工作表中图表的图表区的颜色 (74) Sheets("Chart2").ChartArea.Interior.ColorIndex=2 '更改图表工作表中图表区的颜色 (75) Charts.Add '添加新的图表工作表 (76) ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:D5"), _ PlotBy:=xlColumns '指定图表数据源并按列排列 (77) ActiveChart.Location Where:=xlLocationAsNewSheet '新图表作为新图表工作表 (78) ActiveChart.PlotArea.Interior.ColorIndex=xlNone '将绘图区颜色变为白色 (79) WorkSheets("Sheet1").ChartObjects(1).Chart. _ Export FileName:="C:MyChart.gif",FilterName:="GIF" '将图表1导出到C盘上并命名为MyChart.gif 窗体 (80) MsgBox "Hello!" '消息框中显示消息Hello (81) Ans=MsgBox("Continue?",vbYesNo) '在消息框中点击"是"按钮,则Ans值为vbYes;点击"否"按钮,则Ans值为vbNo。 If MsgBox("Continue?",vbYesNo)<>vbYes Then Exit Sub '返回值不为"是",则退出 (82) Config=vbYesNo+vbQuestion+vbDefaultButton2 '使用常量的组合,赋值组Config变量,并设置第二个按钮为缺省按钮 (83) MsgBox "This is the first line." & vbNewLine & "Second line." '在消息框中强制换行,可用vbCrLf代替vbNewLine。 (84) MsgBox "the average is :"&Format(Application.WorksheetFunction.Average(Selection),"#,##0.00"),vbInformation, "selection count average" & Chr(13) '应用工作表函数返回所选区域的平均值并按指定格式显示 (85) Userform1.Show '显示用户窗体 (86) Load Userform1 '加载一个用户窗体,但该窗体处于隐藏状态 (87) Userform1.Hide '隐藏用户窗体 (88) Unload Userform1 或 Unload Me '卸载用户窗体 (89) (图像控件).Picture=LoadPicture("图像路径") '在用户窗体中显示图形 (90) UserForm1.Show 0 或 UserForm1.Show vbModeless '将窗体设置为无模式状态 (91) Me.Height=Int(0.88*ActiveWindow.Height) '窗体高度为当前活动窗口高度的0.88 Me.Width=Int(0.88*ActiveWindow.Width) '窗体宽度为当前活动窗口高度的0.88 事件 (92) Application.EnableEvents=False '禁用所有事件 Application.EnableEvents=True '启用所有事件 注:不适用于用户窗体控件触发的事件 对象 (93) Set ExcelSheet = CreateObject("Excel.Sheet") '创建一个Excel工作表对象 ExcelSheet.Application.Visible = True '设置 Application 对象使 Excel 可见 ExcelSheet.Application.Cells(1, 1).Value = "Data" '在表格的第一个单元中输入文本 ExcelSheet.SaveAs "C:\TEST.XLS" '将该表格保存到C:\test.xls 目录 ExcelSheet.Application.Quit '关闭 Excel Set ExcelSheet = Nothing '释放该对象变量 (94) '声明并创建一个Excel对象引用 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.WorkSheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) (95) '创建并传递一个 Excel.Application 对象的引用 Call MySub (CreateObject("Excel.Application")) (96) Set d = CreateObject(Scripting.Dictionary) '创建一个 Dictionary 对象变量 (97) d.Add "a", "Athens" '为对象变量添加关键字和条目 其他 (98) Application.OnKey "^I","macro" '设置Ctrl+I键为macro过程的快捷键 (99) Application.CutCopyMode=False '退出剪切/复制模式 (100) Application.Volatile True '无论何时工作表中任意单元格重新计算,都会强制计算该函数 Application.Volatile False '只有在该函数的一个或多个参数发生改变时,才会重新计算该函数 定制模块行为 (101) Err.Clear '清除程序运行过程中所有的错误 ******************************************************* 工作簿 (102) ThisWorkbook.BuiltinDocumentProperties("Last Save Time") 或Application.Caller.Parent.Parent.BuiltinDocumentProperties("Last Save Time") '返回上次保存工作簿的日期和时间 (103) ThisWorkbook.BuiltinDocumentProperties("Last Print Date") 或Application.Caller.Parent.Parent.BuiltinDocumentProperties("Last Print Date") '返回上次打印或预览工作簿的日期和时间 (104) Workbooks.Close '关闭所有打开的工作簿 (105) ActiveWorkbook.LinkSources(xlExcelLinks)(1) '返回当前工作簿中的第一条链接 (106) ActiveWorkbook.CodeName ThisWorkbook.CodeName '返回工作簿代码的名称 (107) ActiveWorkbook.FileFormat ThisWorkbook.FileFormat '返回当前工作簿文件格式代码 (108) ThisWorkbook.Path ActiveWorkbook.Path '返回当前工作簿的路径(注:若工作簿未保存,则为空) (109) ThisWorkbook.ReadOnly ActiveWorkbook.ReadOnly '返回当前工作簿的读/写值(为False) (110) ThisWorkbook.Saved ActiveWorkbook.Saved '返回工作簿的存储值(若已保存则为False) (111) Application.Visible = False '隐藏工作簿 Application.Visible = True '显示工作簿 注:可与用户窗体配合使用,即在打开工作簿时将工作簿隐藏,只显示用户窗体.可设置控制按钮控制工作簿可见 ******************************************************* 工作表 (112) ActiveSheet.Columns("B").Insert '在A列右侧插入列,即插入B列 ActiveSheet.Columns("E").Cut ActiveSheet.Columns("B").Insert '以上两句将E列数据移至B列,原B列及以后的数据相应后移 ActiveSheet.Columns("B").Cut ActiveSheet.Columns("E").Insert '以上两句将B列数据移至D列,原C列和D列数据相应左移一列 (113) ActiveSheet.Calculate '计算当前工作表 (114) ThisWorkbook.Worksheets("sheet1").Visible=xlSheetHidden '正常隐藏工作表,同在Excel菜单中选择"格式——工作表——隐藏"操作一样 ThisWorkbook.Worksheets("sheet1").Visible=xlSheetVeryHidden '隐藏工作表,不能通过在Excel菜单中选择"格式——工作表——取消隐藏"来重新显示工作表 ThisWorkbook.Worksheets("sheet1").Visible=xlSheetVisible '显示被隐藏的工作表 (115) ThisWorkbook.Sheets(1).ProtectContents '检查工作表是否受到保护 (116) ThisWorkbook.Worksheets.Add Count:=2, _ Before:=ThisWorkbook.Worksheets(2) 或 ThisWorkbook.Workshees.Add ThisWorkbook.Worksheets(2), , 2 '在第二个工作表之前添加两个新的工作表 (117) ThisWorkbook.Worksheets(3).Copy '复制一个工作表到新的工作簿 (118) ThisWorkbook.Worksheets(3).Copy ThisWorkbook.Worksheets(2) '复制第三个工作表到第二个工作表之前 (119) ThisWorkbook.ActiveSheet.Columns.ColumnWidth = 20 '改变工作表的列宽为20 ThisWorkbook.ActiveSheet.Columns.ColumnWidth = _ ThisWorkbook.ActiveSheet.StandardWidth '将工作表的列宽恢复为标准值 ThisWorkbook.ActiveSheet.Columns(1).ColumnWidth = 20 '改变工作表列1的宽度为20 (120) ThisWorkbook.ActiveSheet.Rows.RowHeight = 10 '改变工作表的行高为10 ThisWorkbook.ActiveSheet.Rows.RowHeight = _ ThisWorkbook.ActiveSheet.StandardHeight '将工作表的行高恢复为标准值 ThisWorkbook.ActiveSheet.Rows(1).RowHeight = 10 '改变工作表的行1的高度值设置为10 (121) ThisWorkbook.Worksheets(1).Activate '当前工作簿中的第一个工作表被激活 (122) ThisWorkbook.Worksheets("Sheet1").Rows(1).Font.Bold = True '设置工作表Sheet1中的行1数据为粗体 (123) ThisWorkbook.Worksheets("Sheet1").Rows(1).Hidden = True '将工作表Sheet1中的行1隐藏 ActiveCell.EntireRow.Hidden = True '将当前工作表中活动单元格所在的行隐藏 注:同样可用于列。 (124) ActiveSheet.Range("A:A").EntireColumn.AutoFit '自动调整当前工作表A列列宽 (125) ActiveSheet.Cells.SpecialCells(xlCellTypeConstants,xlTextValues) '选中当前工作表中常量和文本单元格 ActiveSheet.Cells.SpecialCells(xlCellTypeConstants,xlErrors+xlTextValues) '选中当前工作表中常量和文本及错误值单元格 ******************************************************* 公式与函数 (126) Application.MacroOptions Macro:="SumPro",Category:=4 '将自定义的SumPro函数指定给Excel中的"统计函数"类别 (127) Application.MacroOptions Macro:="SumPro", _ Description:="First Sum,then Product" '为自定义函数SumPro进行了功能说明 (128) Application.WorksheetFunction.CountA(Range("A:A"))+1 '获取A列的下一个空单元格 (129) WorksheetFunction.CountA(Cell.EntireColumn) '返回该单元格所在列非空单元格的数量 WorksheetFunction.CountA(Cell.EntireRow) '返回该单元格所在行非空单元格的数量 (130) WorksheetFunction.CountA(Cells) '返回工作表中非空单元格数量 (131) ActiveSheet.Range("A20:D20").Formula="=Sum(R[-19]C:R[-1]C"’对A列至D列前19个数值求和 ******************************************************* 图表 (132) ActiveWindow.Visible=False 或 ActiveChart.Deselect '使图表处于非活动状态 (133) TypeName(Selection)="Chart" '若选中的为图表,则该语句为真,否则为假 (134) ActiveSheet.ChartObjects.Delete '删除工作表上所有的ChartObject对象 ActiveWorkbook.Charts.Delete '删除当前工作簿中所有的图表工作表 ******************************************************* 窗体和控件 (135) UserForms.Add(MyForm).Show '添加用户窗体MyForm并显示 (136)TextName.SetFocus '设置文本框获取输入焦点 (137) SpinButton1.Value=0 '将数值调节钮控件的值改为0 (138) TextBox1.Text=SpinButton1.Value '将数值调节钮控件的值赋值给文本框控件 SpinButton1.Value=Val(TextBox1.Text) '将文本框控件值赋给数值调节钮控件 CStr(SpinButton1.Value)=TextBox1.Text '数值调节钮控件和文本框控件相比较 (139) UserForm1.Controls.Count '显示窗体UserForm1上的控件数目 (140) ListBox1.AddItem "Command1" '在列表框中添加Command1 (141) ListBox1.ListIndex '返回列表框中条目的值,若为-1,则表明未选中任何列表框中的条目 (142) RefEdit1.Text '返回代表单元格区域地址的文本字符串 RefEdit1.Text=ActiveWindow.RangeSelection.Address '初始化RefEdit控件显示当前所选单元格区域 Set FirstCell=Range(RefEdit1.Text).Range("A1") '设置某单元格区域左上角单元格 (143) Application.OnTime Now + TimeValue("00:00:15"), "myProcedure" '等待15秒后运行myProcedure过程 (144) ActiveWindow.ScrollColumn=ScrollBarColumns.Value '将滚动条控件的值赋值给ActiveWindow对象的ScrollColumn属性 ActiveWindow.ScrollRow=ScrollBarRows.Value '将滚动条控件的值赋值给ActiveWindow对象的ScrollRow属性 (145) UserForm1.ListBox1.AddItem Sheets("Sheet1").Cells(1,1) '将单元格A1中的数据添加到列表框中 ListBox1.List=Product '将一个名为Product数组的值添加到ListBox1中 ListBox1.RowSource="Sheet2!SumP" '使用工作表Sheet2中的SumP区域的值填充列表框 (146) ListBox1.Selected(0) '选中列表框中的第一个条目(注:当列表框允许一次选中多个条目时,必须使用Selected属性) (147) ListBox1.RemoveItem ListBox1.ListIndex '移除列表框中选中的条目 (147-1)TextBox1.Text = VBA.UCase$(TextBox1.Text)’将TEXTBOX里的字母自动变成大写 ******************************************************* 对象 Application对象 (148) Application.UserName '返回应用程序的用户名 (149) Application.Caller '返回代表调用函数的单元格 (150) Application.Caller.Parent.Parent '返回调用函数的工作簿名称 (151) Application.StatusBar="请等待……" '将文本写到状态栏 Application.StatusBar="请等待……" & Percent & "% Completed" '更新状态栏文本,以变量Percent代表完成的百分比 Application.StatusBar=False '将状态栏重新设置成正常状态 (152) Application.Goto Reference:=Range("A1:D4") '指定单元格区域A1至D4,等同于选择"编辑——定位",指定单元格区域为A1至D4,不会出现"定位"对话框 (153) Application.Dialogs(xlDialogFormulaGoto).Show '显示"定位"对话框,但定位条件按钮无效 (154) Application.Dialogs(xlDialogSelectSpecial).Show '显示"定位条件"对话框 (155) Application.Dialogs(xlDialogFormatNumber).show '显示"单元格格式"中的"数字"选项卡 Application.Dialogs(xlDialogAlignment).show '显示"单元格格式"中的"对齐"选项卡 Application.Dialogs(xlDialogFontProperties).show '显示"单元格格式"中的"字体"选项卡 Application.Dialogs(xlDialogBorder).show '显示"单元格格式"中的"边框"选项卡 Application.Dialogs(xlDialogPatterns).show '显示"单元格格式"中的"图案"选项卡 Application.Dialogs(xlDialogCellProtection).show '显示"单元格格式"中的"保护"选项卡 注:无法一次显示带选项卡的"单元格格式"对话框,只能一次显示一个选项卡。 (156) Application.Dialogs(xlDialogFormulaGoto).show Range("b2"), True '显示"引用位置"的默认单元格区域并显示引用使其出现在窗口左上角(注:内置对话框参数的使用) (157) Application.CommandBars(1).Controls(2).Controls(16).Execute '执行"定位"话框,相当于选择菜单"编辑——定位"命令 (158) Application.Transpose(Array("Sun","Mon","Tur","Wed","Thu","Fri","Sat")) '返回一个垂直的数组 (159) Application.Version '返回使用的Excel版本号 (160) Application.Cursor = xlNorthwestArrow '设置光标形状为北西向箭头 Application.Cursor = xlIBeam '设置光标形状为Ⅰ字形 Application.Cursor = xlWait '设置光标形状为沙漏(等待)形 Application.Cursor = xlDefault '恢复光标的默认设置 (161) Application.WindowState '返回窗口当前的状态 Application.WindowState = xlMinimized '窗口最小化 Application.WindowState = xlMaximized '窗口最大化 Application.WindowState = xlNormal '窗口正常状态 (162) Application.UsableHeight '获取当前窗口的高度 Application.UsableWidth '获取当前窗口的宽度 (163) Application.ActiveCell.Address '返回活动单元格的地址(注:返回的是绝对地址) (164) Application.ActivePrinter '返回当前打印机的名称 (165) Application.ActiveSheet.Name '返回活动工作表的名称 (166) Application.ActiveWindow.Caption '返回活动窗口的标题 (167) Application.ActiveWorkbook.Name '返回活动工作簿的名称 (168) Application.Selection.Address '返回所选区域的地址 (169) Application.ThisWorkbook.Name '返回当前工作簿的名称 (170) Application.CalculationVersion '返回Excel计算引擎版本(右边四位数字)及Excel版本(左边两位数字) (171) Application.MemoryFree '以字节为单位返回Excel允许使用的内存数(不包括已经使用的内存) (172) Application.MemoryUsed '以字节为单位返回Excel当前使用的内存数 (173) Application.MemoryTotal '以字节为单位返回Excel可以使用的内存数(包括已使用的内存,是MemoryFree和MemoryUsed的总和) (174) Application.OperatingSystem '返回所使用的操作系统的名称和版本 (175) Application.OrganizationName '返回Excel产品登记使用的组织机构的名称 (176) Application.FindFormat '查找的格式种类 Application.ReplaceFormat '替换查找到的内容的格式种类 ActiveSheet.Cells.Replace What:=" ", _ Replacement:=" ",SearchFormat:=True,ReplaceFormat:=True '替换查找到的格式 (177) Application.Interactive=False '忽略键盘或鼠标的输入 (178) Application.Evaluate("Rate") '若在工作表中定义了常量0.06的名称为"Rate",则本语句将返回值0.06 (179) Application.OnUndo "Undo Option","Undo Procedure" '选择UndoOption后,将执行Undo Procedure过程 ******************************************************* Range对象 (180) Range(A1:A10).Value=Application.WorksheetFunction.Transpose(MyArray) '将一个含有10个元素的数组转置成垂直方向的工作表单元格区域(A1至A10) 注:因为当把一维数组的内容传递给某个单元格区域时,该单元格区域中的单元格必须是水平方向的,即含有多列的一行。若必须使用垂直方向的单元格区域,则必须先将数组进行转置,成为垂直的。 (181) Range("A65536").End(xlUp).Row+1 '返回A列最后一行的下一行 (182) rng.Range("A1") '返回区域左上角的单元格 (183) cell.Parent.Parent.Worksheets '访问当前单元格所在的工作簿 (184) Selection.Font.Bold=Not Selection.Font.Bold '切换所选单元格是否加粗 (185) ActiveSheet.Range("A:B").Sort Key1:=Columns("B"), Key2:=Columns("A"), _ Header:=xlYes '两个关键字排序,相邻两列,B列为主关键字,A列为次关键字,升序排列 (186) cell.Range("A1").NumberFormat '显示单元格或单元格区域中的第一个单元格的数字格式 (187) cell.Range("A1").HasFormula '检查单元格或单元格区域中的第一个单元格是否含有公式 或cell.HasFormula '工作表中单元格是否含有公式 (188) Cell.EntireColumn '单元格所在的整列 Cell.EntireRow '单元格所在的整行 (189) rng.Name.Name '显示rng区域的名称 (190) rng.Address '返回rng区域的地址 (191) cell.Range("A1").Formula '返回包含在rng区域中左上角单元格中的公式。 注:若在一个由多个单元格组成的范围内使用Formula属性,会得到错误;若单元格中没有公式,会得到一个字符串,在公式栏中显示该单元格的值。 (192) Range("D5:D10").Cells(1,1) '返回单元格区域D5:D10中左上角单元格 (193) ActiveCell.Row '活动单元格所在的行数 ActiveCell.Column '活动单元格所在的列数 (194) Range("A1:B1").HorizontalAlignment = xlLeft '当前工作表中的单元格区域数据设置为左对齐 (195) ActiveSheet.Range("A2:A10").NumberFormat="#,##0" '设置单元格区域A2至A10中数值格式 (196) rng.Replace " ","0" '用0替换单元格区域中的空单元格 ******************************************************* Collection与object (197) Dim colMySheets As New Collection Public colMySheets As New Collection '声明新的集合变量 (198) Set MyRange=Range("A1:A5") '创建一个名为MyRange的对象变量 (199) <object>.Add Cell.Value CStr(Cell.Value) '向集合中添加惟一的条目(即将重复的条目忽略) ******************************************************* Windows API (200) Declare Function GetWindowsDirectoryA Lib "kernel32" _ (ByVal lpBuffer As String,ByVal nSize As Long) As Long 'API函数声明。返回安装Windows所在的目录名称,调用该函数后,安装Windows的目录名称将在第一个参数lpBuffer中,该目录名称的字符串长度包含在第二个参数nSize中 (201) Set objExcel = CreateObject("Excel.Application") objExcel.Workbooks.Add '创建Excel工作簿 (202) Application.ActivateMicrosoftApp xlMicrosoftWord '开启Word应用程序 (203) Application.TemplatesPath '获取工作簿模板的位置 (204) Application.Calculation = xlCalculationManual '设置工作簿手动计算 Application.Calculation = xlCalculationAutomatic '工作簿自动计算 (205) Worksheets(1).EnableCalculation = False '不对第一张工作表自动进行重算 (206) Application.CalculateFull '重新计算所有打开的工作簿中的数据 (207) Application.RecentFiles.Maximum = 5 '将最近使用的文档列表数设为5 (208) Application.RecentFiles(4).Open '打开最近打开的文档中的第4个文档 (209) Application.OnTime DateSerial(2006,6,6)+Timue("16:16:16"),"BaoPo" '在2006年6月6日的16:16:16开始运行BaoPo过程 (210) Application.Speech.Speak ("Hello" & Application.UserName) '播放声音,并使用用户的姓名问候用户 (211) MsgBox Application.PathSeparator '获取"\"号 (212) MsgBox Application.International(xlCountrySetting) '返回应用程序当前所在国家的设置信息 (213) Application.AutoCorrect.AddReplacement "葛洲坝", "三峡" '自动将在工作表中进行输入的"葛洲坝"更正为"三峡" (214) Beep '让计算机发出声音 (215) Err.Number '返回错误代码 (216) MsgBox IMEStatus '获取输入法状态 (217) Date = #6/6/2006# Time = #6:16:16 AM# '将系统时间更改为2006年6月6日上午6时16分16秒 (218) Application.RollZoom = Not Application.RollZoom '切换是否能利用鼠标中间的滑轮放大/缩小工作表 (219) Application.ShowWindowsInTaskba = True '显示任务栏中的窗口,即各工作簿占用各自的窗口 (220) Application.DisplayScrollBars = True '显示窗口上的滚动条 (221) Application.DisplayFormulaBar = Not Application.DisplayFormulaBar '切换是否显示编辑栏 (222) Application.Dialogs(xlDialogPrint).Show '显示打印内容对话框 (223) Application.MoveAfterReturnDirection = xlToRight '设置按Enter键后单元格的移动方向向右 (224) Application.FindFile '显示打开对话框 (225) ThisWorkbook.FollowHyperlink (226) ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly '将当前工作簿设置为只读 (227) ActiveWorkbook.AddToFavorites '将当前工作簿添加到收藏夹文件夹中 (228) ActiveSheet.CheckSpelling '在当前工作表中执行"拼写检查" (229) ActiveSheet.Protect userinte**ceonly:=True '保护当前工作表 (230) ActiveSheet.PageSetup.LeftHeader = ThisWorkbook.FullName '在当前工作表的左侧页眉处打印出工作簿的完整路径和文件名 (231) Worksheets("Sheet1").Range("A1:G37").Locked = False Worksheets("Sheet1").Protect '解除对工作表Sheet1中A1:G37区域单元格的锁定 '以便当该工作表受保护时也可对这些单元格进行修改 (232) Worksheets("Sheet1").PrintPreview '显示工作表sheet1的打印预览窗口 (233) ActiveSheet.PrintPreview Enablechanges:=False '禁用显示在Excel的"打印预览"窗口中的"设置"和"页边距"按钮 (234) ActiveSheet.PageSetup.PrintGridlines = True '在打印预览中显示网格线 ActiveSheet.PageSetup.PrintHeadings = True '在打印预览中显示行列编号 (235) ActiveSheet.ShowDataForm '开启数据记录单 (236) Worksheets("Sheet1").Columns("A").Replace _ What:="SIN", Replacement:="COS", _ SearchOrder:=xlByColumns, MatchCase:=True '将工作表sheet1中A列的SIN替换为COS (237) Rows(2).Delete '删除当前工作表中的第2行 Columns(2).Delete '删除当前工作表中的第2列 (238) ActiveWindow.SelectedSheets.VPageBreaks.Add before:=ActiveCell '在当前单元格左侧插入一条垂直分页符 ActiveWindow.SelectedSheets.HPageBreaks.Add before:=ActiveCell '在当前单元格上方插入一条垂直分页符 (239) ActiveWindow.ScrollRow = 14 '将当前工作表窗口滚动到第14行 ActiveWindow.ScrollColumn = 13 '将当前工作表窗口滚动到第13列 (240) ActiveWindow.Close '关闭当前窗口 (241) ActiveWindow.Panes.Count '获取当前窗口中的窗格数 (242) Worksheets("sheet1").Range("A1:D2").CreateNames Top:=True '将A2至D2的单元格名称设定为A1到D1单元格的内容 (243) Application.AddCustomList listarray:=Range("A1:A8") '自定义当前工作表中单元格A1至A8中的内容为自动填充序列 (244) Worksheets("sheet1").Range("A1:B2").CopyPicture xlScreen, xlBitmap '将单元格A1至B2的内容复制成屏幕快照 (245) Selection.Hyperlinks.Delete '删除所选区域的所有链接 Columns(1).Hyperlinks.Delete '删除第1列中所有的链接 Rows(1).Hyperlinks.Delete '删除第1行中所有的链接 Range("A1:Z30").Hyperlinks.Delete '删除指定范围所有的链接 (246) ActiveCell.Hyperlinks.Add Anchor:=ActiveCell, _ Address:="C:\Windows\System32\Calc.exe", ScreenTip:="按下我,就会开启Windows计算器", TextToDisplay:="Windows计算器" '在活动单元格中设置开启Windows计算器链接 (247) ActiveCell.Value = Shell("C:\Windows\System32\Calc.exe", vbNormalFocus) '开启Windows计算器 (248) ActiveSheet.Rows(1).AutoFilter '打开自动筛选。若再运行一次,则关闭自动筛选 (249) Selection.Autofilter '开启/关闭所选区域的自动筛选 (250) ActiveSheet.ShowAllData '关闭自动筛选 (251) ActiveSheet.AutoFilterMode '检查自动筛选是否开启,若开启则该语句返回True (252) ActiveSheet.Columns("A").ColumnDifferences(Compari son:=ActiveSheet. _ Range("A2")).Delete '在A列中找出与单元格A2内容不同的单元格并删除 (253) ActiveSheet.Range("A6").ClearNotes '删除单元格A6中的批注,包括声音批注和文字批注 (254) ActiveSheet.Range("B8").ClearComments '删除单元格B8中的批注文字 (255) ActiveSheet.Range("A1:D10").ClearFormats '清除单元格区域A1至D10中的格式 (256) ActiveSheet.Range("B2:D2").BorderAround ColorIndex:=5, _ Weight:=xlMedium, LineStyle:=xlDouble '将单元格B2至D2区域设置为蓝色双线 (257) Range("A1:B2").Item(2, 3)或Range("A1:B2")(2, 3) '引用单元格C2的数据 Range("A1:B2")(3) '引用单元格A2 (258) ActiveSheet.Cells(1, 1).Font.Bold = TRUE '设置字体加粗 ActiveSheet.Cells(1, 1).Font.Size = 24 '设置字体大小为24磅 ActiveSheet.Cells(1, 1).Font.ColorIndex = 3 '设置字体颜色为红色 ActiveSheet.Cells(1, 1).Font.Italic = TRUE '设置字体为斜体 ActiveSheet.Cells(1, 1).Font.Name = "Times New Roman" '设置字体类型 ActiveSheet.Cells(1, 1).Interior.ColorIndex = 3 '将单元格的背景色设置为红色 (259) ActiveSheet.Range("C2:E6").AutoFormat Format:=xlRangeAutoFormatColor3 '将当前工作表中单元格区域C2至E6格式自动调整为彩色3格式 (260) Cells.SpecialCells(xlCellTypeLastCell) '选中当前工作表中的最后一个单元格 (261) ActiveCell.CurrentArray.Select '选定包含活动单元格的整个数组单元格区域.假定该单元格在数据单元格区域中 (262) ActiveCell.NumberFormatLocal = "0.000; [红色] 0.000" '将当前单元格数字格式设置为带3位小数,若为负数则显示为红色 (263) IsEmpty (ActiveCell.Value) '判断活动单元格中是否有值 (264) ActiveCell.Value = LTrim(ActiveCell.Value) '删除字符串前面的空白字符 (265) Len(ActiveCell.Value) '获取活动单元格中字符串的个数 (266) ActiveCell.Value = UCase(ActiveCell.Value) '将当前单元格中的字符转换成大写 (267) ActiveCell.Value = StrConv(ActiveCell.Value, vbLowerCase) '将活动单元格中的字符串转换成小写 (268) ActiveSheet.Range("C1").AddComment '在当前工作表的单元格C1中添加批注 (269) Weekday(Date) '获取今天的星期,以数值表示,1-7分别对应星期日至星期六 (270) ActiveSheet.Range("A1").AutoFill Range(Cells(1, 1), Cells(10, 1)) '将单元格A1的数值填充到单元格A1至A10区域中 (271) DatePart("y", Date) '获取今天在全年中的天数 (272) ActiveCell.Value = DateAdd("yyyy", 2, Date) '获取两年后的今天的日期 (273) MsgBox WeekdayName(Weekday(Date)) '获取今天的星期数 (274) ActiveCell.Value = Year(Date) '在当前单元格中输入今年的年份数 ActiveCell.Value = Month(Date) '在当前单元格中输入今天所在的月份数 ActiveCell.Value = Day(Date) '在当前单元格中输入今天的日期数 (275) ActiveCell.Value = MonthName(1) '在当前单元格中显示月份的名称,本句为显示"一月" (276) ActiveCell.Value = Hour(Time) '在当前单元格中显示现在时间的小时数 ActiveCell.Value = Minute(Time) '在当前单元格中显示现在时间的分钟数 ActiveCell.Value = Second(Time) '在当前单元格中显示现在时间的秒数 (277) ActiveSheet.Shapes(1).Delete '删除当前工作表中的第一个形状 (278) ActiveSheet.Shapes.Count '获取当前工作表中形状的数量 (279) ActiveSheet.Shapes(1).TextEffect.ToggleVerticalTex t '改变当前工作表中第一个艺术字的方向 (280) ActiveSheet.Shapes(1).TextEffect.FontItalic = True '将当前工作表中第一个艺术字的字体设置为斜体 (281) ActiveSheet.Shapes.AddTextEffect(msoTextEffect21, "三峡", _ "Arial Black", 22#, msoFalse, msoFalse, 66#, 80).Select '在当前工作表中创建一个名为"三峡"的艺术字并对其进行格式设置和选中 (282) ActiveSheet.Shapes.AddLine(BeginX:=10, BeginY:=10, EndX:=250, _ EndY:=100).Select '在当前工作表中以(10,10)为起点(250,100)为终点画一条直线并选中 (283) ActiveSheet.Shapes.AddShape(Type:=msoShapeRightTri angle, _ Left:=70, Top:=40, Width:=130, Height:=72).Select '在当前工作表中画一个左上角在(70,40),宽为130高为72的三角形并选中 (284) ActiveSheet.Shapes.AddShape(Type:=msoShapeRectangl e, _ Left:=70, Top:=40, Width:=130, Height:=72).Select '在当前工作表中画一个以点(70,40)为起点,宽130高72的矩形并选中 (285) ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _ Left:=70, Top:=40, Width:=130, Height:=72).Select '在当前工作表中画一个左上角在(70,40),宽为130高为72的椭圆 (286) ActiveSheet.Shapes(1).Line.ForeColor.RGB = RGB(0, 0, 255) '将当前工作表中第一个形状的线条颜色变为蓝色 (287) ActiveSheet.Shapes(2).Fill.ForeColor.RGB = RGB(255, 0, 0) '将当前工作表中第2个形状的前景色设置为红色 (288) ActiveSheet.Shapes(1).Rotation = 20 '将当前工作表中的第1个形状旋转20度 (289) Selection.ShapeRange.Flip msoFlipHorizontal '将当前选中的形状水平翻转 Selection.ShapeRange.Flip msoFlipVertical '将当前选中的形状垂直翻转 (290) Selection.ShapeRange.ThreeD.SetThreeDFormat msoThreeD1 '将所选取的形状设置为第1种立体样式 (291) ActiveSheet.Shapes(1).ThreeD.Depth = 20 '将当前工作表中第一个立体形状的深度设置为20 (292) ActiveSheet.Shapes(1).ThreeD.ExtrusionColor.RGB = RGB(0, 0, 255) '将当前工作表中第1个立体形状的进深部分的颜色设为蓝色 (293) ActiveSheet.Shapes(1).ThreeD.RotationX = 60 '将当前工作表中的第1个立体形状沿X轴旋转60度 ActiveSheet.Shapes(1).ThreeD.RotationY = 60 '将当前工作表中的第1个立体形状沿Y轴旋转60度 (294) Selection.ShapeRange.ThreeD.Visible = msoFalse '将所选择的立体形状转换为平面形状 (295) Selection.ShapeRange.ConnectorFormat.BeginDisconne ct '在形状中让指定的连接符起点脱离原来所连接的形状 (296) ActiveSheet.Shapes(1).PickUp '复制当前工作表中形状1的格式 (297) ActiveSheet.Shapes.AddTextbox(msoTextOrientationHo rizontal, 260, 160, 180, 30). TextFrame.Characters.Text = "www.exceltip.net" '在工作簿中新建一个文本框并输入内容 (298) ActiveSheet.Shapes.AddLabel(msoTextOrientationHori zontal, 20, 80, 100, 200). TextFrame.Characters.Text = "www.exceltip.net" '在当前工作表中建立一个水平文本框并输入内容 (299) ActiveSheet.Shapes.AddPicture "d:\sx.jpg", True, True, 60, 20, 400, 300 '在当前工作表中插入一张d盘中名为sx的图片 (300) ActiveChart.ApplyCustomType xl3DArea '将当前图表类型改为三维面积图 |
3楼 kevinchengcw |
来两个手册型的 VBA常用技巧文件过大,采用分卷压缩的,如果想下单个文件也可到下面地址去下载(我的网盘): 再加上个基础的 VBA语法基础 - – - – - – - – - – - – - – - – - - 数据类型 “数据类型”是指如何将数据存储在内存中。 (1)Boolean 表示逻辑数据,可以是True或False中的任一个值。占用2字节的存储空间,取值范围为True或False,缺省值为False。 (2)Byte 只能表示正数。占用1字节的存储空间,取值范围为0-255,缺省值为0。 (3)Currency 一种保存货币值数据的特殊数字格式。占用8字节的存储空间,取值范围为-922337203685477.5808-922337203685477.5807,缺省值为0。 (4)Date 一种用于表示日期或时间的专用格式。占用8字节的存储空间,取值范围为100年1月1日——9999年12月31日,缺省值为00:00:00。(有关在VBA中使用日期和时间的详细介绍请见后面的一系列文章。) (5)Decimal 一种包含以10的幂为刻度的十进制数的变体子类型,只能通过CDec转换函数创建,不是一种独立的数据类型。占用14字节的存储空间,取值范围为±79228162514264337593543950335(不带小数点)或±7.9228162514264337593543950335(带28位小数点),缺省值为0。 (Decimal数据类型是在Excel 2000中引入的,在以前的版本中不能使用这种数据类型。该数据类型非常特殊,因为不能实际声明它,它是Variant的子类型,必须使用CDec函数将一个变量转换为Decimal数据类型) (6)Double 存储双精度浮点数,占用8字节的存储空间,取值范围为负值:-1.79769313486232E308——4.94065645841247E-324,正值:1.79769313486232E308——4.94065645841247E-324,缺省值为0。 (7)Integer 表示从-32768-32767之间的整数,其中一位表示符号,占用2字节的存储空间,缺省值为0。 (8)Long 表示存储为4个字节空间的带符号的数,其中一位表示符号,取值范围为-2147483648-2147483647,缺省值为0。 (9)Object 包含对某个对象的引用(地址),占用4字节的存储空间,可对任何对象引用,缺省值为Nothing。 (10)Single 表示分数、带小数位或指数的数值等单精度数,占用4字节的存储空间,取值范围为负值:-3.402823E38——1.401298E-45,正值:1.401298E-45——3.402823E38,缺省值为0。 (11)String 可声明定长和变长的String数据类型。其中,定长的String数据类型占用的存储空间为字符串的长度,取值范围为1——65400个字符,缺省值等于该字符串长度的空格数。变长的String数据类型能动态地加长或缩短以存储要求的字符串数,占用的存储空间为10字节加上字符串的长度,取值范围为0——20亿个字符,缺省值为零长字符串(“”)。(有关String数据类型及处理和操作字符串数据的VBA内置函数的详细介绍请见后面的一系列文章。) (12)Variant Variant字符串类型的存储空间为22字节加上字符串的长度,其取值范围与变长字符串数据类型的取值范围相同,缺省值为Empty。 Variant数字型的存储空间为16字节,其取值范围与Double数据类型的取值范围相同,缺省值为Empty。 (有关Variant数据类型的进一步介绍见后面的一系列文章。) (13)用户自定义类型 允许用户创建一种特殊的数据类型,这种数据类型由VBA的内部数据类型、数组、对象或其他用户定义类型组成,其存储空间为各个组成部分的存储空间的总和,取值范围与各个组成部分的数据类型的取值范围一致,缺省值为各个组成部分的缺省值。(有关用户自定义类型的进一步介绍请见后面的一系列文章。) 各数据类型之间也可以相互转换。(有关数据类型转换的详细介绍请见后面的一系列文章) (有关数字数据类型(Byte、Integer、Long、Single、Double、Currency、Decimal、Variant)及相应的VBA内置函数的详细介绍请见后面的一系列文章。) - – - – - – - – - – - – - – - – - - 常量(数) 常量即在程序执行过程中不发生改变的值或字符串。 使用Const语句声明常量。如: Const Rate=0.25 Const NumMonths As Integer=12 Public Const myName As String=”BabyPig” 而最后一个语句声明了一个公共常量,应放在模块中所有过程之前声明。 VBA自身包含有许多内置常数,它们的值都是VBA预先定义好的,使用内部常数时无需定义这些常数的值。 ■ 几个特殊的常数 由于有好几种不相同的“无效值”常数,VBA语言提供了好几种方法,以检验某个变量是否为empty或null值,或者设置某个变量为empty或null值。 (1) vbNull 和VarType函数一起使用,用于确定变量是否包含null。 (2) vbNullChar 赋值或检测null字符,null字符的值为Chr(0),即vbNullChar常数相当于将变量赋值为Chr(0),可用于检测变量,确定它的值是否是一个null字符。 (3) vbNullString 赋值或检测零长(空)字符串。 (4) Null关键字 将null值赋给variant变量后,可以通过调用IsNull函数来检测变量是否是Null值。 (5) vbEmpty 检测某个variant变量是否初始化。 (6) Nothing关键字 只能和对象变量一起使用,以确定变量是否具有有效的对象引用,此外,Nothing关键字还可以用于销毁当前的对象引用。 (关于常量的介绍还可见《ExcelVBA编程系列之数据类型(1):常量》) - – - – - – - – - – - – - – - – - - 变量 变量的主要作用是存取数据、提供了数据存放信息的容器。根据变量的作用域不同,可分为局部变量、全局变量,见后面的变量(常量)作用域和生存期介绍。 变量命名要注意以下几点: 1、有效性。变量以字母开头,中间可以出现数字和一些标点符号,除下划线( _ )作为连字符外,变量名称不能有空格、加号(+)、减号(-)、逗号(,)、句点(.)等符号。 2、VBA不区分大小写。但在变量命名时,最好体现该变量的作用 3、不能使用VBA中的关键字作为变量。 4、变量名称中不能有特殊类型的声明字符(#、$、%、&或!)。 5、变量名称最多可以包含254个字符。 (有关VBA的命名规则的详细介绍请见后面的一系列文章) - – - – - – - – - – - – - – - – - - 声明变量 其语法为: Dim <变量名> As <数据类型> 或:Private <变量名> As <数据类型> 或:Public <变量名> As <数据类型> 可以在一行中声明多个变量,每个变量之间用逗号分隔开。 还有一种声明变量的方法是,将一个字符加在变量名称后面,从而声明变量的数据类型。如 Dim MyVar% 表示将变量MyVar声明为整型。一些类型声明符为: 数据类型 类型声明字符 Integer % Long & Single ! Double # Currency @ String $ 在模块前加入Option Explicit语句,将强制声明所使用的所有变量。 - – - – - – - – - – - – - – - – - - 对象变量 在使用对象模型的属性、方法和事件之前,必须创建一个对包含所需属性、方法和事件的类的引用。可以先声明一个局部对象变量以存储该对象引用,然后把对象引用赋给该局部变量。 声明对象变量的方法和声明其他类型的变量基本上一样。有三种声明对象变量的方法: (1) Dim myObject As <库名>.<类名> 此方法指向类的类型库,但没有给该变量赋予任何类的实例。此时,变量myObject被赋值为Nothing。若要用这种方式引用类,就必须利用“引用”对话框向工程添加一个对类模块的引用。若要将类的实例引用赋予该变量,必须在使用该变量之前用Set语句赋值。如: Set myObject=<库名>.<类名> (2) Dim myObject As New <库名>.<类名> 此方法将类的新实例引用赋给Object变量。同样,要用这种方式引用类,必须先利用“引用”对话框向工程添加一个对类模块的引用。 (3) Dim myObject As Object 此方法将myObject变量声明为一般的Object数据类型,这在不能预先知道要创建的对象的数据类型时十分有用。此时,Object变量被赋值为Nothing。若要将对象引用赋值给该变量,必须使用CreateObject函数或GetObject函数。 可以用Private或Public语句替换Dim语句,且对象变量的作用域规则和其他类型的变量一样。 声明对象变量可以显著地简化代码且加快代码的执行速度。 有关对象模型的基础知识见ExcelVBA编程系列之对象模型(2):初步理解和使用Excel对象模型一文。 - – - – - – - – - – - – - – - – - - 集合(Collection)对象 集合对象是其他对象的一个容器。 一般有四个方法: (1) Add方法 添加一项到集合中。除了可以指定数据外还可以指定键值,通过键值可以访问集合中的成员。 (2) Count方法 返回集合中的项的个数。 (3) Item方法 通过集合中的索引(即集合中项的序号)或键(假设该项添加到集合时指定了)检索集合中的成员。 (4) Remove方法 通过集合中的索引或键删除集合中的成员。 可以使用With…End With构造和For Each … Next构造很方便地处理对象和集合,其介绍可参见ExcelVBA编程系列之对象模型(2):初步理解和使用Excel对象模型一文。 - – - – - – - – - – - – - – - – - - 运算符 运算符是用于完成操作的一系列符号,包括算术运算符、比较运算符、逻辑运算符、字符串运算符等。可用于连接一个或多个语言元素,或者完成一些运算以形成一个表达式。 - – - – - – - – - – - – - – - – - - 表达式 表达式就是变量、常量、运算符的集合,可分为算术表达式、字符串表达式、赋值表达式、布尔表达式等 详细的内容请见VBA编程系列:运算符和表达式。 - – - – - – - – - – - – - – - – - - 数组 数组是一组拥有相同名称同类元素。定义数组后,即创建了数组。数组中单个的数据项称为数组元素,用于访问数组元素的编号称为数组索引号,最小索引号和最大索引号称为边界。 在VBA中,根据数组元素是否变化,分为固定大小的数组和动态数组,根据数组的维数又可分为一维数组和多维数组。 1、创建数组 用Dim语句来定义固定大小的数组,即声明一个数组。如 Dim myArray(9) As Integer 上面的代码创建一个名为myArray含有10个数组元素的一维数组。注意,所有VBA数组的下界均从0开始,因此上面的代码所创建的数组元素从myArray(0)到myArray(9)。 在Dim语句中不指明数组元素的个数来声明动态数组,如 Dim myDynamicArray() As Integer 使用ReDim关键字重新定义数组的大小: ReDim myDynamicArray(10) 也可以用ReDim关键字同时声明一个动态数组并指定该数组的元素个数: ReDim myDynamicArray(5) As Integer VBA没有限制重新定义动态数组大小的次数,但在重新定义数组大小时,原有的数组数据就会丢失。如果需要保留原来的数据,可以使用Preserve关键字: ReDim Preserve myDynamicArray(5) 需要注意的是,如果重新定义数组时减小了数组的大小,则会丢失被缩减了的那部分元素的数据。 当然,与声明变量一样,也可以用Public语句声明公共数组。 2、确定数组的边界 可以使用UBound函数和LBound函数分别获取数组的最大边界和最小边界。 默认情况下,VBA的数组的下界是从0开始的,可以在模块的声明部分使用Option Base语句来改变模块中数组的起始边界。如 Option Base 1 该语句使数组元素的索引号从1开始。 也可以在定义数组时指定数组的上界和下界,如 Dim <数组名> (<下界> to <上界>) As <数据类型> 3、多维数组 多维数组可以在每个数组元素中存储一组数据,因此,多维数组的每个数组元素都包含一个数组。与一维数组相同,可以使用下面的两种方法创建多维数组: (1)Dim <数组名> (<数组元素数1>,<数组元素数2>,……) As <数据类型> (2)Dim <数组名>(<下界> to <上界>,<下界> to <上界>,……) As <数据类型> 与一维数组相似,多维数组也可以是动态的。 4、引用数组中的元素 可以使用数组名称和一个索引号来引用数组中的某个特定的元素。 (有关数组的进一步介绍及其应用请见后面的一系列文章) - – - – - – - – - – - – - – - – - - 内置函数 VBA中包含各种内置函数,可以简化计算和操作。在VBA表达式中使用函数的方式与使用工作表公式中函数的方式相同。 在VBA代码中,也可以使用很多Excel工作表函数,即使用WorksheetFunction对象调用工作表函数。但是不能使用具有与VBA内置函数功能相同的工作表函数。 基本语句 1、控制程序流程语句 (1) GoTo语句 该语句将执行的程序转到指定的标签所在的语句指令,但不能转移到过程之外的指令。例如,在进行错误捕捉时,发生错误后,程序转移至标签所在处执行。 (2) If…Then语句 这种类型的语句用于条件判断中,当满足条件时,执行相应的语句;当条件不满足时,执行其它的操作。 基本语法为: If <条件> Then <条件满足时的执行语句> If … Then语句有几种形式分别用于不同的情况: ①当只有一个条件时,可使用下面的结构: If <条件> Then <条件满足时的执行语句> [Else <条件不满足时的执行语句>] 其中,Else子句可选。如果该语句不在同一行中,则应在后面加上End If语句,即: If <条件> Then [指令] End If 或: If <条件> Then [指令] Else [指令] End If 当条件为真时,执行Then后面的语句并结束If…Then语句的执行,否则执行Else后面的语句或结束If…Then语句的执行。 ②当有两个或多个条件时,可使用嵌套的If … Then 结构: If <条件> Then [指令] ElseIf <条件1> Then [指令] [Else] [指令] End If 上面只是两层嵌套,可以根据情况使用多层嵌套。当条件为真时,执行Then后面的语句并结束If…Then语句的执行,否则判断条件1,当条件1为真时,执行Then后面的语句并结束If…Then语句的执行,否则执行Else后面的指令。 (3) Select Case语句 当需要作出三种或三种以上的条件判断时,最后使用Select Case语句。其基本语法为: Select Case <测试表达式> [Case 条件表达式1] [指令] [Case 条件表达式2] [指令] …… [Case Else] [指令] End Select 当某个条件表达式与测试表达式相匹配时,则执行其后的指令,否则执行Else(如果有的话)后的指令,然后结束Select Case块的执行。 此外,Select Case语句还可以嵌套。 (有关程序控制语句的进一步介绍和示例请见后面的一系列文章) 2、循环语句 循环即重复执行某段代码。在VBA中,有多种可以构成循环的语句结构。 (1) For … Next 循环 其语法如下: For <计数器=开始数> To <结束数> [step 步长] [指令] [Exit For] [指令] Next [计数器] 从开始到结束,反复执行For和Next之间的指令块,除非遇到Exit For语句,将提前跳出循环。其中,步长和Exit For语句以及Next后的计数器均为可选项。 For…Next循环中可以再包含For…Next循环,即For…Next循环可以嵌套使用。 (2) Do While循环 只有在满足指定的条件时才执行Do While循环。有两种形式: ■ 第一种形式 Do [While 条件] [指令] [Exit Do] [指令] Loop 当条件满足时执行指令。 ■ 第二种形式 Do [指令] [Exit Do] [指令] Loop [While 条件] 先执行指令,然后再判断条件,如果条件满足则再次执行指令。 其中Exit Do语句表示提前退出指令块。 (3) Do Until循环 与Do While循环一样,也有两种形式; ■ 第一种形式 Do [Until 条件] [指令] [Exit Do] [指令] Loop ■ 第二种形式 Do [指令] [Exit Do] [指令] Loop [Until 条件] 执行指令,直到条件满足时退出循环。 (4) While … Wend循环 其语法为: While <条件> [指令] Wend 当条件满足时,则执行指令。 (有关循环语句的进一步介绍和示例请见后面的一系列文章) - – - – - – - – - – - – - – - – - – - - 过程 过程由一组完成所要求操作任务的VBA语句组成。子过程不返回值,因此,不能作为参数的组成部分。 其语法为: [Private|Public] [Static] Sub <过程名> ([参数]) [指令] [Exit Sub] [指令] End Sub 说明: (1) Private为可选。如果使用Private声明过程,则该过程只能被同一个模块中的其它过程访问。 (2) Public为可选。如果使用Public声明过程,则表明该过程可以被工作簿中的所有其它过程访问。但是如果用在包含Option Private Module语句的模块中,则该过程只能用于所在工程中的其它过程。 (3) Static为可选。如果使用Static声明过程,则该过程中的所有变量为静态变量,其值将保存。 (4) Sub为必需。表示过程开始。 (5) <过程名>为必需。可以使用任意有效的过程名称,其命名规则通常与变量的命名规则相同。 (6) 参数为可选。代表一系列变量并用逗号分隔,这些变量接受传递到过程中的参数值。如果没有参数,则为空括号。 (7) Exit Sub为可选。表示在过程结束之前,提前退出过程。 (8) End Sub为必需。表示过程结束。 如果在类模块中编写子过程并把它声明为Public,它将成为该类的方法。 (关于过程的详细介绍和示例见后面的一系列文章) - – - – - – - – - – - – - – - – - – - - 函数 函数(function)是能完成特定任务的相关语句和表达式的集合。当函数执行完毕时,它会向调用它的语句返回一个值。如果不显示指定函数的返回值类型,就返回缺省的数据类型值。 声明函数的语法为: [Private|Public] [Static] Function <函数名> ([参数]) [As 类型] [指令] [函数名=表达式] [Exit Function] [指令] [函数名=表达式] End Function 说明: (1) Private为可选。如果使用Private声明函数,则该函数只能被同一个模块中的其它过程访问。 (2) Public为可选。如果使用Public声明函数,则表明该函数可以被所有Excel VBA工程中的所有其它过程访问。不声明函数过程的作用域时,默认的作用域为Public。 (3) Static为可选。如果使用Static声明函数,则在调用时,该函数过程中的所有变量均保持不变。 (4) Function为必需。表示函数过程开始。 (5) <函数名>为必需。可以使用任意有效的函数名称,其命名规则与变量的命名规则相同。 (6) 参数为可选。代表一系列变量并用逗号分隔,这些变量是传递给函数过程的参数值。参数必须用括号括起来。 (7) 类型为可选。指定函数过程返回的数据类型。 (8) Exit Function为可选。表示在函数过程结束之前,提前退出过程。 (9) End Function为必需。表示函数过程结束。 通常,在函数过程执行结束前给函数名赋值。 函数可以作为参数的组成部分。但是,函数只返回一个值,它不能执行与对象有关的动作。 如果在类模块中编写自定义函数并将该函数的作用域声明为Public,这个函数将成为该类的方法。 (关于Function过程的详细介绍和示例见后面的一系列文章) - – - – - – - – - – - – - – - – - – - - 事件处理过程 要对一个控件事件编写事件处理程序,应先打开窗体的代码窗口并从可用对象的下拉列表中选择所需的控件。然后,从该控件的可用事件下拉列表中选择所用的事件。此时,对事件处理程序的定义语句就会自动出现在代码窗口中,就可以直接编写事件处理程序了。 在Excel中,有下面几类事件,即Excel应用程序事件、工作簿事件、工作表事件、图表事件、用户窗体事件等。 (关于Excel中事件处理的介绍请见后面的一系列文章) - – - – - – - – - – - – - – - – - – - - 类模块 类模块是存放共享变量以及共享代码的存储库。创建一个类模块,实际上也是在创建一个COM(组件对象模型)接口。因此,类模块允许通过一个由属性、方法和事件组成的可编程接口向外界描述应用程序,同时保证保留对应用程序的控制权。也就是说,类模块能够让程序实现“封装”,这样,在其它工程中可以直接使用某类模块而不需要访问源代码。此外,可以使用类来创建自已的库,如果要使用的话,只需要在任何新的工程中添加一个对该类的引用就行了。并且,如果要改变程序,只需对类模块改动就行了,而不需要在程序的每个部分都作改动。 (有关类模块知识的详细介绍请见后面的一系列文章) - – - – - – - – - – - – - – - – - – - - 属性过程 属性过程(property procedure)是特殊的过程,用于赋予和获取自定义属性的值。属性过程只能在对象模块如窗体或类模块中使用。 有三种属性过程: Property Let 给属性赋值 Property Get 获取属性的值 Property Set 将对象引用赋给属性引用 - – - – - – - – - – - – - – - – - – - - 调用子过程和函数过程 子过程可以用下面三种方法调用。第一种使用Call语句: Call DoSomething(参数1,参数2,……) 如果使用Call语句,就必须用小括号将参数列表括起来。 第二种是直接利用过程名: DoSomething 参数1,参数2,…… 此时,不用在参数列表两边加上括号。 如果不想使用函数的返回值,可以用上述任一种方法调用函数。否则,可以用函数名作为表达式的组成部分,如 If GetFunctionResult(parameter)=1 Then 如果用函数调用作为表达式的一部分,参数列表必须放在小括号中。 第三种是使用Run方法。 (关于过程调用更详细的介绍和示例请见后面的一系列文章) - – - – - – - – - – - – - – - – - – - - 在过程间传递参数 在很多情况下,需要在子过程或函数中调用另一个自定义函数或子过程,这时,在被调用过程中就要用到在调用过程中使用的某个变量。因此,可把该变量作为参数传递给被调用过程。不管被调用过程是在同一模块、同一工程中的过程,还是在远程服务器上的类中的一个方法,从一个过程向另一个过程传递变量的原理都是一样的。 被调用过程(而不是调用过程)决定了变量如何从调用过程传递到被调用过程。 1、VBA允许用两种不同的方式在过程和组件之间传递参数。在子过程或函数的定义部分,可以指定参数列表中的变量的传递方式:ByRef(按引用)或者ByVal(按值)。 (1) ByRef 这是VBA中在过程间传递变量的默认方法。ByRef是指按引用传递变量,即传递给被调用过程的是原变量的引用。因此,如果改变了被调用过程中的变量值,其变化就会反映到调用过程中的那个变量,因为它们实际上是同一个变量。 (2) ByVal 如果使用ByVal关键字传递变量,被调用过程获得的就是该变量的独立副本。因此,改变被庙用过程中该变量的值不会影响调用过程中该变量原来的值。 2、Optional参数 Optional关键字用来指定某个特定的参数并不一定要传递,即为可选参数。但是,该参数必须放在最后。 3、ParamArray 使用ParamArray关键字能够使过程按受一组数目可变的参数。ParamArray参数必须是参数列表中的最后一个参数,而且不能在使用了Optional关键字的参数列表中使用ParamArray参数。 - – - – - – - – - – - – - – - – - – - - 变量(常量)作用域和生存期 有时需要在工程内的所有过程中使用某个变量,而有时某些变量又只需要在某些特定的过程中用到,变量的这种可见性称为变量作用域。 变量存在和作用的时间,称为变量的生存期。 变量或常数在程序中声明的位置决定了变量的作用域和生存期。 总的说来,在模块的声明部分用Private关键字声明的变量可以被模块中的所有过程使用;在模块的声明部分用Public关键字声明的变量可以被整个工程使用;若某个对象引用指向某类模块,则在该类模块的声明部分用Public关键字声明的变量可以被整个工程使用;在子过程或函数中用Dim语句声明的变量只能被声明这些变量的过程使用。 (1) 过程级作用域 在一个过程(即子过程或函数)内声明的变量只能在该过程内使用,其生存期在执行了End Sub或End Function语句后结束。因此,可以在不同的过程中定义具有相同名称的不同变量。声明过程级作用域的变量,在过程中用Dim语句声明变量。 此外,还有一种具有过程级作用域的特殊变量,称为静态变量。静态变量是在过程中定义的,尽管这种变量也具有过程级作用域,但是它具有模块级的生存期。这意味着只能在定义静态变量的过程内使用这些变量,但是变量的值在两次过程调用之间是保持不变的。用Static关键字声明静态变量: Static lngExcuted As Long 还可以声明一个过程为静态过程,在这种情况下,在过程中声明的所有变量都被认为是静态变量,而且它们的值在两次过程调用之间都会保持不变,如 Static Procedure MyProcedure() Dim iCtr As Integer (2) 模块级或私有作用域 具有模块级作用域的变量可以被某个模块内的所有子过程和函数使用,也可以在模块级生存期内保存在内存中。 在模块的声明部分(即任何子过程或函数外),用Dim语句或Private语句声明变量来创建一个具有模块级作用域的变量。 (3) Friend作用域 Friend关键字只能用于在对象模块(如类模块或窗体模块)中的变量和过程的声明。用Friend声明的变量允许工程中的其他对象模块访问原模块中的变量或方法,但是不需要用Public语句声明这些变量或方法。 (4) 公共作用域 在过程外使用Public语句声明的变量可以被当前工程中的所有模块使用。 EXCEL VBA函数参考手册.rar VBA常用技巧.part01.rar VBA常用技巧.part02.rar VBA常用技巧.part03.rar VBA常用技巧.part04.rar VBA常用技巧.part05.rar VBA常用技巧.part06.rar |
4楼 kevinchengcw |
十七种可用一行代码完成的技巧 编程要讲效率,尽管现在的计算机,速度是不成问题,但是,如果一行代码能完成,为什么要用更多的代码了? 1、下列代码,则是对逻辑运算不清楚造成。 If A=true Then C= Not B Else C= B End If 可以: C=A XOR B 2、如果加上下列代码: If C=true then D=28 Else D=29 End IF D=if((A XOR B),28,29) 3、布尔赋值,常被人忽略:如: If A= 13 then B=True Else B=False End If 可以: B = A = 13 或者: B = (A = 13) 我更喜欢用后者,这样代码易于看懂。 4、字串有效性检测: If IsNull(StrOrg) Or StrOrg="" then 可以: If Len(StrOrg & "")<>0 then 5、字串重复次数 RepeatCount=Ubound(Split(StrOrg,StrFind)) 同样,如果要对字串有效性判断:RepeatCount=Iif((Len(StrOrg & "")=0), 0, Ubound(Split(StrOrg,StrFind)) 6、有时需要判断字串数组中是否有这一元素,这时最好不用数组,而用分隔符字串于是: If Len(OrgStr)= Len(Replace(OrgStr,FindStr)) then 则表明,此元素不存在。 7、对数组初始化:最好用变体,这样,也是一行语句:如: IntArr=Array(12,28,29,30,31,52,24,60) 注意,此时需要用变量后缀。上面代码,如要定义为长整型,则 IntArr=Array(12&,28&,29&,30&,31&,52&,24&,60&) 要将IntArr 定义为变体 8、判断大小: IntMax = Iif((IntA > IntB), IntA, IntB) IntMin = Iif((IntA < IntB), IntA, IntB) 9、按索引的Select Case Function GetChoice(Ind As Integer) GetChoice = Choose(Ind, "Speedy", "United", "Federal") End Function 10、按表达式的Select Case(这种转换要求不能有Case Else的才可以这样,否则会出错) Function MatchUp (CityName As String) Matchup =tch(CityName = "London", "English", CityName _ = "Rome", "Italian", CityName = "Paris", "French") End Function 11、使用Iif,前面已有。 Function CheckIt (TestMe As Integer) CheckIt = IIf(TestMe > 1000, "Large", "Small") End Function 12、字串动态数组是否已初始化 If Len(Join(StrArr))=0 then 字串动态数组未初始化 13、指定只读CombBox的当前值,如果能确认这个值就在其中,一定不会错,则: Combbox=CurValue 注意,不可以写成:Combbox.text=CurValue 前者实际是写 _default 这个属性,而后者则是写Text 因为只读,则会导致错误 14、如果有下列代码: Select Case CombBox.text Case "London" Call FuncStrLang(3) Case "Rome" Call FuncStrLang(5) ...... End Select 则可以用ItemData属性 即:"London" 的 Itemdata=3 "Rome" 的 Itemdata=5 于是: Call FuncStrLang(CombBox.ItenData) 15、如果有下列代码: Select Case CombBox.text Case "London" Call ClsCity.CityIntr_London Case "Rome" Call ClsCity.CityIntr_Rome ...... End Select 只要: CallByName ClsCity, "CityIntr_" & CombBox.text, vbMethod 16、复制数组到另一变量中: Dim iOrgArr(30) as Integer Dim iDesArr as Variant ...... iDesArr = iOrgArr 即主变体直接取数组指针,则所有元素都复制了过去 17、如果有下列代码: Do While Not RsAdo.Eof If len(DesStr)<>0 then DesStr=DesStr & VbTab End if DesStr=RsAdo!Rec_id RsAdo.MoveNext loop 则只要: DesStr=RsAdo.GetString() 本示例为设置密码窗口 (1) If Application.InputBox("请输入密码:") = 1234 Then [A1] = 1 '密码正确时执行 Else: MsgBox "密码错误,即将退出!" '此行与第2行共同设置密码 End If 本示例为设置密码窗口 (1) X = MsgBox("是否真的要结帐?", vbYesNo) If X = vbYes Then Close 本示例为设置工作表密码 ActiveSheet.Protect Password:=641112 ' 保护工作表并设置密码 ActiveSheet.Unprotect Password:=641112 '撤消工作表保护并取消密码 '本示例关闭除正在运行本示例的工作簿以外的其他所有工作簿,并保存其更改内容 。 For Each w In Workbooks If w.Name ThisWorkbook.Name Then w.Close SaveChanges:=True End If Next w '每次打开工作簿时,本示例都最大化 Microsoft Excel 窗口。 Application.WindowState = xlMaximized '本示例显示活动工作表的名称。 MsgBox "The name of the active sheet is " & ActiveSheet.Name '本示例保存当前活动工作簿的副本。 ActiveWorkbook.SaveCopyAs "C:\TEMP\**X.XLS" '下述过程激活工作簿中的第四张工作表。 Sheets(4).Activate '下述过程激活工作簿中的第1张工作表。 Worksheets(1).Activate '本示例通过将 Saved 属性设为 True 来关闭包含本段代码的工作簿,并放弃对该 工作簿的任何更改。 ThisWorkbook.Saved = True ThisWorkbook.Close '本示例对自动重新计算功能进行设置,使 Microsoft Excel 不对第一张工作表自 动进行重新计算。 Worksheets(1).EnableCalculation = False '下述过程打开 C 盘上名为 MyFolder 的文件夹中的 MyBook.xls 工作簿。 Workbooks.Open ("C:\MyFolder\MyBook.xls") '本示例显示活动工作簿中工作表 sheet1 上单元格 A1 中的值。 MsgBox Worksheets("Sheet1").Range("A1").Value 本示例显示活动工作簿中每个工作表的名称 For Each ws In Worksheets MsgBox ws.Name Next ws 本示例向活动工作簿添加新工作表 , 并设置该工作表的名称? Set NewSheet = Worksheets.Add NewSheet.Name = "current Budget" 本示例将新建的工作表移到工作簿的末尾 'Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Move After:=Sheets(Sheets.Count) End Sub 本示例将新建工作表移到工作簿的末尾 'Private Sub App_WorkbookNewSheet(ByVal Wb As Workbook, _ ByVal Sh As Object) Sh.Move After:=Wb.Sheets(Wb.Sheets.Count) End Sub 本示例新建一张工作表,然后在第一列中列出活动工作簿中的所有工作表的名称。 Set NewSheet = Sheets.Add(Type:=xlWorksheet) For i = 1 To Sheets.Count NewSheet.Cells(i, 1).Value = Sheets(i).Name Next i 本示例将第十行移到窗口的最上面? Worksheets("Sheet1").Activate ActiveWindow.ScrollRow = 10 当计算工作簿中的任何工作表时,本示例对第一张工作表的 A1:A100 区域进行排序 。 'Private Sub Workbook_SheetCalculate(ByVal Sh As Object) With Worksheets(1) .Range("a1:a100").Sort Key1:=.Range("a1") End With End Sub 本示例显示工作表 Sheet1 的打印预览。 Worksheets("Sheet1").PrintPreview 本示例保存当前活动工作簿? ActiveWorkbook.Save 本示例保存所有打开的工作簿,然后关闭 Microsoft Excel。 For Each w In Application.Workbooks w.Save Next w Application.Quit 下例在活动工作簿的第一张工作表前面添加两张新的工作表? Worksheets.Add Count:=2, Before:=Sheets(1) 本示例设置 15 秒后运行 my_Procedure 过程,从现在开始计时。 Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure" 本示例设置 my_Procedure 在下午 5 点开始运行。 Application.OnTime TimeValue("17:00:00"), "my_Procedure" 本示例撤消前一个示例对 OnTime 的设置。 Application.OnTime EarliestTime:=TimeValue("17:00:00"), _ Procedure:="my_Procedure", Schedule:=False 每当工作表重新计算时,本示例就调整 A 列到 F 列的宽度。 'Private Sub Worksheet_Calculate() Columns("A:F").AutoFit End Sub 本示例使活动工作簿中的计算仅使用显示的数字精度。 ActiveWorkbook.PrecisionAsDisplayed = True 本示例将工作表 Sheet1 上的 A1:G37 区域剪下,并放入剪贴板。 Worksheets("Sheet1").Range("A1:G37").Cut Calculate 方法 计算所有打开的工作簿、工作簿中的一张特定的工作表或者工作表中指定区域的单元 格,如下表所示: '要计算 '依照本示例 所有打开的工作簿 ' Application.Calculate (或只是 Calculate ) 指定工作表 '计算指定工作表Sheet1 Worksheets ("Sheet1").Calculate 指定区域 'Worksheets(1).Rows(2).Calculate 本示例对自动重新计算功能进行设置,使 Microsoft Excel 不对第一张工作表自动 进行重新计算。 Worksheets(1).EnableCalculation = False 本示例计算 Sheet1 已用区域中 A 列、B 列和 C 列的公式。 Worksheets("Sheet1").UsedRange.Columns("A:C").Calculate 本示例更新当前活动工作簿中的所有链接? ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources 本示例设置第一张工作表的滚动区域? Worksheets(1).ScrollArea = "a1:f10" 本示例新建一个工作簿,提示用户输入文件名,然后保存该工作簿。 Set NewBook = Workbooks.Add Do fName = Application.GetSaveAsFilename Loop Until fName False NewBook.SaveAs Filename:=fName 本示例打开 Analysis.xls 工作簿,然后运行 Auto_Open 宏。 Workbooks.Open "ANALYSIS.XLS" ActiveWorkbook.RunAutoMacros xlAutoOpen 本示例对活动工作簿运行 Auto_Close 宏,然后关闭该工作簿。 With ActiveWorkbook .RunAutoMacros xlAutoClose .Close End With 在本示例中,Microsoft Excel 向用户显示活动工作簿的路径和文件名称。 'Sub UseCanonical() Display the full path to user. MsgBox ActiveWorkbook.FullNameURLEncoded End Sub 本示例显示当前工作簿的路径及文件名(假定尚未保存此工作簿)。 MsgBox ActiveWorkbook.FullName 本示例关闭 Book1.xls,并放弃所有对此工作簿的更改。 Workbooks("BOOK1.XLS").Close SaveChanges:=False 本示例关闭所有打开的工作簿。如果某个打开的工作簿有改变,Microsoft Excel 将显示询问是否保存更改的对话框和相应提示。 Workbooks.Close 本示例在打印之前对当前活动工作簿的所有工作表重新计算? 'Private Sub Workbook_BeforePrint(Cancel As Boolean) For Each wk In Worksheets wk.Calculate Next End Sub 本示例对查询表一中的第一列数据进行汇总,并在数据区域下方显示第一列数据的总 和。 Set c1 = Sheets("sheet1").QueryTables(1).ResultRange.Columns(1) c1.Name = "Column1" c1.End(xlDown).Offset(2, 0).Formula = "=sum(Column1)" 本示例取消活动工作簿中的所有更改? ActiveWorkbook.RejectAllChanges 本示例在商业问题中使用规划求解函数,以使总利润达到最大值。SolverSave 函数 将当前问题保存到活动工作表上的某一区域。 Worksheets("Sheet1").Activate SolverReset SolverOptions Precision:=0.001 SolverOK SetCell:=Range("TotalProfit"), _ MaxMinVal:=1, _ ByChange:=Range("C4:E6") SolverAdd CellRef:=Range("F4:F6"), _ Relation:=1, _ FormulaText:=100 SolverAdd CellRef:=Range("C4:E6"), _ Relation:=3, _ FormulaText:=0 SolverAdd CellRef:=Range("C4:E6"), _ Relation:=4 SolverSolve UserFinish:=False SolverSave SaveArea:=Range("A33") 本示例隐藏 Chart1、Chart3 和 Chart5。 Charts(Array("Chart1", "Chart3", "Chart5")).Visible = False 当激活工作表时,本示例对 A1:A10 区域进行排序。 'Private Sub Worksheet_Activate() Range("a1:a10").Sort Key1:=Range("a1"), Order:=xlAscending End Sub 本示例更改 Microsoft Excel 链接。 ActiveWorkbook.ChangeLink "c:\excel\book1.xls", _ "c:\excel\book2.xls", xlExcelLinks 本示例启用受保护的工作表上的自动筛选箭头? ActiveSheet.EnableAutoFilter = True ActiveSheet.Protect contents:=True, userInte**ceOnly:=True 本示例将活动工作簿设为只读? ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly 本示例使共享工作簿每三分钟自动更新一次? ActiveWorkbook.AutoUpdateFrequency = 3 下述 Sub 过程清除活动工作簿中 Sheet1 上的所有单元格的内容。 'Sub ClearSheet() Worksheets("Sheet1").Cells.ClearContents End Sub 本示例对所有工作簿都关闭滚动条? Application.DisplayScrollBars = False 如果具有密码保护的工作簿的文件属性没有加密,则本示例设置指定工作簿的密码加 密选项。 'Sub SetPasswordOptions() With ActiveWorkbook If .PasswordEncryptionProvider "Microsoft RSA SChannel Cryptographic Provider" Then .SetPasswordEncryptionOptions _ PasswordEncryptionProvider:="Microsoft RSA SChannel Cryptographic Provider", _ PasswordEncryptionAlgorithm:="RC4", _ PasswordEncryptionKeyLength:=56, _ PasswordEncryptionFileProperties:=True End If End With End Sub 在本示例中,如果活动工作簿不能进行写保护,那么 Microsoft Excel 设置字符串 密码以作为活动工作簿的写密码。 'Sub UseWritePassword() Dim strPassword As String strPassword = "secret" ' Set password to a string if allowed. If ActiveWorkbook.WriteReserved = False Then ActiveWorkbook.WritePassword = strPassword End If End Sub 在本示例中,Microsoft Excel 打开名为 Password.xls 的工作簿,设置它的密码 ,然后关闭该工作簿。本示例假定名为 Password.xls 的文件位于 C:\ 驱动器上。 'Sub UsePassword() Dim wkbOne As Workbook Set wkbOne = Application.Workbooks.Open("C:\Password.xls") wkbOne.Password = "secret" wkbOne.Close '注意 Password 属性可读并返回 "********"。 End Sub 本示例将 Book1.xls 的当前窗口更改为显示公式。 Workbooks("BOOK1.XLS").Worksheets("Sheet1").Activate ActiveWindow.DisplayFormulas = True '本示例接受活动工作簿中的所有更改? ActiveWorkbook.AcceptAllChanges 本示例显示活动工作簿的路径和名称 Sub UseCanonical() MsgBox '消息框 [b7] = ActiveWorkbook.FullName '当前工作簿 [b8] = ActiveWorkbook.FullNameURLEncoded '活动工作簿 End Sub 本示例显示 Microsoft Excel 启动文件夹的完整路径。 MsgBox Application.StartupPath 本示例显示活动工作簿中每个工作表的名称。 For Each ws In Worksheets MsgBox ws.Name Next ws 本示例关闭除正在运行本示例的工作簿以外的其他所有工作簿,并保存其更改内容。 For Each w In Workbooks If w.Name ThisWorkbook.Name Then w.Close savechanges:=True End If Next w Activate 事件 激活一个工作簿、工作表、图表或嵌入图表时产生此事件。 当激活工作表时,本示例对 A1:A10 区域进行排序。 Private Sub Worksheet_Activate() Range("a1:a10").Sort Key1:=Range("a1"), Order:=xlAscending End Sub Calculate 事件 对于 Worksheet 对象,在对工作表进行重新计算之后产生此事件 每当工作表重新计算时,本示例就调整 A 列到 F 列的宽度。 Private Sub Worksheet_Calculate() Columns("A:F").AutoFit End Sub BeforeDoubleClick 事件 应用于 Worksheet 对象的 Activate 方法。 当双击某工作表时产生此事件,此事件先于默认的双击操作。 Private Sub expression_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) expression 引用在类模块中带有事件声明的 Worksheet 类型对象的变量。 Target 必需。双击发生时最靠近鼠标指针的单元格。 Cancel 可选。当事件发生时为 False。如果事件过程将该参数设为 True,则该 过程执行完之后将不进行默认的双击操作。 BeforeRightClick 事件 应用于 Worksheet 对象的 Activate 方法。 当用鼠标右键单击某工作表时产生此事件,此事件先于默认的右键单击操作。 Private Sub expression_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) expression 引用在类模块中带有事件声明的 Worksheet 类型对象的变量。 Target 必需。右键单击发生时最靠近鼠标指针的单元格。 Cancel 可选。当事件发生时为 False。如果该事件过程将本参数设为 True,则 该过程执行结束之后不进行默认的右键单击操作。 Change 事件 当用户更改工作表中的单元格,或外部链接引起单元格的更改时产生此事件。 Private Sub Worksheet_Change(ByVal Target As Range) Target 更改的区域。可以是多个单元格。 说明 重新计算引起的单元格更改不触发本事件。可使用 Calculate 事件俘获工作表重新 计算操作。 本示例将更改的单元格的颜色设为蓝色。 Private Sub Worksheet_Change(ByVal Target as Range) Target.Font.ColorIndex = 5 End Sub Deactivate 事件 图表、工作表或工作簿从活动状态转为非活动状态时产生此事件。 Private Sub object_Deactivate() object Chart、Workbook 或者 Worksheet。有关对 Chart 对象使用事件的详细 信息,请参阅 Chart 对象事件的用法。 本示例当工作簿转为非活动状态时,对所有打开的窗口进行排列。 Private Sub Workbook_Deactivate() Application.Windows.Arrange xlArrange End Sub FollowHyperlink 事件 当单击工作表上的任意超链接时,发生此事件。对于应用程序级或工作簿级的事件, 请参阅 SheetFollowHyperlink 事件。 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Target Hyperlink 类型,必需。一个代表超链接目标位置的 Hyperlink 对象。 本示例对在当前活动工作簿中访问过的所有链接保留一个列表或历史记录。 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) With UserForm1 .ListBox1.AddItem Target.Address .Show End With End Sub PivotTableUpdate 事件 发生在工作簿中的数据透视表更新之后。 Private Sub expression_PivotTableUpdate(ByVal Target As PivotTable) expression 引用在类模块中带有事件声明的 Worksheet 类型对象的变量。 Target 必需。选定的数据透视表。 本示例显示一则消息,说明数据透视表已经更新。本示例假定您已在类模块中声明了 带有事件的 Worksheet 类型的对象。 Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) MsgBox "The PivotTable connection has been updated." End Sub SelectionChange 事件 当工作表上的选定区域发生改变时,将产生本事件。 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Target 新选定的区域。 本示例滚动工作簿窗口,直至选定区域位于窗口的左上角。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With ActiveWindow .ScrollRow = Target.Row .ScrollColumn = Target.Column End With End Sub 本示例显示活动工作簿中工作表 sheet1 上单元格 A1 中的值。 MsgBox Worksheets("Sheet1").Range("A1").Value 本示例显示活动工作簿中每个工作表的名称。 For Each ws In Worksheets MsgBox ws.Name Next ws 本示例向活动工作簿添加新工作表,并设置该工作表的名称。 Set newSheet = Worksheets.Add newSheet.Name = "current Budget" 本示例关闭工作簿 Book1.xls,但不提示用户保存所作更改。Book1.xls 中的所有 更改都不会保存。 Application.DisplayAlerts = False Workbooks("BOOK1.XLS").Close Application.DisplayAlerts = True 本示例设置保存文件时显示提示,要求用户输入汇总信息。 Application.PromptForSummaryInfo = True 本示例显示 Microsoft Excel 的完整路径。 Private Sub aa() MsgBox "The path is " & Application.Path End Sub 示例显示每一个可用加载宏的路径及文件名。 For Each a In AddIns MsgBox a.FullName Next a ChDir 语句 改变当前的目录或文件夹。 ChDir path 在 Power Macintosh 中,默认驱动器总是改为在 path 语句中指定的驱动器。完整 路径指定由卷标名开始,相对路径由冒号 (:) 开始. ChDir 可以辨认路径中指定的 别名: ChDir "MacDrive:Tmp" ' 在 Macintosh 中 本示例显示当前路径分隔符。 MsgBox "The path separator character is " & _ Application.PathSeparator Move 方法 将一个指定的文件或文件夹从一个地方移动到另一个地方。 语法 object.Move destination Move 方法语法有如下几部分: 部分 描述 object 必需的。始终是一个 File 或 Folder 对象的名字。 destination 必需的。文件或文件夹要移动到的目标。不允许有通配符。 CreateFolder 方法 创建一个文件夹。 语法 object.CreateFolder(foldername) reateFolder 方法有如下几部分: 部分 描述 object 必需的。始终是一个 FileSystemObject 的名字。 foldername 必需的。字符串表达式,它标识创建的文件夹。 本示例使用 MkDir 语句来创建目录或文件夹。如果没有指定驱动器,新目录或文件 夹将会建在当前驱动器中。 MkDir "MYDIR" ' 建立新的目录或文件夹。 Name 语句示例 本示例使用 Name 语句来更改文件的名称。示例中假设所有使用到的目录或文件夹都 已存在。 在 Macintosh 中,默认驱动器名称是 "HD" 并且路径部分由冒号取代 反斜线隔开。 Dim OldName, NewName OldName = "OLDFILE": NewName = "NEWFILE" ' 定义文件名。 Name OldName As NewName ' 更改文件名。 OldName = "C:\MYDIR\OLDFILE": NewName = "C:\YOURDIR\NEWFILE" Name OldName As NewName ' 更改文件名,并移动文件。 本示例显示当前默认文件路径。 MsgBox "The current default file path is " & _ Application.DefaultFilePath 本示例设置替换启动文件夹。 Application.AltStartupPath = "C:\EXCEL\MACROS" FolderExists 方法 如果指定的文件夹存在返回 True,不存在返回 False。 语法 object.FolderExists(folderspec) 本示例在单元格中启用编辑。 Application.EditDirectlyInCell = True 程序说明: 几种用VBA在单元格输入数据的方法: Public Sub Writes() 1-- 2 方法,最简单在 "[ ]" 中输入单元格名称。 1 [A1] = 100 '在 A1 单元格输入100。 2 [A2:A4] = 10 '在 A2:A4 单元格输入10。 3-- 4 方法,采用 Range(" "), " " 中输入单元格名称。 3 Range("B1") = 200 '在 B1 单元格输入200。 4 Range("C1:C3") = 300 '在 C1:C3 单元格输入300。 5-- 6 方法,采用 Cells(Row,Column),Row是单元格行数,Column是单元格栏数。 5 Cells(1, 4) = 400 '在 D1 单元格输入400。 6 Range(Cells(1, 5), Cells(5, 5)) = 50 '在 E1:E 5单元格输入50。 End Sub 你点选任何单元格,按 Selection 按钮,則则所点选的单元格均会被输入文字 "Test"。 Public Sub Selection1() Selection.Value = "Test" '在任何你点选的单元格输入文字 "Test"。 End Sub VBALesson2 程序说明: 几种如何把别的工作表 Sheet4 数据,读到这个工作表的方法:在被读取的单元格 前加上工作表名称 Sheet4。 Public Sub Writes() 1-- 2 方法,最简单在被读取的 "[ ]" 前加上被读取的工作表名称 Sheet4。 1 [A1] = Sheet4.[A1] '把Sheet4 A1 单元格的数据,读到 A1单元格。 2 [A2:A4] = Sheet4.[B1] ''把 Shee4 工作表单元格 B1 数据,读到 A2:A4 单元格。 3-- 4 方法,在被读取的工作表 Range(" ")的 Range 前加上被读取的工作表名称 Sheet4。 3 Range("B1") = Sheet4.Range("B1") ''把 Shee4工作表单元格 B1 数据,读 到 B1 单元格。 4 Range("C1:C3") = Sheet4.Range("C1") '把 Shee4 工作表单元格 C1 数据 ,读到 C1:C3 单元格。 5-- 6 方法,在被读取的工作表 Cells(Row,Column),Cells 前加上被读取工作表 名称 Sheet4。 5 Cells(1, 4) = Sheet4.Cells(1, 4) '把 Shee4 工作表单元格 D1 数据,读 到 D1 单元格。 6 Range(Cells(1, 5), Cells(5, 5)) = Sheet4.Cells(1, 5) '把 Shee4 工 作表单元格 E1 数据,读到 E1:E 5单元格。 End Sub 你点选任何单元格,按 Selection 按钮,则所点选的单元格均会被输入 Shee4 工 作表单元格 F1 数据。 Public Sub Selection1() Selection.Value = Sheet4.[F1] '把 Shee4 工作表单元格 F1 数据,读到任 何你点选的单元格。 End Sub VBALesson3 程序说明: 如何利用 Worksheet_SelectionChange 输入数据的方法。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Target = 100 End Sub Target 指的是你鼠标所选的单元格,Worksheet_SelectionChange() 事件的参数 。 可以是一个也可以是好几个单元格。 Range 是 Excel 特有的变量形态,叫范围。 Target As Rang 是把 Target 这个参数设定为 Range 变量形态。 Target = 100 是把你点选的单元格输入数字100。 VBALesson4 程序说明: 如何利用 Worksheet_SelectionChange 在限定的单元格输入数据的方法。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row >= 2 And Target.Column = 2 Then Target = 100 End If End Sub If ... Then ... End If 这是我们学的这一个逻辑判断语句。 Target.Row >= 2,指的是鼠标选定的单元格的行大于或等于 2。 Target.Column = 2 ,指的是鼠标选定的单元格的栏等于 2。 If Target.Row >= 2 And Target.Column = 2 Then 指的是只有在Target.Row >= 2及Target.Column = 2二个条件成立时。 就是 (Target.Row >= 2) 为True及(Target.Column = 2)为True时,才执行下面的 程序 Target=100, 也就是 B 栏第二行及以下行用鼠标被点选时,才会被输入100,其它单元格则不被输 入数据。 VBALesson5 程序说明: 比较 Worksheet_SelectionChange() 与用按钮 CommandButton1_Click() 来执行 程序二者的方法与写法有何不同。 Worksheet_SelectionChange()事件 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row >= 2 And Target.Column = 2 Then Target = 100 End If End Sub 按鈕 CommandButton1_Click() Private Sub CommandButton1_Click() If ActiveCell.Row >= 2 And ActiveCell.Column >= 3 Then ActiveCell = 100 End If End Sub 二者执行方法最大的地方,在于 Worksheet_SelectionChange() 是自动的,你不用 了解他是怎么完成工作的。 按钮 CommandButton1_Click() 是人工的,比 SelectionChange()多一道手续, 就是要去按那接钮,程序才会执行。 SelectionChange() 有一个参数 Target 可用;CommandButton1_Click ()没有。 所以我们要用 ActiveCell 内定函数来取代Target,ActiveCell 与 Target最大的 不同点他只能指定一个单元格。 就是你选取多个单元格也只有最上面的单元格会加上数据;用 Selection 取代 ActiveCell, 用法就跟 Target 一样了。 VBALesson 6 程序说明: 完整的 If...Then ┅ End 逻辑判断式。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row >= 2 And Target.Column = 2 Then Target = 200 ElseIf Target.Row >= 2 And Target.Column = 3 Then Target = 300 ElseIf Target.Row >= 2 And Target.Column = 2 Then Target = 400 Else Target = 500 End If End Sub 这是个完整的 If 逻辑判断式,意思是说,假如 If 後的判断式条件成立的话,就 执行第二条程序,否则假如 ElseIf 後的判断式条件成立的话,就执行第四条程序 ,否则假如另一个 ElseIf 後的判断式条件成立的话,就执行第六条程序。 Else 的意思是说,假如以上条件都不成立的话,就执行第八条程序。 他的执行方式是假如 IF 的条件成立的话,就不执行其它ElseIf 及Else 的逻辑判 断式,假如 If 後的条件不成立的话才会执行 ElseIf 或 Else 逻辑判断式。第二 个 ElseIf後的条件因为与 IF 後的条件一样,所以这个判断式後面的 Target=400 将是永远无法执行到的程序。 VBALesson 7 程序说明∶我们为什麽要用变数。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i , j As Integer Dim k As Range i = Target.Row j = Target.Column Set k = Target If i >= 2 And j = 2 Then k = 200 ElseIf i >= 2 And j = 3 Then k = 300 ElseIf i >= 2 And j = 4 Then k = 400 Else k = 500 End If End Sub 跟VBALesson 6比较,程序是不是明朗多了,在前课重复的用 Target.Row, Target.Column及Target来写程序是不是有一点烦。用变量的第一个好处大家马上感 觉得出来,就是可以简化程序。 使用变量前,你得先宣告变量。宣告变量的方法是在 "Dim " 后面写上变量 " i " As 后面接上变量的形态 "Integer"。 Dim i , j As Integer 就是宣告 i 与 j 为整数变量,这是同时宣告二个变量 i 与 j 所以要在二个变量间加个 " , "号。 Dim k As Range 是宣告 k 为范围资料形态,Range这是 Excel 特有的资料形态 。 i = Target.Row是把当前单元格的行数,指定给变量 i。 j = Target.Column 是把当前单元格的栏数,指定给变量 j。 Set k = Target 是把当前的单元格,指定给变量 k。 用像 i 与 j 这样简单的变量,在程序的前面你可能还记得 i 或 j 代表着 什厶。程序写长了,你可能忘记 i 或 j 代表着什厶。所以最好的方法是用比较有 意义的代号,来为变量命名如 iRow 或 iCol 来取代 i 及 j 。 VBALesson 8 程序说明∶体会一下Worksheet_Change()事件。 Private Sub Worksheet_Change(ByVal Target As Range) Dim iRow, iCol As Integer iRow = Target.Row iCol = Target.Column If iRow >= 2 And iCol = 2 And Target "" Then Application.EnableEvents = False Cells(iRow, iCol + 1) = Cells(iRow, iCol) * 2 Application.EnableEvents = True ElseIf iRow >= 2 And iCol = 2 And Target = "" Then Cells(iRow, iCol + 1) = "" Else Cells(iRow, iCol + 1) = "" End If End Sub 前几个教程都是用Worksheet_SelectionChange 事件来举例子,大家应该能体会他 是怎厶一回事了吧。 这个教程就是要让你来体会什厶是Worksheet_Chang()事件。因为这二个事件在VBA 都是非常有用的,所以一定要了解。 简单的说,前者是你鼠标移动到那个单元格,就触发那个事件的执行。後者是要等到 你点选的单元格,数 有了改变才会触发事件的执行。二者执行的时机一前一後。 Target "" 是代表限定当前的单元格要是有数 的,才会执行以下三行的程序。 Cells(iRow, iCol + 1) = Cells(iRow, iCol) * 2,是你在 B 栏输入数 时,C 栏将可得到 B 栏二倍的数 。 Target = "" 是限定当前的单元格要是没有数 的,才会执行以下一行的程序。 Cells(iRow, iCol + 1) = "",是把 C 栏的数 清成空格。 Application.EnableEvents = False与Application.EnableEvents = True,这是 个成双的程序,当你用了前者记得在执行其他程序後要写上後面的程序。它的目的在 抑制事件连锁执行。简单的说就是,在 B 字段所触发的事件,不愿在其它单元格再 触发另一个Worksheet_Change()事件。 VBALesson 9 程序说明∶体会一下Worksheet_Change()事件连锁反应。 Private Sub Worksheet_Change(ByVal Target As Range) Dim iRow As Integer iRow = Target.Row Application.EnableEvents = False Cells(iRow, 3) = Cells(iRow, 3) + Cells(iRow, 2) Application.EnableEvents = True End Sub Private Sub Worksheet_Change(ByVal Target As Range) Dim iRow As Integer iRow = Target.Row 'Application.EnableEvents = False Cells(iRow, 3) = Cells(iRow, 3) + Cells(iRow, 2) 'Application.EnableEvents = True End Sub 这个程序的目的是要在 B2 输入新的数 时,C2 会将 B2 输入的新数 加上 C2 原 有的数 呈现在 C2 上。 照上面有加上 Application.EnableEvents = False 程序执行当然没问题。 现在你在 Application.EnableEvents = False 与 Application.EnableEvents = True 前加上「 '」看看。 程序前加上「 '」的目的是要使「 '」之后的文字变成说明文字,程序执行时是会跳 过说明文字,不执行说明文字的内容。 程序前加上「 '」符号后,文字会变成绿色。 执行第二个程序时,你将发现 C2 不会按你所要求的,呈现结果。 这就是所谓的事件连锁反应。 请问这个宏该如何写! 我想运行一个宏,就能在当前工作表B3上填上一条公式;这条公式的结果是所有工作 表上的B4单元格的和.请问这个宏该如何写.谢谢! Sub gg() Dim sh As Worksheet, shname$ For Each sh In Worksheets shname = sh.Name ActiveSheet.Range("b3").value = ActiveSheet.Range("b3").value + Worksheets(shname).Range("b4") Next End Sub VBA中怎样创建一个名为"table"的新工作表 通过VBA编程,很容易添加新的工作表,但是新表的名字不知怎样控制,对于新创建 的工作表,由于其名字并非特定,所以就不好使用所创建的新表了。不知各位有何高 见。。 Sheets.Add ActiveSheet.Name = "table" 请教:如何用VBA检索表1中A列与表2,3,4,5.....中A列相同的行并把后者整行拷 贝到表1检索到的行中,谢谢!!!! To yxptwq∶用这程序试看看。 Sub Copy1() Dim Row_dn1, Row_dnN, i, j, n As Integer Row_dn1 = Sheet1.Range("A65536").End(xlUp).Row k = 1: n = 1 For Each wSheet In ActiveWorkbook.Worksheets With wSheet If .Name "Sheet1" Then Row_dnN = .Range("A65536").End(xlUp).Row For i = 2 To Row_dn1 For j = 2 To Row_dnN If .Cells(j, 1) = Sheet1.Cells(i, 1) Then .Rows(j & ":" & j).Copy Destination:=Sheet1.Rows(Row_dn1 + n & ":" & Row_dn1 + n) n = n + 1 End If Next j Next i End If End With Next wSheet End Sub 如果要用VBA程式输入密码使用下列程式码 Sub EnterNewPW() '程式说明:利用SendKey输入VBAProject密码 '注意事项:执行本程式需要在Excel视窗,不能在VBE视窗 Application.SendKeys "%{F11}", True 'Alt + F11 切换到VBA视窗 Application.SendKeys "%T", True 'ALT + T 工具(繁体中文是(T)) Application.SendKeys "e", True '工具(T)-VBproject属性(E) Application.SendKeys "^{TAB}", True 'TAB 键(切换到PAge2 保护页面) Application.SendKeys "{+}", True '选取Checkbox方块(锁定专案以供检 视) '({+} 选取, {-} 取消选取) Application.SendKeys "{TAB}", True 'TAB 键(跳到第一次输入密码 Textbox myPW = "chijanzen" '假设密码 chijanzen Application.SendKeys myPW, True '输入密码 Application.SendKeys "{TAB}", True 'TAB 键(跳到第二次输入密码 Textbox Application.SendKeys myPW, True '输入密码 Application.SendKeys "{ENTER}", True '按确定钮(预设值) Application.SendKeys "%{F11}", True '返回Excel视窗 End Sub 冒泡排序法: 冒泡排序法之所以成为"冒泡排序"是因为值较小的或是较轻的元素浮到作为继续排 序的一组数的顶部。 Sub Macro1() Dim i As Integer Dim j As Integer Dim t as integer Static number(1 To 10) As Integer For i = 1 To 10 number(i) = inputbox"输入要排序的数:" Next i For i = 10To 2 Step -1 For j = 1 To i – 1 ‘下面进行位置交换 If number(j) > number(j + 1) Then t = number(j + 1) number(j + 1) = number(j) number(j) = t End If Next j Next i For i = 1 To 20 Print number(i) Next i End sub |
5楼 kevinchengcw |
大家一起来学习使用字典吧,很强大。 学习使用字典.rar |
6楼 kevinchengcw |
窗体的一点基本的东西 窗体学习系列.rar |
7楼 zhengrui-csb |
好东西 学习学习学习 |
8楼 xiongkehua2008 |
不錯,全部收下好好看看... |
9楼 sam.tan |
太好了,受用无穷,谢谢版主. |
10楼 akinoru |
10.31M是不是全包括? |
11楼 yesing |
就这一标题,学的内容就够我好些天学习了 |
12楼 agui7219 |
全部收下了!谢谢LZ分享! |
13楼 lrlxxqxa |
K哥好棒,收藏学习了 |
14楼 seuchen |
此贴必火,不顶枉为人。 |
15楼 cashmchine |
这个太有用了,非常感谢 |
16楼 jl128 |
学习 |
17楼 gsb6768 |
全部收下,抽空学习学习 |
18楼 snowker |
asdfasdfasdf |
19楼 rongjun |
收藏学习 |
20楼 hd030502 |
都下了;谢谢 |
21楼 zhangguangku071 |
很想学但就是看不懂 |
22楼 zhengjf11 |
好资料,正在学习中,谢谢 |
23楼 海洋之星 |
谢谢分享,收藏学习了 |
24楼 hyyulin008 |
真是太好了,下载后认真学习一下 |
25楼 su11wei18 |
正是我想要的.谢谢k |
26楼 poiuytrewq |
ll |
27楼 lisan |
谢谢分享!我是来学习的,看字典跟看天书一样,哎,留个记号吧。 |
28楼 沧海巫山 |
楼主好强大呀 |
29楼 yyipai |
还是学习一些吧,总是麻烦别人是很不给力的 |
30楼 lrp2000 |
向楼主学习 |
31楼 snowangle007 |
感谢版主!先收藏了,就算下载也需要漫长的时间吧! |
32楼 hbhhl |
不錯,全部收下要好好看看,学习学习! |
33楼 fengjunhan |
谢谢K哥,我明天回公司下下来慢慢研究 |
34楼 亡者天下 |
跟着K哥学习VBA 我太崇拜你了 |
35楼 zyp188c |
太好了,受用无穷,谢谢版主. |
36楼 glhfgtd |
学习非常好的内容, 学习中支持顶 |
37楼 fzh2618182 |
内容很丰富,下来慢慢地学习。谢谢楼主! |
38楼 94130632 |
一时半会看不完,谢谢 |
39楼 bishunbiao |
留个脚印以后仔细研究 |
40楼 松儿 |
好厉害呀!学习。谢谢! |
41楼 flaneur0595 |
学习中,下载收藏 |
42楼 su11wei18 |
顶起来。收藏学习 |
43楼 双飞叶 |
值得收藏,非常好 |
44楼 yaomingcong |
太好了,收藏了!谢谢楼主的分享 |
45楼 小点点 |
零基础不知可以看的懂不 |
46楼 承子 |
谢谢 |
47楼 e001xceltip |
全部收下好好看看... |
48楼 普发银行 |
好帖 |
49楼 lnjyzxp |
都是很不错的资料,学习,谢谢楼主了! |
50楼 yahuu |
好东西要收藏的 |
51楼 健康快乐123 |
太多了,如何能记住这么多啊 |
52楼 Gavin_曾 |
好深奥啊 |
53楼 松儿 |
向您学习!向您请教!谢谢分享! |
54楼 qadwxj |
非常不错**收了,学习学习,可作工具查询**! |
55楼 落子无声 |
这东西太棒了。 |
56楼 laijin858 |
太好了,正好学习。 |
57楼 http8080 |
感谢,非常感谢,努力学习中 |
58楼 じ☆潴の︵ゞ |
太感谢版主的分享啦**太有用了 |
59楼 jordan01 |
好东西 学习学习 |
60楼 yncxxmj |
真的不错,对学习VBA有帮助,谢谢分享。 |
61楼 半瓶金水-瑞 |
我的神 向LZ致敬! |
62楼 寒灰 |
给力 |
63楼 kuangben |
楼主太无私了!感谢分享。 |
64楼 tianyk |
做个记号慢慢领会。 |
65楼 ☆游戏人生☆ |
不错的学习资料** |
66楼 bidededede |
好东西 学习学习 |
67楼 amylee |
收下好好学习,谢谢高人指点。 |
68楼 VIVI仔 |
谢谢.. |
69楼 竹淚寒 |
这个真的太需要了。希望能学有所成啊。 |
70楼 本人号被盗, |
K哥,真是高手! |
71楼 碧碧布布 |
高手,谢谢了 |
72楼 碧碧布布 |
VBA常用技巧.part02~06 无法解压缩 |
73楼 降龙 |
收藏,学习中 |
74楼 九龙 |
不想回复都不行,内容太有用了。必须回复,楼主好人一个。 |
75楼 ㄣ潶铯夜傷の |
受教了 喜欢啊 |
76楼 32828225 |
下载慢慢学习!谢谢楼主的分享! |
77楼 一片叶子 |
哇噻 !简直就是酷毙了! |
78楼 龙行九州 |
很好很强大的说 |
79楼 ruoyu |
感谢楼主无私奉献,好好学习一下Vba |
80楼 tom2228 |
不错,太好了,要是能打包就更好了 |
81楼 icenotcool |
|
82楼 icenotcool |
|
83楼 dreamofheart |
太牛了 |
84楼 luy007 |
收藏了 |
85楼 老糊涂 |
好资料 |
86楼 nthzm2008 |
好的东东,受用无穷! |
87楼 Roger_YY |
太牛了 |
88楼 qlwuhui |
谢谢分享 |