社区楼道文化墙效果图:Workbook对象与示例

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 00:15:43

Workbooks集合
Application对象有一个Workbooks属性,可以返回一个Workbooks集合,该集合包含所有当前已打开的Excel中的Workbook对象。例如,下面的代码将显示所打开的工作簿的数量:
‘********************************************************************
Sub testWorkbookCount()
  Dim wbs As Workbooks
  Set wbs=Application.Workbooks
  MsgBox wbs.Count
End Sub
‘********************************************************************
下面让我们来看看Workbooks对象的一些属性和方法。
Add方法
Add方法创建一个新的工作簿,并添加到Workbooks集合中,新工作簿成为活动工作簿。其语法为:
工作簿对象.Add(Template)
在这里,可选参数Template决定如何创建新工作簿。如果该参数为一个指定已存在的Excel模板文件名称的字符串,那么新工作簿将以该文件作为模板创建。
正如您所知道的,一个模板是一个包含目录(例如行和列标签)、格式、宏和其它定制的内容(例如菜单和工具条)的Excel工作簿。当您以一个模板为基础创建一个新工作簿时,该工作簿将从模板中接受目录、格式和定制的内容。
Template参数也可以是下面的常量之一:
Enum xlWBATemplate
      xlWBATWorksheet=-4167
      xlWBATChart=-4109
      xlWBATExcel4MacroSheet=3
      xlWBATExcel4IntlMacroSheet=4
End Enum
在这种情况下,新工作簿将包含有指定类型的单个工作表。如果省略Template参数,那么Excel将创建一个新工作簿,该工作簿带有由Application对象的SheetsInNewWorkbook属性所设置数量的空白工作表。
Close方法
Close方法关闭所有打开的工作簿。其语法为:
    工作簿对象.Close
Count属性
大多数集合对象都有一个Count属性,Workbooks集合也不例外。该属性将返回当前已打开的工作簿的数量。
Item属性
Item属性返回Workbooks集合中特定的工作簿。例如:
    Workbooks.Item(1)
返回Workbooks集合中的第一个工作簿。由于Item属性是缺省属性,因此我们也能简写为:
    Workbooks(1)
注意,我们不能依赖特定的工作簿在集合中的索引号来指定工作簿(对所有的集合对象也如此),您最好使用工作簿的名字指明特定的工作簿,如下所示:
Workbooks(“Book1.xls”)
注意,如果用户使用“文件”菜单中“新建”命令创建了一个名为Book2的新工作簿,我们应使用下面的代码指定该工作簿:
Workbooks(“Book2”)
但是,如果您在保存刚新建的工作簿Book2到您的硬盘中之前运行下面的代码:
Workbooks(“Book2.xls”)
将会产生一个错误(下标越界)。
Open方法
该方法打开一个已存在的工作簿,其语法稍微有点复杂:
工作簿对象.Open(FileNaem,UpdateLinks,ReadOnly,Format,Password, _
WriteResPassWord,IgnoreReadOnlyRecommended,Origin,Delimiter, _
Editable,Notify,Converter,AddToMRU)
在这些参数中,大多数参数很少用到(例如,几个与打开文本文件有关的参数)。下面我们讨论一些常用的参数,并且在VBA帮助系统中有更多关于这些参数的信息。注意,所有的参数中,除了FileName外都是可选的。
参数FileName是所要打开的工作簿的文件名称。如果想要以只读的方式打开工作簿,则可将ReadOnly参数设置为True。
如果需要用密码来打开工作簿,则PassWord参数应该设置为该密码。如果需要使用密码而您没有指定密码,Excel将弹出对话框询问密码。
参数AddToMru指定将工作簿添加到最近使用的文件列表中,建议您将该参数值设置为True以添加该工作簿到最近使用的文件列表中,该参数的缺省值为False。
OpenText方法
这个方法将在一个新工作簿中装入文本文件。该方法分析文本数据并将其放入一个单独的工作表中。其语法稍微有点复杂:
工作簿对象.OpenText(Filename,Origin,StartRow,DataType,TextQualifier, _
ConsecutiveDelimiter,Tab,Semicolon,Comma,Space,Other,OtherChar,FieldInfo)
首先要注意的是,除了参数FileName外,该方法的所有参数都是可选的。
参数Filename指定要打开的文本文件的文件名。
参数Origin指定文本文件的来源,可以是下面的XlPlatform常量之一:
Enum XlPlatform
      xlMacintosh=1
      xlWindows=2
      xlMSDOS=3
