数据排序 您可以对Excel中的输出进行排序。将下面这两行代码放在上面的程序的末尾(我们等会儿解释这两行代码的含义),然后再次运行程序: ************************************************* Dim objRange2 As Range Set objRange2 = objExcel.Range("A1") objRange.Sort objRange2,,,,,,,1 ************************************************* 您应该看到如下图8所示的输出: 图 8. Excel 电子表格中经过排序的数据 您必须按范围对 Excel 中的数据进行排序。因而,您需要创建一个范围,它包含您想要按其进行排序的列的第一个单元格。因为我们想要按列A进行排序,所以我们创建的范围包含单个单元格:A1。下面这行代码的作用就在于此: ************************************************* Set objRange2 = objExcel.Range("A1") ************************************************* 这种 Sort 方法看起来很疯狂(这么多逗号!),但这是因为我们仅仅按单列进行排序。当您在 Excel 中对一些内容进行排序时,您必须依次指定所有的排序参数;如果您不使用参数,则将其保留为空。下表对这些参数进行了总结。 ************************************************* 参数位置 说明 1 按第一列进行排序。必须将其指定为范围。 2第一列的排序次序。将其设置为 1 表示升序(默认),将其设置为 2 表示降序。 3按第二列进行排序。必须将其指定为范围。 4不用于脚本。将其保留为空。 5第二列的排序次序。 6按第三列进行排序。必须将其指定为范围。 7第三列的排序次序。 8指示将要进行排序的数据是否有标题行。将其设置为 1,指示该数据有标题行;将其设置为 0,指示该数据没有标题行;而0可以让 Excel 确认数据是否有标题行。 ************************************************* 下面是在我们的示例代码中解释排序参数 objRange2,,,,,,,1 的方式: ************************************************* 参数 说明 objRange2按第一列进行排序。在我们的例子中,这是包含单元格 A1 的范围。 , 第一列的排序次序。我们不使用这个参数,所以将其保留为空。 , 按第二列进行排序。我们不使用这个参数,所以将其保留为空。 , 不用于脚本。将其保留为空。 , 第二列的排序次序。我们不使用这个参数,所以将其保留为空。 , 按第三列进行排序。我们不使用这个参数,所以将其保留为空。 , 第三列的排序次序。 1指示将要进行排序的数据有标题行。 ************************************************* 在稍后的代码中,我们将举例对两个不同的列进行排序。 哦,从 Active Directory 中提取数据 我们将要做的事情是编写一个程序代码来搜索 Active Directory 并提取每个用户帐号的信息;然后,我们使用这些信息来建立公司电话目录。注意,当我向您展示用于搜索 Active Directory 的代码时,我们将不会采用任何方式来讨论这些代码;毕竟,这是一个关于 Excel 的话题。(如果您想要获得更多关于使用程序代码来搜索 Active Directory 的信息,您可以参考其它一些参考资料) 首先,让我们来看一看下面这段代码,然后我们将对相关的部分做一些介绍: ************************************************* Const ADS_SCOPE_SUBTREE = 2 Sub GetDataAD() Dim objExcel As Application Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.Workbooks.Add objExcel.Cells(1, 1).Value = "Last name" objExcel.Cells(1, 2).Value = "First name" objExcel.Cells(1, 3).Value = "Department" objExcel.Cells(1, 4).Value = "Phone number" Dim objConnection, objCommand Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 100 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE objCommand.CommandText = _ "SELECT givenName, SN, department, telephoneNumber FROM " _ & "'LDAP://dc=fabrikam,dc=microsoft,dc=com' WHERE " _ & "objectCategory='user'" Dim objRecordSet Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst Dim x As Integer x = 2 Do Until objRecordSet.EOF objExcel.Cells(x, 1).Value = _ objRecordSet.Fields("SN").Value objExcel.Cells(x, 2).Value = _ objRecordSet.Fields("givenName").Value objExcel.Cells(x, 3).Value = _ objRecordSet.Fields("department").Value objExcel.Cells(x, 4).Value = _ objRecordSet.Fields("telephoneNumber").Value x = x + 1 objRecordSet.MoveNext Loop Dim objRange As Range Set objRange = objExcel.Range("A1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit Set objRange = objExcel.Range("B1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit Set objRange = objExcel.Range("C1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit Set objRange = objExcel.Range("D1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit Set objRange = objExcel.Range("A1").SpecialCells(11) Dim objRange2 As Range Set objRange2 = objExcel.Range("C1") Dim objRange3 As Range Set objRange3 = objExcel.Range("A1") objRange.Sort objRange2,,objRange3,,,,,1 End Sub ************************************************* 确实,这段代码看起来 有点复杂。但实际上,它非常简单。例如,看到了用斜体字显示的代码行了吗?嗯,现在,我们完全可以忽略它们。它们用于: 1、创建可见的 Excel 实例(您已经知道如何去做了)。 2、标记四个用于输出的列 (Last name、First name、Department、Phone number)。您也已经知道如何去做了。 3、搜索 fabrikam.com 域并检索所有用户帐号的 SN(姓或名)、givenName(名)、department 和 telephoneNumber 属性。如果您不知道如何去做,可以参考其它相关资料。 事实上,只有开始编写这些用黑体字显示的代码行之后,程序编写才开始变得有趣: ************************************************* x = 2 Do Until objRecordSet.EOF objExcel.Cells(x, 1).Value = _ objRecordSet.Fields("SN").Value objExcel.Cells(x, 2).Value = _ objRecordSet.Fields("givenName").Value objExcel.Cells(x, 3).Value = _ objRecordSet.Fields("department").Value objExcel.Cells(x, 4).Value = _ objRecordSet.Fields("telephoneNumber").Value x = x + 1 objRecordSet.MoveNext Loop ************************************************* 这是我们从 Active Directory 中实际提取数据并将其显示在 Excel 中的地方。为此,我们首先将变量 x 的值设置为 2。该变量指示电子表格中的当前行。我们为什么从第二行开始而不从第一行开始呢?其原因很简单,我们把列标题放在了第一行。因此,我们从第二行开始显示数据。 接下来,我们创建一个循环来循环显示返回记录集中的所有记录。循环中的第一个命令是: ************************************************* objExcel.Cells(x, 1).Value = _ objRecordSet.Fields("SN").Value ************************************************* 这段代码选择第 2 行(用 x 表示)第 1 列,并且将该值设置为 objRecordSet.Fields("SN")。这是记录集中第一个用户的 SN(姓)。然后,脚本转到第 2 行第 2 列,并且将该单元格的值设置为用户的 givenName(名)。在为 department 和 telephoneNumber 执行了相同的操作之后,脚本将 x 增加 1(从而使 x = 3)。然后,它循环处理记录集中的下一个记录,并将数据显示在第 3 行中。这样继续下去,直到所有的用户数据都添加到电子表格中为止。 换句话说,就是您从Active Directory 中提取数据并将其显示在 Excel 中。您首先检索数据,然后简单地将指定单元格的值设置为从 Active Directory 中提取的值。通过使用简单的 Do Loop 循环并将行号每次增 1,您可以显示记录集中的每一项的信息。就是这么简单! 脚本的剩余部分纯粹就是点缀了。例如,这段代码将活动范围设置为单元格 A1,选择整个列,然后使用 Autofit 方法来重新设置该列的大小,这样所有的数据就都可以显示在屏幕上。该代码然后对列 B、C 和 D 重复这个过程。 ************************************************* Set objRange = objExcel.Range("A1") objRange.Activate Set objRange = objExcel.ActiveCell.EntireColumn objRange.Autofit ************************************************* 代码的最后四行对所有的返回数据进行排序,首先按部门名称进行排序,然后按姓进行排序。程序首先创建包含所有数据的范围,然后为单元格 C1(按第一列进行排序)和单元格 A1(按第二列进行排序)创建单独的范围。此时,程序调用 Sort 方法,将单独的范围对象作为参数传入。(相信我:这听起来虽然有点复杂,但是它真的非常简单!) 如果您在填充了电子表格之后想要自动保存它,该怎么做呢?如果与这个例子的情况一样,就只要在脚本的末尾加上下面这段代码就行了;这三行代码将电子表格保存为 C:\Scripts\Phone_Directory.xls 并退出Excel 应用程序: ************************************************* Set objWorkbook = objExcel.ActiveWorkbook objWorkbook.SaveAs("C:\Scripts\Phone_Directory.xls") objExcel.Quit ************************************************* 如果不想退出Excel 实例,只要不加上最后一行就可以了。 记住,您并不限于显示 Excel 中的 Active Directory 信息。例如,下面是一个非常简单的 WMI 脚本程序,它检索运行在计算机上的所有服务的状态和名称,然后将这些信息显示在 Excel 中。 ************************************************* Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.Workbooks.Add x = 1 strComputer = "." Set objWMIService = GetObject _ ("winmgmts:\\" & strComputer & "\root\cimv2") Set colServices = objWMIService.ExecQuery _ ("Select * From Win32_Service") For Each objService in colServices objExcel.Cells(x, 1) = objService.Name objExcel.Cells(x, 2) = objService.State x = x + 1 Next ************************************************* 虽然相当简单,但是它为您提供了一些创建脚本程序的基础。 文档示例见
bi9zgqa5.rar
(10.45 KB, 下载次数: 740)
By fanjy in 2006-6-23
|