Worksheet对象 应用示例
Worksheet对象代表Excel工作表,Worksheets集合对象代表Excel工作表的集合。下面,我们来探讨Worksheet对象和Worksheets集合的一些属性和方法的应用。
Worksheet(s)对象应用基础
[应用1]激活工作表(Activate方法)
使用Activate方法来激活某工作表,例如:
使用Activate方法来激活某工作表,例如:
ThisWorkbook.Worksheets("Sheet1").Activate
上述代码使得含有该代码的工作簿中工作表Sheet1成为活动工作表。
[应用2]增加工作表(Add方法)
使用Worksheets对象的Add方法增加工作表,其语法为:
[应用2]增加工作表(Add方法)
使用Worksheets对象的Add方法增加工作表,其语法为:
Worksheets.Add(Before,After,Count,Type)
其中,参数Before指定一个工作表,新增的工作表将放置在该工作表之前。参数After指定一个工作表,新增的工作表将放置在该工作表之后。这两个参数不能同时使用。若两个参数都没有使用,则新增的工作表会放置在当前工作表之前。
参数Count指定增加的工作表数目,默认值为1。参数Type指定增加的工作表类型,为XlSheetType常量之一:xlWorksheet、xlChart、xlExcel4MacroSheet或xlExcel4IntlMacroSheet,默认值为标准工作表(xlWorksheet)。如果希望基于现有模板插入工作表,则指定该模板的路径。
[应用3]复制工作表(Copy方法)
使用Copy方法复制指定的工作表,其语法为:
参数Count指定增加的工作表数目,默认值为1。参数Type指定增加的工作表类型,为XlSheetType常量之一:xlWorksheet、xlChart、xlExcel4MacroSheet或xlExcel4IntlMacroSheet,默认值为标准工作表(xlWorksheet)。如果希望基于现有模板插入工作表,则指定该模板的路径。
[应用3]复制工作表(Copy方法)
使用Copy方法复制指定的工作表,其语法为:
工作表对象.Copy(Before,After)
其中,参数Before和After均可选,用来指定所复制的工作表放置的位置,但不能同时使用这两个参数。使用参数Before将所复制的工作表放置在该参数指定的工作表之前,同理,使用参数After将所复制的工作表放置在该参数指定的工作表之后。
例如,下面的代码复制当前工作表,并将其放置在所有工作表的末尾:
例如,下面的代码复制当前工作表,并将其放置在所有工作表的末尾:
ActiveSheet.Copy After:=Worksheets(Worksheets.Count)
如果没有指定参数,那么Excel将新建一个工作簿,该工作簿包含所复制的工作表。
[应用4]移动工作表(Move方法)
使用Move方法将工作表移动到工作簿的指定位置,其语法为:
[应用4]移动工作表(Move方法)
使用Move方法将工作表移动到工作簿的指定位置,其语法为:
工作表对象.Move(Before,After)
其语法与Copy方法相同。例如,下面的代码将工作表Sheet1移到工作表Sheet3的后面:
Worksheets("Sheet1").Move After:=Worksheets("Sheet3")
[应用5]获取或者设置工作表名称(Name属性)
可以使用Name属性返回指定工作表的名称,也可以设置指定工作表的名称,例如,下面的代码将工作表Sheet1重命名为“示例”:
可以使用Name属性返回指定工作表的名称,也可以设置指定工作表的名称,例如,下面的代码将工作表Sheet1重命名为“示例”:
Worksheets("Sheet1").Name = "示例"
下面的过程使用用户输入的名称重命名当前工作表:
Sub ReNameSheet() Dim xStr As String Retry: Err.Clear xStr = InputBox("请输入工作表的新名称:" _ , "重命名工作表", ActiveSheet.Name) If xStr = "" Then Exit Sub On Error Resume Next ActiveSheet.Name = xStr If Err.Number <> 0 Then MsgBox Err.Number & " " & Err.Description Err.Clear GoTo Retry End If On Error GoTo 0 '......... End Sub
[应用6]使用工作表代码名称(CodeName属性)
工作表对象的CodeName属性返回工作表代码名称,其语法为:
工作表对象的CodeName属性返回工作表代码名称,其语法为:
工作表对象.CodeName
能够在属性窗口中设置工作表代码名称。假设我们在属性窗口将工作表Sheet1的代码名称设置为Sheet1CodeName,那么下面的两句代码是等价的:
Worksheets("Sheet1").Activate
Sheet1CodeName.Activate
当我们第一次创建工作表时,工作表名称和代码名称是相同的,然而两个名称可以各自单独修改,但是工作表代码名称仅能在设计时修改而不能在运行时修改。
[应用7]删除工作表(Delete方法)
使用Delete方法删除指定的工作表,其语法为:
[应用7]删除工作表(Delete方法)
使用Delete方法删除指定的工作表,其语法为:
工作表对象.Delete
例如,下面的语句删除工作簿中名为“示例”的工作表:
Worksheets("示例").Delete
默认情况下,在删除工作表时会显示一个对话框。此时,Delete方法返回一个布尔值,如果用户单击“取消”则返回False,单击“删除”则返回True。
[应用8]选择工作表(Select方法)
可以使用Select方法选择工作表。与Activate方法不同,使用Select方法可以同时选择多个工作表,例如下面的代码同时选择当前工作表以及索引值为1和2的工作表:
[应用8]选择工作表(Select方法)
可以使用Select方法选择工作表。与Activate方法不同,使用Select方法可以同时选择多个工作表,例如下面的代码同时选择当前工作表以及索引值为1和2的工作表:
Worksheets(1).Select (False) Worksheets(2).Select (False)
其语法为:
工作表对象.Select(Replace)
其中,参数Replace可选,设置为True时使用指定的工作表的选区代替当前选择,设置False时扩展当前所选内容以包括以前选择的对象和指定的对象。
[应用9]选择工作表(Previous属性和Next属性)
使用工作表对象的Previous属性选择指定工作表之前的工作表,例如:
[应用9]选择工作表(Previous属性和Next属性)
使用工作表对象的Previous属性选择指定工作表之前的工作表,例如:
Sub PreviousSheet() If ActiveSheet.Index <> 1 Then MsgBox "选取当前工作簿中当前工作表的前一个工作表" ActiveSheet.Previous.Activate Else MsgBox "已到第一个工作表" End If End Sub
如果当前工作表是第一个工作表,则使用Previous属性会出错。
使用工作表对象的Next属性选择指定工作表之后的工作表,例如:
使用工作表对象的Next属性选择指定工作表之后的工作表,例如:
Sub NextSheet() If ActiveSheet.Index <> Worksheets.Count Then MsgBox "选取当前工作簿中当前工作表的下一个工作表" ActiveSheet.Next.Activate Else MsgBox "已到最后一个工作表" End If End Sub
如果当前工作表是最后一个工作表,则使用Next属性会出错。
[应用10]获取工作表数(Count属性)
使用集合对象的Count属性来获取工作簿中工作表的数目。例如下面的两段代码:
[应用10]获取工作表数(Count属性)
使用集合对象的Count属性来获取工作簿中工作表的数目。例如下面的两段代码:
Sub WorksheetNum() Dim i As Long i = Worksheets.Count MsgBox "当前工作簿的工作表数为:" & Chr(10) & i End Sub Sub WorksheetNum() Dim i As Long i = Sheets.Count MsgBox "当前工作簿的工作表数为:" & Chr(10) & i End Sub
在一个包含图表工作表的工作簿中运行上述两段代码,将会得出不同的结果,原因是对于Sheets集合来讲,工作表包含图表工作表。应注意Worksheets集合与Sheets集合的区别。
[应用11]保存工作表(SaveAs方法)
使用SaveAs方法将更改后的工作表保存到另一个文件中,其语法为:
[应用11]保存工作表(SaveAs方法)
使用SaveAs方法将更改后的工作表保存到另一个文件中,其语法为:
工作表对象.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AddToMru, TextCodepage, TextVisualLayout, Local)
其中,参数FileName用来指定用来保存文件的路径及文件名,若没有包括路径,则保存在当前文件夹中。参数FileFormat指定所保存的文件格式,为XlFileFormat常量之一。参数Password指定在保存文件时用于保护文件的密码,最大可以达到15个字符,区分大小写。参数WriteResPassword指定文件的写保护密码,如果打开文件时没有输入写保护密码,那么该文件将只读。如果将参数ReadOnlyRecommended设置为True,那么在打开文件时显示一条消息,提示该文件以只读方式打开。将参数CreateBackup设置为True,创建备份文件。将参数AddToMru设置为True,添加工作簿到最近使用的文件列表中,默认为False。
[应用12]隐藏工作表(Visible属性)
可以通过将工作表对象的Visible属性设置为True或False,来控制该工作表是否可见。例如,下面的代码隐藏工作表Sheet1:
[应用12]隐藏工作表(Visible属性)
可以通过将工作表对象的Visible属性设置为True或False,来控制该工作表是否可见。例如,下面的代码隐藏工作表Sheet1:
Worksheets("Sheet1").Visible = False
当然,也可以将Visible属性设置为XlSheetVisibility值:xlSheetVisible、xlSheetHidden、xlSheetVeryHidden,来控制工作表是否可见。其中,xlSheetVisible表示显示工作表,xlSheetHidden表示隐藏工作表,但可以通过菜单命令显示工作表,xlSheetVeryHidden表示隐藏工作表,只能通过代码将Visible属性设置为True来显示工作表,此时用户无法使工作表可见。
下面的代码新建一张工作表,然后将其Visible属性设为xlVeryHidden。要引用该工作表,可使用其对象变量newSheet。
下面的代码新建一张工作表,然后将其Visible属性设为xlVeryHidden。要引用该工作表,可使用其对象变量newSheet。
Set NewSheet = Worksheets.Add NewSheet.Visible = xlVeryHidden NewSheet.Range("A1:D4").Formula = "=RAND()"
下面的代码取消隐藏工作簿中所有工作表。
Sub UnhideAllWorksheets() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets ws.Visible = xlSheetVisible Next ws Set ws = Nothing End Sub
[应用13]保护工作表(Protect方法)
使用Protect方法保护工作表,以防止被修改。其语法为:
使用Protect方法保护工作表,以防止被修改。其语法为:
工作表对象.Protect(Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows, AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows, AllowSorting, AllowFiltering, AllowUsingPivotTables)
其中,参数Password指定用于保护工作表的密码,区分大小写。设置参数DrawingObjects为True以保护形状,默认值为False。设置参数Contents为True,以保护内容,对于图表则会保护整个图表,对于工作表则会保护锁定的单元格,默认值是True。参数Scenarios设置为True以保护方案,此参数仅对工作表有效,默认值是True。
Protect方法允许单独保护单元格以免被用户和代码修改。特别地,如果参数UserInterfaceOnly设置为True,那么用户不能修改工作表,但能够通过代码修改。相反,如果参数UserInterfaceOnly设置为False(默认值),那么用户和代码都不能修改工作表。
注意,当保护工作表时,如果参数UserInterfaceOnly设置为True,然后又保存工作簿,那么再次打开该工作簿时,整张工作表将被完全保护,而不仅仅保护用户界面。要在打开工作簿后重新启用用户界面保护,必须再次将UserInterfaceOnly参数设为True并应用Protect方法。
[应用14]是否仅启用用户界面保护(ProtectionMode)
如果开启了用户界面保护,则ProtectionMode属性返回True。默认值为False。
[应用15]取消密码保护(Unprotect方法)
使用Unprotect方法取消工作表的密码保护,如果工作表没有密码保护则无效。其语法为:
Protect方法允许单独保护单元格以免被用户和代码修改。特别地,如果参数UserInterfaceOnly设置为True,那么用户不能修改工作表,但能够通过代码修改。相反,如果参数UserInterfaceOnly设置为False(默认值),那么用户和代码都不能修改工作表。
注意,当保护工作表时,如果参数UserInterfaceOnly设置为True,然后又保存工作簿,那么再次打开该工作簿时,整张工作表将被完全保护,而不仅仅保护用户界面。要在打开工作簿后重新启用用户界面保护,必须再次将UserInterfaceOnly参数设为True并应用Protect方法。
[应用14]是否仅启用用户界面保护(ProtectionMode)
如果开启了用户界面保护,则ProtectionMode属性返回True。默认值为False。
[应用15]取消密码保护(Unprotect方法)
使用Unprotect方法取消工作表的密码保护,如果工作表没有密码保护则无效。其语法为:
工作表对象.Unprotect(Password)
其中,参数Password代表用来保护工作表的密码。如果工作表有密码保护,而我们忽略此参数,那么Excel将提示用户输入密码。
[示例1]设置密码保护工作表
[示例1]设置密码保护工作表
Sub ProtectSheet() MsgBox "保护当前工作表并设定密码" ActiveSheet.Protect Password:="fanjy" End Sub
运行上述代码后,当前工作表中将不允许编辑,除非撤销工作表保护。
[示例2]撤销工作表保护
[示例2]撤销工作表保护
Sub UnprotectSheet() MsgBox "撤销当前工作表保护" ActiveSheet.Unprotect End Sub
运行上述代码后,如果原保护的工作表设置有密码,则要求输入密码。
[示例3]保护当前工作簿中的所有工作表
[示例3]保护当前工作簿中的所有工作表
Sub ProtectAllWorkSheets() On Error Resume Next Dim ws As Worksheet Dim myPassword As String myPassword = InputBox("请输入您的密码" & vbCrLf & _ "(不输入表明无密码)" & vbCrLf & vbCrLf & _ "确保您没有忘记密码!", "输入密码") For Each ws In ThisWorkbook.Worksheets ws.Protect (myPassword) Next ws End Sub
[示例4]撤销对当前工作簿中所有工作表的保护
Sub UnprotectAllWorkSheets() On Error Resume Next Dim ws As Worksheet Dim myPassword As String myPassword = InputBox("请输入您的密码" & vbCrLf & _ "(不输入表示无密码)", "输入密码") For Each ws In ThisWorkbook.Worksheets ws.Unprotect (myPassword) Next ws End Sub
[示例5]仅能编辑未锁定的单元格
Sub OnlyEditUnlockedCells() Sheets("Sheet1").EnableSelection = xlUnlockedCells ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
运行上述代码后,在当前工作表中将只能对未锁定的单元格进行编辑,而其它单元格将不能编辑。未锁定的单元格是指在选择菜单“格式——单元格”命令后在弹出的对话框中的“保护”选项卡中,未选中“锁定”复选框的单元格或单元格区域。
[应用16]打印预览工作表(PrintPreview方法)
使用PrintPreview方法完成打印预览功能,即按对象打印后的外观效果显示对象的预览。其语法为:
[应用16]打印预览工作表(PrintPreview方法)
使用PrintPreview方法完成打印预览功能,即按对象打印后的外观效果显示对象的预览。其语法为:
工作表对象.PrintPreview(EnableChanges)
其中,参数EnableChanges指定用户是否可更改边距和打印预览中可用的其他页面设置选项。
[应用17]打印工作表(Print方法)
使用Print方法打印工作表,其语法为:
[应用17]打印工作表(Print方法)
使用Print方法打印工作表,其语法为:
工作表对象.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, IgnorePrintAreas)
其中,参数From指定打印的第一页的页码,参数To指定打印的最后一页的页码,如果忽略则打印完整的对象。参数Copies指定打印的份数,默认值为1。参数Preview为True,Excel将在打印对象之前调用打印预览,如果为False(默认值),则立即打印对象。参数ActivePrinter设置活动打印机的名称。如果设置参数PrintToFile为True,则打印到文件,此时如果没有指定参数PrToFileName,Excel将提示用户输入要使用的输出文件的文件名。参数Collate设置为True,逐份打印多份副本。参数IgnorePrintAreas设置为True,则忽略打印区域并打印整个对象。
[应用18]显示数据记录单(ShowDataForm方法)
使用ShowDataForm方法显示与指定工作表相关联的数据记录单,其语法为:
[应用18]显示数据记录单(ShowDataForm方法)
使用ShowDataForm方法显示与指定工作表相关联的数据记录单,其语法为:
工作表对象.ShowDataForm
注意,宏执行到显示数据记录单语句时运行会暂停。关闭数据记录单后,宏将从ShowDataForm方法的下一语句开始继续执行。如果存在自定义数据记录单,则本方法将运行此记录单。
在Excel 2007的功能区中并没有显示记录单命令,该命令被隐藏,因此可以使用ShowDataForm方法调出记录单。
[应用19]获取工作表中已使用的区域(UsedRange属性)
使用工作表对象的UsedRange属性返回工作表中已使用的区域。该属性返回Range对象,代表当前已使用的单元格组成的矩形区域,是非常有用的属性。其语法为:
在Excel 2007的功能区中并没有显示记录单命令,该命令被隐藏,因此可以使用ShowDataForm方法调出记录单。
[应用19]获取工作表中已使用的区域(UsedRange属性)
使用工作表对象的UsedRange属性返回工作表中已使用的区域。该属性返回Range对象,代表当前已使用的单元格组成的矩形区域,是非常有用的属性。其语法为:
工作表对象.UsedRange
注意,有时虽然彻底清除了某单元格,但该属性仍返回包含该单元格的区域。
[应用20]在工作表中粘贴内容(PasteSpecial方法)
使用PasteSpecial方法以指定格式将剪贴板中的内容粘贴到工作表上。可使用本方法从其他应用程序中粘贴数据,或以特定格式粘贴数据。其语法为:
[应用20]在工作表中粘贴内容(PasteSpecial方法)
使用PasteSpecial方法以指定格式将剪贴板中的内容粘贴到工作表上。可使用本方法从其他应用程序中粘贴数据,或以特定格式粘贴数据。其语法为:
工作表对象.PasteSpecial(Format, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, NoHTMLFormatting)
经常使用的语法为:
工作表对象.PasteSpecial(Format)
其中,参数Format指定要粘贴的数据格式的字符串。
例如,下面的代码将剪贴板中的Microsoft Word文档对象粘贴到工作表Sheet1上的单元格D1中:
例如,下面的代码将剪贴板中的Microsoft Word文档对象粘贴到工作表Sheet1上的单元格D1中:
Worksheets("Sheet1").Range("D1").Select ActiveSheet.PasteSpecial Format:= _ "Microsoft Word 12.0 Document Object"
注意,在使用PastSpecial方法之前,必须选择目标区域。该方法可能会修改工作表的选定区域。
[应用21]计算工作表(Calculate方法)
可以使用Calculate方法计算指定的工作表、工作表中的单元格区域或者整个工作簿。例如,下面的代码计算工作簿中的第一张工作表:
[应用21]计算工作表(Calculate方法)
可以使用Calculate方法计算指定的工作表、工作表中的单元格区域或者整个工作簿。例如,下面的代码计算工作簿中的第一张工作表:
Worksheets(1).Calculate
[应用22]重新计算工作表(EnableCalculation属性)
当EnableCalculation属性设置为True时,在必要情况下Excel自动重新计算工作表。否则,必须请求重新计算。
当该属性第一次被设置为True时,Excel将重新计算工作表。
[应用23]控制自动筛选下拉箭头(AutoFilterMode属性)
如果当前在工作表中显示自动筛选下拉箭头,则AutoFilterMode属性为True。我们可以将该属性设置为False,移除箭头。然而,不能将该属性设置为True。要显示自动筛选下拉箭头,使用AutoFilter方法。
[应用24]工作表是否处于筛选模式(FilterMode属性)
如果工作表处于筛选模式,则FilterMode属性为True。因此,如果显示了自动筛选下拉箭头但没有发生筛选,那么AutoFilterMode属性为True而FilterMode属性为False。一旦实际上执行了筛选,那么FilterMode属性就为True。FilterMode属性指明是否由于筛选而隐藏了行。
[应用25]转换名称(Evaluate方法)
使用工作表对象的Evaluate方法将名称转换为对象或值。
[应用26]设置工作表滚动区域(ScrollArea属性)
使用ScrollArea属性返回或者设置允许滚动的区域,用户不能选择滚动区域之外的区域。设置时,必须为A1样式的单元格引用。例如,下面的代码将单元格区域A1:C50设置为允许滚动区域,仅能够在单元格区域A1:C50范围内滚动或选择单元格:
当EnableCalculation属性设置为True时,在必要情况下Excel自动重新计算工作表。否则,必须请求重新计算。
当该属性第一次被设置为True时,Excel将重新计算工作表。
[应用23]控制自动筛选下拉箭头(AutoFilterMode属性)
如果当前在工作表中显示自动筛选下拉箭头,则AutoFilterMode属性为True。我们可以将该属性设置为False,移除箭头。然而,不能将该属性设置为True。要显示自动筛选下拉箭头,使用AutoFilter方法。
[应用24]工作表是否处于筛选模式(FilterMode属性)
如果工作表处于筛选模式,则FilterMode属性为True。因此,如果显示了自动筛选下拉箭头但没有发生筛选,那么AutoFilterMode属性为True而FilterMode属性为False。一旦实际上执行了筛选,那么FilterMode属性就为True。FilterMode属性指明是否由于筛选而隐藏了行。
[应用25]转换名称(Evaluate方法)
使用工作表对象的Evaluate方法将名称转换为对象或值。
[应用26]设置工作表滚动区域(ScrollArea属性)
使用ScrollArea属性返回或者设置允许滚动的区域,用户不能选择滚动区域之外的区域。设置时,必须为A1样式的单元格引用。例如,下面的代码将单元格区域A1:C50设置为允许滚动区域,仅能够在单元格区域A1:C50范围内滚动或选择单元格:
Worksheets(1).ScrollArea = "A1:C50"
要移除单元格滚动或选择的限制,只须将该属性的值设置为空,例如:
Worksheets(1).ScrollArea = ""
注意,设置滚动区域与冻结窗格无关。
[应用27]为工作表设置背景(SetBackgroundPicture方法)
使用SetBackgroundPicture方法为工作表设置背景图片,其语法为:
[应用27]为工作表设置背景(SetBackgroundPicture方法)
使用SetBackgroundPicture方法为工作表设置背景图片,其语法为:
工作表对象.SetBackgroundPicture(FileName)
其中,参数FileName为用于背景的图片路径和名称。例如,下面的代码为第一张工作表设置背景图片:
Worksheets(1).SetBackgroundPicture "c:/graphics/watermark.gif"
[应用28] Worksheets集合与Sheets集合
对于不熟悉Excel的人来说,可能会混淆Sheets集合和Worksheets集合之间的不同。Worksheets集合包含典型的Excel工作表(即通常我们说的工作表),即包含有行、列、单元格和公式等的工作表,而Sheets集合不仅仅是工作表的集合,而且也包含其它类型的工作表,例如图表工作表、Excel 4.0宏工作表(也称作XLM文件)和Excel 5.0对话框工作表(允许创建自定义对话框)。图表工作表是占用了整个工作表的图表,而不是插入作为工作表一部分的图表。Excel 4工作表和Excel 5工作表用于保持Excel向后兼容,并且也很容易转换为新的工作表类型。进一步说,图表工作表也组成了Charts集合。
Worksheets集合的Count属性返回工作簿中工作表的数量,而Sheets集合的Count属性则返回工作簿中所有工作表的数量,包含图表工作表和工作表。例如,使用下面的语句添加指定数量的工作表到工作簿中:
Do While Worksheets.Count < 5
ThisWorkbook.Sheets.Add
Loop
添加的工作表可以是图表工作表或者是工作表,分别包含于Charts集合或Worksheets集合,或者是Sheets集合的成员。下面的代码修改工作簿中最后一个工作表的名称:
Dim wrkSheetName As String
wrkSheetName = "Sample Chart"
Sheets(Sheets.Count).Name = wrkSheetName
注意,因为使用了Sheets集合,工作簿中最后一个工作表可能是工作表也可能是图表工作表。
因为Sheets集合包含有更多类型的工作表,所以其包含的方法比Worksheets集合更多。然而,两个集合都有添加、删除、复制和移动工作表的方法。
[应用29]组合工作表
在Excel中,我们可以通过在按下Shift键或Ctrl键的同时,单击其它工作表标签来手工组合工作簿中的工作表。在VBA中,可以通过使用Worksheets集合的Select方法并结合Array函数来组合工作表。例如,下面的代码组合工作簿中的第1、第3和第5个工作表,并使第3个工作表成为活动工作表:
Worksheets(Array(1, 3, 5)).Select
Worksheets(3).Activate
也可以使用Worksheet对象的Select方法创建工作表组。首先按正常的方式选择第1个工作表,然后通过使用Select方法并将其参数Replace设置为False,从而将其他工作表添加到组中。
Sub GroupWorksheets()
Dim arrstrNames(1 To 3) As String
Dim i As Integer
arrstrNames(1) = "Sample1"
arrstrNames(2) = "Sample2"
arrstrNames(3) = "Sample3"
Worksheets(arrstrNames(1)).Select
For i = 2 To 3
Worksheets(arrstrNames(i)).Select Replace:=False
Next i
End Sub
然而,在VBA中组合工作表后,对工作表的更改将只影响活动工作表,如果需要更改其他工作表,则需要使用循环语句遍历工作表并作相应的更改。
Sub FormatWorksheetsGroup()
Dim shts As Sheets
Dim wks As Worksheet
Set shts = Worksheets(Array(1, 3, 5))
For Each wks In shts
wks.Range("A1").Value = 100
wks.Range("A1").Font.Bold = True
Next wks
End Sub
[应用30]Activate方法与Select方法的区别
当需要激活或者是选择某个工作表时,使用Sheets(1).Activate和Sheets(1).Select的作用表面上看起来是相同的。但是,如果将需要激活或者是选择的工作表隐藏后,使用Sheets(1).Select将会出现错误,而使用Sheets(1).Activate则会正常运行,例如下面的代码:
'- - - 下面的代码运行正常 - - - -
Sub test1()
Sheets(1).Visible = xlHidden
Sheets(1).Activate
End Sub
'- - - 下面的代码运行错误,作用于对象的方法无效 - - - -
Sub test2()
Sheets(1).Visible = xlHidden
Sheets(1).Select
End Sub
Activate方法是用来激活对象的方法,而Select方法是用来选取对象的方法,能使用Select方法一次选取多个工作表,但不能使用Activate方法一次激活多个工作表,一次只能激活一个工作表。详见下面的代码示例:
'- - - 下面的代码运行正常 - - - -
Sub Test3()
ActiveWorkbook.Sheets(Array(1, 2, 3)).Select
End Sub
'- - - 下面的代码运行错误,对象不支持该属性和方法 - - - -
Sub Test4()
ActiveWorkbook.Sheets(Array(1, 2, 3)).Activate
End Sub
当然,上述内容同样适用于Worksheets集合。
[应用31]工作表名称的使用
可以在代码中采用下面的三种方式引用工作表:
(1)该工作表在工作簿中的位置(索引号)。索引号自工作表标签最左边向右依次计数,最左边的是第1个工作表,依次为第2个、3个……等等。
(2)该工作表的名称,即在工作表左下角中看到的工作表标签中的名称。
(3)该工作表的对象名称,即在创建工作表时自动分配给该工作表的名称(在VBE编辑器中的工程窗口中可以看到)。
通常,在代码中引用工作表时,我们所使用的是工作表对象的Index属性和Name属性,例如 Worksheets(1).Select或者
Worksheets(”Sheet1″).Select。
但是,如果工作表的名称被改变或者工作表被重新排序或者删除其中的一些工作表后,则不能使用工作表对象的Name属性或Index属性引用所需要的工作表,这可能使已经编写好的代码出现错误。因此,我们应该考虑虽然工作簿中的工作表改变但不影响工作表引用的办法,可以使用工作表对象的名称避免这种情况,即上面所讲的第3种方式,无论是在工作簿中增加或删除其它工作表,还是对工作表排序,或者是重命名需要引用的该工作表,其对象名都不变(除非您删除该工作表,或者是在VBE窗口中重命名该对象)。工作表对象的名称可以在VBE编程器中看到。例如,Sheet1(Sheet1),左边是工作表对象的名称,右边的括号中是工作表名,括号中的工作表名可以通过在工作簿界面中改变相应的工作表标签名来改变,如果在工作表中重命名Sheet1工作表为“数据工作表”,则工程属性窗口中的名称为:Sheet1(数据工作表)。如果工作表Sheet3的对象名称是“主工作表”,而在Excel中,如果将工作表Sheet3的名称修改为“数据工作表”,在VBE编程器的工程窗口中,“Sheet3”将变成“数据工作表”,但是该工作表的对象名称仍为“主工作表”。
改变工作表对象名称的方法是,通过改变属性窗口中的(名称)或者在代码中使用Properties(”_CodeName”)。下面的代码将会添加一个工作表并将该工作表的对象名称命名为“ws_main”,这样,在后面的代码中就可以使用该对象名称来引用这个工作表,而不必担心工作表名称改变或工作表顺序改变。
Sub ChageWksObjectName()
Dim ws As Worksheet
Dim sPrevCodeName As String
Dim sNewCodeName As String
'设置新对象的名称
sNewCodeName = "ws_main"
'增加新工作表
Set ws = Worksheets.Add
'获取新增工作表的对象名称
sPrevCodeName = ws.CodeName
'变化新增工作表的对象名称
ThisWorkbook.VBProject.VBComponents(sPrevCodeName). _
Properties("_CodeName") = sNewCodeName
End Sub
Sub Test()
ws_main.Range("A1").Value = "This is it!"
End Sub
注意,虽然使用工作表代码名称有很多优点,例如不受用户更改工作表名称以及工作表顺序的影响、容易处理复制粘贴操作等,但是不可以跨工作簿使用工作表代码名称,即不能在一个工作簿中使用另一个工作簿中的工作表代码名称。
[应用32]引用工作表的方法
下面的示例简单的介绍了工作表的引用方法。在示例中,使用了工作表Sheet1。
(1)指定工作表的位置激活工作表。下面的代码激活工作簿中的第1个工作表,即工作表标签最左边的工作表。(如果增加或删除了其中某工作表,或者是对工作表进行排序后,可能引用的不是您想引用的工作表)
Sub ActivateFirstsheetInBook()
Sheets(1).Activate
End Sub
或者:
Sub ReferenceShtByIndexNumber()
Sheets(1).[A1:D4].Copy Sheets(2).[A1]
End Sub
(2)通过工作表的名称激活工作表,而不管工作表处于工作簿中的什么位置以及工作表对象的代码名称。(如果该工作表被重命名后,运行代码会出错)
Sub ActivateSheet1_1()
Sheets("Sheet1").Activate
End Sub
或者:
Sub ReferenceShtByGivenName()
[Sheet1!A1:D4].Copy [Sheet2!A1]
End Sub
(3)通过工作表对象的名称激活工作表,而不管该工作表处于工作簿中的什么位置以及该工作表的名称
Sub ActivateSheet1_2()
Sheet1.Activate
End Sub
或者:
Sub ReferenceShtByCodeName()
Sheet1.[A1:D4].Copy Sheet2.[A1]
End Sub
[应用33]判断工作簿中是否存在指定名称的工作表
[代码1]下面的函数判断是否存在指定工作表名称的工作表:
Function WorksheetExists(wb As Workbook, strName As String) As Boolean
Dim str As String
On Error GoTo worksheetExistsErr
str = wb.Worksheets(strName).Name
WorksheetExists = True
Exit Function
worksheetExistsErr:
WorksheetExists = False
End Function
如果指定名称的工作表存在,WorksheetExists函数返回True,否则返回False,表示该工作表不存在。
[代码2]下面的函数判断是否存在指定工作表代码名称的工作表:
Function WorksheetCodeNameExists(wb As Workbook, sCodeName As String) As Boolean
Dim str As String
Dim ws As Worksheet
WorksheetCodeNameExists = False
For Each ws In wb.Worksheets
If StrComp(ws.CodeName, sCodeName, vbTextCompare) = 0 Then
WorksheetCodeNameExists = True
Exit For
End If
Next
Set ws = Nothing
End Function
[代码3]下面的函数判断指定名称的工作表是否存在
Function SheetExists(SheetName As String) As Boolean
SheetExists = False
On Error GoTo NoSuchSheet
If Len(Sheets(SheetName).Name) > 0 Then
SheetExists = True
Exit Function
End If
NoSuchSheet:
End Function
[代码4]下面的函数判断指定名称的工作表是否存在
Function DoesWksExist1(sWksName As String) As Boolean
Dim i As Long
For i = Worksheets.Count To 1 Step -1
If Sheets(i).Name = sWksName Then
Exit For
End If
Next
If i = 0 Then
DoesWksExist1 = False
Else
DoesWksExist1 = True
End If
End Function
[代码5]下面的函数判断指定名称的工作表是否存在
Function DoesWksExist2(sWksName As String) As Boolean
Dim wkb As Worksheet
On Error Resume Next
Set wkb = Sheets(sWksName)
On Error GoTo 0
DoesWksExist2 = IIf(Not wkb Is Nothing, True, False)
End Function
[代码6]下面的函数判断指定名称的工作表是否存在
Function SheetExists(sname) As Boolean
'如果活动工作簿中存在该工作表则返回True
Dim x As Object
On Error Resume Next
Set x = ActiveWorkbook.Sheets(sname)
If Err = 0 Then SheetExists = True Else SheetExists = False
End Function
[代码7]下面的函数判断工作表是否存在工作簿中
Function SheetExists(SName As String, Optional wb As Workbook) As Boolean
Dim ws As Worksheet
'默认使用活动工作表
If wb Is Nothing Then
Set wb = ActiveWorkbook
End If
On Error Resume Next
SheetExists = CBool(Not wb.Sheets(SName) Is Nothing)
On Error GoTo 0
End Function
[应用34]工作表行和列的操作
[示例1] 隐藏行
Sub HideRow()
Dim iRow As Long
MsgBox "隐藏当前单元格所在的行"
iRow = ActiveCell.Row
ActiveSheet.Rows(iRow).Hidden = True
MsgBox "取消隐藏"
ActiveSheet.Rows(iRow).Hidden = False
End Sub
[示例2] 隐藏列
Sub HideColumn()
Dim iColumn As Long
MsgBox "隐藏当前单元格所在列"
iColumn = ActiveCell.Column
ActiveSheet.Columns(iColumn).Hidden = True
MsgBox "取消隐藏"
ActiveSheet.Columns(iColumn).Hidden = False
End Sub
[示例3] 插入行
Sub InsertRow()
Dim rRow As Long
MsgBox "在当前单元格上方插入一行"
rRow = Selection.Row
ActiveSheet.Rows(rRow).Insert
End Sub
[示例4] 插入列
Sub InsertColumn()
Dim cColumn As Long
MsgBox "在当前单元格所在行的左边插入一行"
cColumn = Selection.Column
ActiveSheet.Columns(cColumn).Insert
End Sub
[示例5] 插入多行
Sub InsertManyRow()
MsgBox "在当前单元格所在行上方插入三行"
Dim rRow As Long, i As Long
For i = 1 To 3
rRow = Selection.Row
ActiveSheet.Rows(rRow).Insert
Next i
End Sub
[示例6] 设置行高
Sub SetRowHeight()
MsgBox "将当前单元格所在的行高设置为25"
Dim rRow As Long, iRow As Long
rRow = ActiveCell.Row
iRow = ActiveSheet.Rows(rRow).RowHeight
ActiveSheet.Rows(rRow).RowHeight = 25
MsgBox "恢复到原来的行高"
ActiveSheet.Rows(rRow).RowHeight = iRow
End Sub
[示例7] 设置列宽
Sub SetColumnWidth()
MsgBox "将当前单元格所在列的列宽设置为20"
Dim cColumn As Long, iColumn As Long
cColumn = ActiveCell.Column
iColumn = ActiveSheet.Columns(cColumn).ColumnWidth
ActiveSheet.Columns(cColumn).ColumnWidth = 20
MsgBox "恢复至原来的列宽"
ActiveSheet.Columns(cColumn).ColumnWidth = iColumn
End Sub
[示例8] 恢复行高列宽至标准值
Sub ReSetRowHeightAndColumnWidth()
MsgBox "将当前单元格所在的行高和列宽恢复为标准值"
Selection.UseStandardHeight = True
Selection.UseStandardWidth = True
End Sub
[应用35]工作表标签操作
[示例1] 设置工作表标签的颜色
Sub SetSheetTabColor()
MsgBox "设置当前工作表标签的颜色"
ActiveSheet.Tab.ColorIndex = 7
End Sub
[示例2] 恢复工作表标签颜色
Sub SetSheetTabColorDefault()
MsgBox "将当前工作表标签颜色设置为默认值"
ActiveSheet.Tab.ColorIndex = -4142
End Sub
[示例3] 交替隐藏或显示工作表标签
Sub HideOrShowSheetTab()
MsgBox "隐藏/显示工作表标签"
ActiveWindow.DisplayWorkbookTabs = Not ActiveWindow.DisplayWorkbookTabs
End Sub
[应用36]确定打印的页数(HPageBreaks属性与VPageBreaks属性)
Sub PageCount()
Dim i As Long
i = (ActiveSheet.HPageBreaks.Count + 1) * (ActiveSheet.VPageBreaks.Count + 1)
MsgBox "当前工作表共" & i & "页."
End Sub
[应用37]排序工作表
方法1:下面是《Writing Excel Macros with VBA》中的一个示例,摘录于此。
首先验证用户是否想排序工作表,如果是则调用SortAllSheets过程来完成排序。
Sub SortSheets()
If MsgBox("想排序工作表吗?", vbOKCancel + vbQuestion, "排序工作表") = vbOK Then
SortAllSheets
End If
End Sub
下面的代码首先将工作表的名称放置在数组中,然后添加新工作表,将代表工作表名称的数组元素放置在新工作表的第1列,接着对该列排序,将排序好的元素放回数组,并删除添加的工作表,最后使用Move方法重新排列工作表,从而完成工作表排序。
Sub SortAllSheets()
'排序工作表
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range, i As Integer
Dim cSheets As Integer
Dim sSheets() As String
Set wb = ActiveWorkbook
'获取数组的实际大小
cSheets = wb.Sheets.Count
ReDim sSheets(1 To cSheets)
'使用工作表名称填充数组
For i = 1 To cSheets
sSheets(i) = wb.Sheets(i).Name
Next
'创建新的工作表并在其第一列放置名称
Set ws = wb.Worksheets.Add
For i = 1 To cSheets
ws.Cells(i, 1).Value = sSheets(i)
Next
'排序列
ws.Columns(1).Sort Key1:=ws.Columns(1), Order1:=xlAscending
'重新填充数组
For i = 1 To cSheets
sSheets(i) = ws.Cells(i, 1).Value
Next
'删除临时工作表
Application.DisplayAlerts = False
ws.Delete
Application.DisplayAlerts = True
'通过移动每个工作表到最后来重新排列工作表
For i = 1 To cSheets
wb.Sheets(sSheets(i)).Move After:=wb.Sheets(cSheets)
Next
End Sub
方法2:下面是《Mastering Excel 2003 Programming with VBA》一书中的示例,使用冒泡法排序,摘录于此。
Sub AlphabetizeWorksheets(wb As Workbook)
Dim bSorted As Boolean
Dim nSheetsSorted As Integer
Dim nSheets As Integer
Dim n As Integer
nSheets = wb.Worksheets.Count
nSheetsSorted = 0
Do While (nSheetsSorted < nSheets) And Not bSorted
bSorted = True
nSheetsSorted = nSheetsSorted + 1
For n = 1 To nSheets - nSheetsSorted
If StrComp(wb.Worksheets(n).Name, wb.Worksheets(n + 1).Name, vbTextCompare) > 0 Then
wb.Worksheets(n + 1).Move Before:=wb.Worksheets(n)
bSorted = False
End If
Next
Loop
End Sub
方法3:
Sub SortWorksheets2()
'根据字母对工作表排序
Dim i As Long, j As Long
For i = 1 To Sheets.Count
For j = 1 To Sheets.Count - 1
If UCase$(Sheets(j).Name) > UCase$(Sheets(j + 1).Name) Then
Sheets(j).Move After:=Sheets(j + 1)
End If
Next j
Next i
End Sub
方法4:
Sub SortWorksheets3()
'以升序排列工作表
Dim sCount As Integer, i As Integer, j As Integer
Application.ScreenUpdating = False
sCount = Worksheets.Count
If sCount = 1 Then Exit Sub
For i = 1 To sCount - 1
For j = i + 1 To sCount
If Worksheets(j).Name < Worksheets(i).Name Then
Worksheets(j).Move Before:=Worksheets(i)
End If
Next j
Next i
End Sub
若想排序所有工作表,将代码中的Worksheets替换为Sheets。
[应用38]删除当前工作簿中的空工作表
Sub Delete_EmptySheets()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
If Application.WorksheetFunction.CountA(sh.Cells) = 0 Then
Application.DisplayAlerts = False
sh.Delete
Application.DisplayAlerts = True
End If
Next
End Sub
[应用39]同步工作表
这是John Walkenbach的一个示例,在工作簿的所有工作表中,选择与活动工作表所选单元格区域相同的区域,并使左上角单元格为活动单元格。
Sub SynchSheets()
'选择工作簿其他工作表中与活动工作表所选单元格区域相同的区域
If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub
Dim UserSheet As Worksheet, sht As Worksheet
Dim TopRow As Long, LeftCol As Integer
Dim UserSel As String
Application.ScreenUpdating = False
'记住当前工作表
Set UserSheet = ActiveSheet
'保存当前工作表的信息
TopRow = ActiveWindow.ScrollRow
LeftCol = ActiveWindow.ScrollColumn
UserSel = ActiveWindow.RangeSelection.Address
'遍历工作表
For Each sht In ActiveWorkbook.Worksheets
If sht.Visible Then '跳过隐藏的工作表
sht.Activate
Range(UserSel).Select
ActiveWindow.ScrollRow = TopRow
ActiveWindow.ScrollColumn = LeftCol
End If
Next sht
'恢复原始的位置
UserSheet.Activate
Application.ScreenUpdating = True
End Sub
[应用40]经验提示
1、除非万不得已,使用VBA对工作表进行操作时,无须先激活该工作表。最好先声明一个代表工作表的变量,然后使用该变量来引用要操作的工作表。这样,也会使得代码的运行速度加快。
2、为使代码更健壮,应该采取预防性策略,以确定代码所操作的工作表存在,否则会因为重命名工作表或者删除工作表而引起运行时错误。
关于UsedRange属性的基本概念
UsedRange属性应用于Worksheet对象,返回Range对象,代表指定工作表中已使用的区域,即返回工作表中已使用的单元格区域。因此,该属性也可以用于选取单元格区域。
下面用一个简单的例子来说明UsedRange属性的功能。如下图1所示的工作表:
图1:一个带有数据的工作表
然后,在VBE编辑器中输入如下代码:
Sub sample01()
Worksheets("Sheet1").UsedRange.Select
End Sub
代码运行后,上面的工作表显示如下图2所示:
图2:代码运行后的工作表
即在指定工作表中(本例为工作表Sheet1)已使用的范围被全部选中。可以看出,UsedRange属性返回工作表中所有已使用范围的单元格区域,而不管该区域数据间是否有空行或空格。
UsedRange属性的一些常见用法
(1)返回工作表中已使用区域的行数或列数
语句Activesheet.UsedRange.Rows.count返回当前工作表中已使用单元格区域的行数。同样,语句Activesheet.UsedRange.Columns.count返回当前工作表中已使用单元格区域的列数。在上例中,您可以在立即窗口中输入下面语句,将返回相应的值。
?Activesheet.UsedRange.Rows.count
20
?Activesheet.UsedRange.Columns.count
4
一般写法为<在此输入引用对象>.UsedRange.Rows.Count和<在此输入引用对象>.UsedRange.Columns.Count。
(2)返回工作表中已使用单元格区域的地址
语句Activesheet.UsedRange.Address 返回当前工作表已使用单元格区域的地址。在上例中,您可以在立即窗口中输入下面语句,将返回已使用单元格区域地址为$A$1:$D$20。
?Activesheet.UsedRange.Address
$A$1:$D$20
一般写法为<在此输入引用对象>.UsedRange.Address
(3)设置工作表中已使用单元格区域对象,并进行引用或操作。如下代码所示:
Dim cellRange As Range,RowNum As Long,ColNum As Long
Set cellRange=Worksheets("Sheet1").UsedRange '设置已用单元格区域并赋值给变量
RowNum=cellRange.Rows.Count '已用单元格区域的行数
ColNum=cellRange.Columns.Count '已用单元格区域的列数
<span style="color: #0000ff;">UsedRange属性应用示例</span>
现在,我们举几个例子,进一步说明UsedRange属性的用法。
<span style="color: #0000ff;">[示例一]</span>下面的程序在活动工作表已使用单元格区域中,当该区域不包含任何公式时,清除该区域不能打印的字符。其中,ActiveSheet.UsedRange 代表当前工作表中已使用单元格区域组成的Range对象。(By Chip Pearson)
<pre lang="vb">
Sub CleanUp()
Dim TheCell As Range
For Each TheCell In ActiveSheet.UsedRange
With TheCell
If .HasFormula = False Then
.Value = Application.WorksheetFunction.Clean(.Value)
End If
End With
Next TheCell
End Sub
[示例二]下面的程序将当前工作表中已用单元格区域或所选单元格中第一个字符删除,其中,ActiveSheet.UsedRange.Address代表当前工作表中已用单元格区域的地址。
Public Sub Delete_First_Character(Optional ByRef objRange As Range = Nothing)
Dim objCell As Range
On Error Resume Next
If (objRange Is Nothing) Then
Set objRange = Application.InputBox(Prompt:="请选择单元格区域", _
Title:="删除第一个字符", _
Type:=8, _
Default:=ActiveSheet.UsedRange.Address) '设置缺省选区为已用区域
End If
Err.Clear
Set objRange = objRange.SpecialCells(xlCellTypeConstants)
If (Err.Number <> 0&) Or (objRange Is Nothing) Then
MsgBox "在指定的单元格区域中没有符合要求的单元格.", _
vbExclamation Or vbOKOnly, _
ActiveWorkbook.Name
Exit Sub
End If
On Error GoTo Exit_Delete_First_Character
Application.ScreenUpdating = False
For Each objCell In objRange
objCell = Mid$(objCell, 2)
Next objCell
Exit_Delete_First_Character:
On Error Resume Next
Application.ScreenUpdating = True
End Sub
[示例三]在本示例中,当您在工作表的E列中的单元格中输入“finish”后,点击右侧按钮,将会对此行用指定的背景色进行标识,如图3和图4。
图3:在E8单元格中输入“finish”
图4:点击按钮后的效果
当您删除单元格E6中的数据,如下图5所示。
图5:删除单元格E6中的数据
图6:点击按钮后的效果
本示例中按钮所附加的代码如下,其中,UsedRange.Rows.Count表示当前工作表中已使用区域的行数。
Private Sub CommandButton1_Click()
Dim r As Long
For r = UsedRange.Rows.Count To 1 Step -1
If Range("E" & r) = "finish" Then _
Range("A:G").Rows(r).Interior.ColorIndex = 10
Next r
For r = UsedRange.Rows.Count To 1 Step -1
If Range("E" & r) = "" Then _
Range("A:G").Rows(r).Interior.ColorIndex = 2
Next r
End Sub
[提示]您可以将此代码放置在工作表变化事件中,这样,当工作表变化时,符合条件的相应行会自动标记背景色。
[示例四]本示例演示了删除行操作,即在活动工作表已使用单元格区域中,若某单元格中包含有“AND”(如为ANDXXX或XXXANDXX或XXXAND等,不区分大小写),则删除该单元格所在行。ActiveSheet.UsedRange.Find(what)表示在当前工作表所有已使用单元格区域中查找含有变量what中的内容的单元格,程序代码如下:(by Patrick Molloy)
Sub Find_AND()
Dim rng As Range
Dim what As String
本文转自 bilinyee博客,原文链接: http://blog.51cto.com/215363/915095
如需转载请自行联系原作者