End Enum
注意,xlWindows的值指定一个ANSI文本文件,而xlMSDOS常量指定一个ASCⅡ文件。如果省略该参数,则需要使用文本导入向导中的文件源选项的当前设置。
参数StartRow指定从文本文件中开始进行分析的文本的行号,缺省值是1。
可选参数DataType指定在字段中的文本格式,可以是下面的XlTextParsingType常量之一:
Enum XlTextParsingType
      xlDelimited=1 ‘缺省值
      xlFixedWidth=2
    End Enum
参数TextQualifier是文本限定符,要以是下面的XlTextQualifier常量之一:
Enum XlTextQualifier
      xlTextQualifierNone=-4142
      xlTextQualifierDoubleQuote=1 ‘缺省值
      xlTextQualifierSingleQuote=2
End Enum
参数ConsecutiveDelimiter应该设置为True,以考虑用连续分隔符作为一个分隔符。缺省的值为False。
有几个参数需要将参数DataType设置为xlDelimited。当这些参数中的任何一个设置为True时,表示Excel应该使用与文本分隔符相应的字符,这些分隔符描述如下:(所有参数缺省值均为False)
Tab 该参数设置为真时,将使用制表符作为分隔符
Semicolon 该参数设置为真时,将使用分号作为分隔符
Comma 该参数设置为真时,将使用逗号作为分隔符
Space 该参数设置为真时,将使用空格作为分隔符
Other 该参数设置为真时,将使用被参数OtherChar指定的字符作为分隔符
当参数Other设置为真时,通过OtherChar指定分隔符。如果参数OtherChar包含多于一个字符时,仅仅使用第一个字符。
参数FieldInfo是一个包含单一来源列信息的数组,该参数的解释依赖于参数DataType的值。
当参数DataType的值为xlDelimited时,参数FieldInfo应该是一个数组,该数组的大小应该与被转换数据的列的数量相同或更小。一个二维数组的第一维是列数(起始数为1),第二维是下面的数值之一,用来指明如何分析列:
数值     描述
1          通常的
2          文本
3          MDY 日期格式
4          DMY 日期格式
5          YMD 日期格式
6          MYD 日期格式
7          DYM 日期格式
8          YDM 日期格式
9          跳过列
如果提供给二维数组的列找不到了,那么该列将被分析为通常的设置。例如,下面参数FieldInfo的值导致第一列为文本,而第三列被跳过:
Array(Array(1,2),Array(3,9))
所有其它的列被视为通常的数据。
下面以一个实例证明,考虑有下面内容的文本文件:(将其存放在D盘的excel文件夹中,并命名为temp.txt)
    "John","Smith","Serial Record",1/2/98
"Fred","Gwynn","Serial Order Dept",2/2/98
"Mary","Davis","English Dept",3/5/98
"David","Johns","Chemistry Dept",4/4/98
下面的代码:
Sub test()
  Workbooks.OpenText Filename:="D:/excel/temp.txt", _
  Origin:=xlMSDOS, _
  StartRow:=1, _
  DataType:=xlDelimited, _
  TextQualifier:=xlTextQualifierDoubleQuote, _
  ConsecutiveDelimiter:=True, _
  Comma:=True, _
  FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 6))
End Sub
运行上面的代码后,将生成如下图2所示的工作表。注意,D列中的单元格作为日期格式化。
 
