您好,脚本专家!

您好,脚本专家!

欢迎来到 TechNet 专栏,在这里,Microsoft 脚本专家将为您解答与系统管理脚本编写有关的各种常见问题。如果遇到系统管理脚本编写方面的问题,请将电子邮件发送到 scripter@microsoft.com。我们不能保证回答收到的所有问题,但是我们将尽最大的努力。

同时,不要忘了查看您好,脚本专家!存档

今日问题:在 Excel 电子表格中,如何找到并替换特定计算机的信息?


如何找到并替换电子表格中特定项目的信息?

问:

您好,脚本专家!在 Excel 电子表格中,如何找到并替换特定计算机的信息?

-- BB

答:

您好,BB。俗话说的好“如果您只有一把铁锤,那么所有东西看起来都像是钉子”。目前,我们脚本专家只有一些用于修改数据库中记录的代码。那么猜猜看:对我们来说,所有东西看起来都像是数据库,包括您的 Excel 电子表格。

然而幸运的是,实际上可以使用数据库所用的技巧来处理 Excel 电子表格。然而我们并非必须使用这种方法回答您的问题,使用某些数据库基本命令似乎要比通过编写一长串代码来打开电子表格、搜索所需计算机、弄清所在的行和列、更改数据,保存电子表格等等要简单得多。到底有多简单?就是这么简单:

On Error Resume Next

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=C:\Scripts\Inventory.xls;" & _
        "Extended Properties=""Excel 8.0;HDR=Yes;"";" 

objRecordset.Open "Select * FROM [Sheet1$]", _
    objConnection, adOpenStatic, adLockOptimistic, adCmdText

strSearchCriteria = "Name = 'atl-fs-01'"
objRecordSet.Find strSearchCriteria

objRecordset("IPAddress") = "192.168.1.100"
objRecordset.Update

objRecordset.Close
objConnection.Close

在讨论脚本之前,我们应该指出的是,对于此示例脚本,我们假设您的电子表格十分简单,类似以下电子表格:

您好,脚本专家!


正如您所见,这个电子表格只有两个字段:NameIPAddress。当然,您绝非只能使用两个字段;我们使用小电子表格是为了使脚本尽量简单(也为了尽量缩小屏幕快照)。您可以使用任意数量的字段(或者至少可以等同于 Excel 中的列数)。

还应指出的是,我们不会详细解释今天的脚本;因为在 Office Space(英文)文章中已有详细阐述。我们将重点阐述更新电子表格的代码,有关可将 Excel 视为数据库的 ADO(ActiveX 数据对象)代码的详细信息,仅建议您参阅 Office Space 文章。

脚本首先定义了三个常量,这三个常量用于建立与电子表格的 ADO 连接。在创建 ADODB.ConnectionADODB.Recordset 对象实例之后,我们使用下面这行看似繁冗的代码建立与 Excel 电子表格的连接:

objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=C:\Scripts\Inventory.xls;" & _
        "Extended Properties=""Excel 8.0;HDR=Yes;"";"

我们讲过,不必考虑(至少现在不用)Provider 和 Extended 属性之类的因素;而只需将 Data Source(数据源)设置为 Excel 电子表格的路径即可,无需其他。

连接到电子表格之后,我们用下面这行代码选中全部记录(即电子表格中的所有行):

objRecordset.Open "Select * FROM [Sheet1$]", _
    objConnection, adOpenStatic, adLockOptimistic, adCmdText

请注意,在 Select 语句中,我们选择存储数据的工作表;此例中为 Sheet1,因此我们指定 [Sheet1$]。如果要从已重命名为 Computers 的工作表获取信息怎么办?没关系;只需相应更改查询即可:

objRecordset.Open "Select * FROM [Computers$]", _
    objConnection, adOpenStatic, adLockOptimistic, adCmdText

查询将生成一个记录集,其中包含有关电子表格中列出的所有计算机的信息。这没什么关系,只不过我们只关注一台计算机:atl-fs-01。因此我们使用以下两行代码,定义搜索条件并找到 atl-fs-01 的记录:

strSearchCriteria = "Name = 'atl-fs-01'"
objRecordSet.Find strSearchCriteria

执行 Find 方法时,光标就会定位在 atl-fs-01 的记录处。(顺便说一下,如果数据库中找不到名为 atl-fs-01 的计算机,将会出错。正因如此,您可能想在脚本的某处实施某些错误处理。)找到所需记录后,该怎么办呢?噢,当然,我们做下面的事情:

objRecordset("IPAddress") = "192.168.1.100"
objRecordset.Update

我们要做的是将一个新值赋予 IPAddress 属性;请注意,我们不必为指定要将新值分配给哪台计算机而担心。为什么?原因很简单:Find 方法已经为我们找到了该计算机的位置。分配了新 IP 地址后,我们调用 Update,将更改内容写入数据库。在本例中,这就相当于更改电子表格中的相应单元格。

这样真的行吗?请您自己判断吧:

您好,脚本专家!


是的,我们知道:我们一开始建议您使用 ADO 更新 Excel 电子表格时也认为自己不可思议。但正如您所见,ADO 的效果很好,而且我们只需进行很少的操作。实际上,如果我们真可以只使用 ADO 就钉好所有钉子,我们就可以轻松地回家了。谁想用数据库来换锤子?


更多信息

欢迎访问您好,脚本专家!- 存档

返回页首返回页首