图2 一个逗号分隔符文本文件在Excel中打开示例
另一方面,如果参数DataType的值是xlFixedWidth,则每个二维数组的第一个元素指定字符在列中开始的位置(0是第一个字符),第二个元素指定分析选项(1-9)在列中的结果,各项数值所代表的结果描述如上。
为了证实上述描述,考虑有下面内容的文本文件:(将其存放在D盘的excel文件夹中,并命名为temp.txt)
0-125-689
2-523-489
3-424-664
4-125-160
下面的代码:
Sub test()
  Workbooks.OpenText Filename:="D:/excel/temp.txt", _
  Origin:=xlMSDOS, _
  StartRow:=1, _
  DataType:=xlFixedWidth, _
  FieldInfo:=Array(Array(0, 2), Array(1, 9), Array(2, 2), Array(5, 9), Array(6, 2))
End Sub
运行上面的代码后,将生成如下图3所示的工作表。(注意,如何使用数组跳过这些连字符)

图3 一个固定宽度文本文件在Excel中被打开示例
最后,观察在Excel中打开的文本文件,并没有转换为Excel工作簿文件。为了保存为Excel工作簿文件,我们能使用SaveAs方法,如下所示:
Application.ActiveWorkbook.SaveAs _
 Filename:="D:/excel/temp.xls", FileFormat:=xlWorkbookNormal
将上面的代码加入上述两个子程序最后即可。 

Workbook对象
一个Workbook对象代表一个打开的Excel工作簿,正如我们已讨论过的,Workbook对象存储在Workbooks集合中。
Workbook对象共有103个属性和方法,如下表1。
表1   Workbook对象成员列表


_CodeName                                      FullName                                           RefreshAll
_PrintOut                                    FullNameURLEncoded       RejectAllChanges
_Protect                                    HasMailer                                          ReloadAs
_ReadOnlyRecommended  HasPassword                    RemovePersonalInformation
_SaveAs                                   HasRoutingSlip                               RemoveUser
AcceptAllChanges                             HighlightChangesOnScreen        Reply
AcceptLabelsInFormulas                HighlightChangesOptions             ReplyAll
Activate                                                HTMLProject                ReplyWithChanges
ActiveChart                        IsAddin                          ResetColors
ActiveSheet                       IsInplace                       RevisionNumber
AddToFavorites                KeepChangeHistory  Route
Application                        Keywords                      Routed
Author                                LinkInfo                         RoutingSlip
AutoUpdateFrequency            LinkSources        RunAutoMacros
AutoUpdateSaveChanges     ListChangesOnNewSheet       Save
BreakLink                       Mailer                    SaveAs
BuiltinDocumentProperties   MergeWorkbook  SaveCopyAs
CalculationVersion         Modules                Saved
CanCheckIn                  MultiUserEditing   SaveLinkValues
ChangeFileAccess                 Name                      Sblt
ChangeHistoryDuration         Names                   SendForReview
ChangeLink             NewWindow              SendMail
Charts                       OnSave                       SendMailer
CheckIn         OnSheetActivate        SetLinkOnData
Close                        OnSheetDeactivate   SetPasswordEncryptionOptions
CodeName              OpenLinks                 Sheets
Colors                       Parent                         ShowConflictHistory
CommandBars      Password        ShowPivotTableFieldList
Comments             PasswordEncryptionAlgorithm   SmartTagOptions
ConflictResolution   PasswordEncryptionFileProperties  Styles
Container                   PasswordEncryptionKeyLength   Subject
CreateBackup           PasswordEncryptionProvider   TemplateRemoveExtData
Creator                       Path                            Title
CustomDocumentProperties      PersonalViewListSettings          Unprotect
CustomViews           PersonalViewPrintSettings    UnprotectSharing
Date1904                   PivotCaches                              UpdateFromFile
DeleteNumberFormat     PivotTableWizard             UpdateLink
DialogSheets                    Post                                    UpdateLinks
DisplayDrawingObjects  PrecisionAsDisplayed    UpdateRemoteReferences
Dummy16               PrintOut                         UserControl
Dummy17               PrintPreview                 UserStatus
EnableAutoRecover  Protect                       VBASigned
EndReview                 ProtectSharing         VBProject
EnvelopeVisible           ProtectStructure       WebOptions
Excel4IntlMacroSheets        ProtectWindows      WebPagePreview
Excel4MacroSheets             PublishObjects  Windows
ExclusiveAccess                 PurgeChangeHistoryNow   Worksheets
FileFormat                           ReadOnly                      WritePassword
FollowHyperlink                  ReadOnlyRecommended       WriteReserved
ForwardMailer                     RecheckSmartTags       WriteReservedBy


表1中所列的一些成员仅返回Workbook对象的子对象,这些子对象见图4。
表2给出了返回子对象的Workbook对象的成员。
 
图4  Workbook对象的子对象
表2 返回子对象的Workbook对象成员
名称                   返回类型


ActiveChart        Chart
Application         Application
Charts                Sheets
CustomViews   CustomViews
DialogSheets    Sheets
Excel4IntlMacroSheets  Sheets
Excel4MacroSheets       Sheets
Mailer                  Mailer
Modules             Sheets
Names               Names
NewWindow      Window
PivotCaches      PivotCaches
PublishObjects PublishObjects
RoutingSlip        RoutingSlip
Sheets                Sheets
SmartTagOptions  SmartTagOptions
Styles                 Styles
WebOptions      WebOptions
Windows            Windows
Worksheets       Sheets


在表2中有一些项目值得注意。首先,ActiveSheet属性可能返回Chart对象或者Worksheet对象,这取决于当前工作簿中所激活的是哪类对象。
第二,Charts、Sheets和Worksheets属性都返回一个(不同的)Sheets集合。特别地,Charts对象返回在工作簿中包含所有图表工作表的Sheets集合(这不包括嵌入在工作表中的图表)。Worksheets属性返回在工作簿中所有工作表的Sheets集合。最后,Sheets属性返回所有工作表和图表工作表的Sheets集合。这是一个相当少的一个集合包含多于一类对象的例子。注意,在Excel对象模型中没有Sheet对象。
下面,让我们介绍表1中一些常用的成员。
Activate方法
该方法激活工作簿,语法很简单:
Workbooks(“MyWorkBook”).Activate
注意,Workbooks集合是全局的,不需要用Application进行限定。
Close方法
Close方法的作用是关闭工作簿。它的语法是:
工作簿对象.Close(SaveChange,FileName,RouteWorkbook)
注意,Workbook对象的Close方法有三个参数,与Workbooks集合中的Close方法没有参数不一样。
可选参数SaveChanges用于在关闭工作簿前保存工作簿所发生的变化,特别地,如果工作簿没有变化,该参数将被忽略。如果工作簿显现在其它打开的窗口中,该参数也被忽略。另一方面,如果工作簿发生了变化且没有显现在任何其它打开的窗口中,该参数将生效。
在这种情况下,如果SaveChanges的值为True,将存储该变化。如果仍没有一个文件名与工作簿相联系(也就是说,如果先前该工作簿没有保存),那么将使用在参数FileName中所设置的名称。如果参数FileName也被忽略,Excel将提示用户输入一个文件名。如果参数SaveChanges的值为False,则工作簿所发生的变化不会被保存。最后,如果参数SaveChanges被忽略,Excel将显示一个对话框询问是否保存工作簿所发生的变化。简而言之,该方法的行为正如你所希望的。
可选参数RouteWorkbook指出工作簿传送的问题,如果您对该参数感兴趣,可以在ExcelVBA帮助文件中获得更多的信息。
很重要的是,您要注意Close方法检查工作簿的Saved属性,以决定是否去提示用户保存工作簿所发生的变化。如果我们设置Saved属性的值为True,那么Close方法将没有警告而直接关闭工作簿,不会保存工作簿所发生的任何变化。
DisplayDrawingObjects属性
该属性返回或者设置一个值,表示如何显示形状,可以是下面的XlDisplayShapes常量之一:
Enum XlDisplayShapes
      XlDisplayShapes=-4101
      xlPlaceholders=2
      xlHide=3
End Enum
FileFormat属性(只读)
该属性返回工作簿文件格式或者类型,可以是下面的XlFileFormat常量之一:
Enum XlFileFormat
xlAddIn = 18
xlCSV = 6
xlCSVMac = 22
xlCSVMSDOS = 24
xlCSVWindows = 23
xlCurrentPlatformText = -4158
xlDBF2 = 7
xlDBF3 = 8
xlDBF4 = 11
xlDIF = 9
xlExcel2 = 16
xlExcel2FarEast = 27
xlExcel3 = 29
xlExcel4 = 33
xlExcel4Workbook = 35
xlExcel5 = 39
xlExcel7 = 39
xlExcel9795 = 43
xlHtml = 44
xlIntlAddIn = 26
xlIntlMacro = 25
xlSYLK = 2
xlTemplate = 17
xlTextMac = 19
xlTextMSDOS = 21
xlTextPrinter = 36
xlTextWindows = 20
xlUnicodeText = 42
xlWebArchive = 45
xlWJ2WD1 = 14
This is the xlWJ3 = 40
xlWJ3FJ3 = 41
xlWK1 = 5
xlWK1ALL = 31
xlWK1FMT = 30
xlWK3 = 15
xlWK3FM3 = 32
xlWK4 = 38
xlWKS = 4
xlWorkbookNormal = -4143
xlWorks2FarEast = 28
xlWQ1 = 34
xlXMLSpreadsheet = 46
End Enum
Name,FullName,Path属性
Name属性返回工作簿的名字,Path属性返回工作簿文件路径,FullName属性返回工作簿文件完整的描述(路径和文件名)。所有这些属性都是只读的。
注意,使用如下代码:
Application.Path
将返回Excel应用程序路径(而不是工作簿路径)。
HasPassword属性(只读/布尔值)
如果工作簿有密码保护,则该只读属性值为True。注意,密码能作为SaveAs方法中的一个参数被指定。
PrecisionAsDisplayed属性(可读写/布尔值)
当该属性的值为True时,在工作簿进行计算时,将仅使用工作表中所显示的数值进行计算,而不是它实际所存诸的值。该属性的缺省值为False,工作表计算基于它们所存储的数值。
PrintOut方法
PrintOut方法打印完整的工作簿。(该方法也应用于一些其它的对象,诸如Range、Worksheet、Chart)其语法为:
    工作簿对象.PrintOut(From,To,Copies,Preview,ActivePrinter,PrintToFile,Collate)
注意,该方法的所有参数均是可选的。
参数From指定需要打印第一页的页码,参数To指定要打印的最后一页。如果忽略这些参数,将打印整个对象(如范围、工作表等)。
参数Copies指定要打印副本的数量,缺省值为1。
将参数Preview设置为True,将弹出打印预览而不是立即打印,缺省值为False。
参数ActivePrinter设置活动打印机的名字。另一方面,设置参数PrintToFile的值为True将导致Excel打印到一个文件,Excel将提示用户该输出文件的名字。(不巧的是,没有办法用代码指定所要输出文件的名字)。
应该设置参数Collate的值为True,以逐份打印每份副本。
PrintPreview方法
该方法产生Excel的打印预览功能,其语法是:
工作簿对象.PrintPreview
注意,PrintPreview方法应用到与PrintOut方法相同的一组对象。
Protect方法
该方法保护工作簿,以便它不能被修改。其语法为:
工作簿对象.Protect(Password,Structure,Windows)
该方法也应用于图表或者工作表,但语法略有不同。
可选参数Password指定一个密码(对大小写敏感),如果忽略该参数,工作簿没有被保护,不需要密码。
设置可选参数Structure的值为True,以保护工作簿的结构——也就是说,在工作簿中工作表的相关位置,缺省值为False。
设置可选参数Windows的值为True,以保护工作簿窗口,缺省值为False。
ReadOnly属性(只读/布尔值)
如果工作簿作为只读被打开,则该属性的值为True。
RefreshAll方法
该方法更新工作簿中所有外部数据区域和数据透视表,其语法为:
工作簿对象.RefreshAll
Save方法
该方法保存工作簿中的任何变化。其语法为:
工作簿对象.Save
SaveAs方法
该方法在指定的文件中保存工作簿所发生的变化。其语法为:
Expression.SaveAs(Filename,FileFormat,Password,WriteResPassword, _
ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution, _
AddToMru,TextCodePage,TextVisualLayout
)
参数Filename指定使用保存到磁盘中的文件名,如果没有包括路径,Excel将使用当前文件夹。
参数FileFormat指定所使用保存文件时的文件格式,其值为我们在前面的FileFormat属性中所介绍过的XlFileFormat常量之一。
参数Password在保存文件时用来指定密码,能使用的任何字符,区分大小写但不得超过15个字符。
参数WriteResPassword是一个字符串,指定文件的写保护密码。如果一个文件带有写保护密码保存,当下一次没有提供密码打开该文件时,该文件将以只读方式打开。
我们可以设置参数ReadOnlyRecommended的值为True,当文件打开时显示一个消息。建议文件以只读方式找开。
设置参数CreateBackup的值为真,以创建一个备份文件。
参数AccessModeConflictResolution指定共享问题,您能在ExcelVBA帮助系统中找到详细的介绍。
设置参数AddToMru的值为True,以添加工作簿到最近使用的文件列表中,缺省值为False。
其它参数不会在英文版的Excel中使用。
SaveCopyAs方法
该方法保存工作簿的一份副本,但不会修改已打开的工作簿。其语法为:
工作簿对象.SaveCopyAs(Filename)
参数Filename指定原文件副本的文本名。
Saved属性(可读写/布尔值)
如果工作簿自上次保存以来没有发生任何变化,则该属性值为True。注意,该属性的值是可读写的,这意味着我们能设置该属性的值为True,即使该工作簿在上次保存之后发生过变化。正如前面所介绍过的,我们能设置该属性的值为True,关闭被修改过的工作簿,而不提示保存当前已发生的变化。


Workbook对象的子对象
图5所显示的是Workbook对象的子对象(该图为图4的重复)。
 
图5  Workbook对象的子对象
让我们快速地介绍一下这些子对象中的一部分。(我们将在本书稍后部分介绍Window对象、Worksheet对象和WorkbookEvents对象)
CustomView对象
CustomViews属性返回CustomViews集合,在该集合中的每一个CustomView对象代表工作簿的自定义预览。CustomView对象是相当简单的,因此,我们将只介绍一个示例。如图6所示的工作表。
 
图6  CustomView对象示例
如果我们使用Autofilter命令对年份进行筛选,则结果如图7所示。
 
图7  筛选后的结果
下面的代码将这个自定义的视图命名为View1998:
    ThisWorkbook.CustomViews.Add "View1998"
现在我们可以使用下面的代码在任何时间显示该视图:
    ThisWorkbook.CustomViews!View1998.Show
或者:
    strView = "View1998"
    tiveWorkbook.CustomViews(strView).Show
Names集合
与Application对象一样,Workbook对象有一个Name属性,返回一个Names集合,该集合代表与工作簿相关的Name对象。要详细了解Name对象的信息,请参见第16章Application对象。
Sheets集合
Sheets属性返回一个Sheets集合,包含在工作簿中每个工作表中的Worksheet对象和每个图表工作表中的Chart对象。我们将在本书稍后的章节介绍Worksheet对象和Chart对象。
Styles集合和Style对象
一个Style对象代表单元格区域一组格式选项。每个工作簿有一个Styles集合,包含该工作簿所有Styles对象。
为了对某单元格区域应用样式,我们可以编写下面的代码:
RangeObject.Style=styleName
在这里,StyleName是某样式的名称。
为了创建一个Style对象,可以使用Add方法,其语法为:
工作簿对象.Add(Name,BasedOn)
注意,Add方法返回新创建的Style对象。
参数Name指定样式的名称。可选参数BaseOn指定某Range对象,该对象指向所运用样式的单元格作为新样式的基础,如果忽略该参数,新创建的样式以Normal(正常)样式为基础。
注意,根据文档资料,如果样式所指定的名称已存在,则Add方法将基于在参数BaseOn中所指定的单元格重新定义已存在的样式。(然而,在我的系统中,Excel报出了一个错误信息,因此您应仔细检查。)
Style对象的属性代表了不同的格式特征,诸如字体名称、字体大小、数字格式、对齐,等等。也有几个内置的样式,诸如Normal、Currency和Percent,这些内置的样式能在Style对话框中的Style名称框找到(在格式菜单下)。
下面举一个例子。示例代码将创建一个样式,然后应用它到当前工作表中一个独立的范围中:
‘********************************************************************
Sub test3()
  Dim st As Style
 '如果样式已存在则删除
  For Each st In ActiveWorkbook.Styles
    If st.Name = "Bordered" Then st.Delete
  Next
 '创建样式
  With ActiveWorkbook.Styles.Add(Name:="Bordered")
    .Borders(xlTop).LineStyle = xlDouble
    .Borders(xlBottom).LineStyle = xlDouble
    .Borders(xlLeft).LineStyle = xlDouble
    .Borders(xlRight).LineStyle = xlDouble
    .Font.Bold = True
    .Font.Name = "Arial"
    .Font.Size = 36
  End With
  '应用样式
  Application.ActiveSheet.Range("A1:B3").Style = "Bordered"
End Sub
‘********************************************************************


示例:对工作簿中的工作表排序
让我们添加一个新的功能到我们的SRXUtils应用程序中。如果您要处理带有多个工作表(工作表和图表工作表)的工作簿,则您可能想按字母顺序排列工作表。
对工作表进行排序的基本代码是Move方法,其语法是:
    SheetsObject.Move(Before,After)
当然,为了有效地使用该方法,我们需要工作表名称的排序列表。
第一步是通过对新的功能添加一个新行来增加DataSheet工作表,如图8所示。(在DataSheet工作表中行的顺序是基于我们想显现在自定义菜单中的项目的顺序。)
 
图8  增加的DataSheet工作表
下一步,我们插入一个名为basSortSheets的代码模块,它将包含实现这个功能的代码。
在basSortSheets模块中包括两个过程。第一个过程验证用户是否真的想排序工作表,如果想排序工作表的话,调用第二个过程去完成该项工作。第一个过程见示例1,将在图8中显示对话框。
示例1:SortSheets过程
‘********************************************************************
Sub SortSheets()
  If MsgBox("Sort the sheets in this workbook?", _
    vbOKCancel + vbQuestion, "Sort Sheets") = vbOK Then
      SortAllsheets
  End If
End Sub
‘********************************************************************
产生动作的过程见示例2。该过程首先在数组中收集工作表的名称,接着在新的工作表中放置该数组,然后使用Sort方法(应用于Range对象,将在第19章中介绍)对这些名称排序。接着,用排序好的数据重新填充数组。最后,使用Move方法重新排列这些工作表。
示例2:SortAllSheets过程
‘********************************************************************
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
‘********************************************************************
一旦代码插入完成后,您能保存SRXUtils.xls工作簿作为一个加载宏。不要忘记了首先要卸载该加载宏,否则Excel将会报错。