您好,脚本专家!

您好,脚本专家!

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

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

今日问题:如何确定 Excel 电子表格中的最后一行?


如何确定 Excel 电子表格中的最后一行?

问:

您好,脚本专家!如何确定 Excel 电子表格中的最后一行?如果我不知道从哪一行开始添加数据,我就无法将数据添加到文件中。

-- TGW

答:

您好,TGW。您要知道,这正是脚本专家与世界上其他人有所区别的原因所在。大多数人都会与您做相同的事情:一边看着他们的电子表格,一边想着,“那么,我如何知道从何处开始呢?毕竟,我想确保我这样做是对的。”脚本专家可不会提出这种问题。相反,脚本专家很可能会继续运行脚本,然后这样说:“哎哟:我想知道我是否确实应该这样做。”

注意:是的,就在我们这样想的同时,有一位脚本专家编写了一个脚本,该脚本用于打开一个文本文件,然后用一组新数据替换该文件的现有内容。您想知道出了什么问题吗?由于未加思考以及没有仔细检查他的操作,这位脚本专家无意中键入了他的脚本的名称以作为要打开文本文件的名称。他的脚本开始运行,忠实地打开 .vbs 文件,然后用本应该存储在单独文本文件中的一组数据替换了其所有未备份的脚本代码。再见了,.vbs 文件。

不,他并没有感到特别难过。毕竟,对于这位脚本专家来说,这只是在办公室里度过的不同寻常的一天,并非天天如此。

反过来说,即使脚本专家常常有点冲动和不负责任,但实际上,我们是知道如何按照正确方法进行操作的;只是我们不想费神去做。但是,您没有必要像我们那样(谢天谢地!)。相反,您可以使用下面这样的脚本,将光标定位在 Excel 电子表格中的下一个可用行:

Const xlCellTypeLastCell = 11

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Activate

Set objRange = objWorksheet.UsedRange
objRange.SpecialCells(xlCellTypeLastCell).Activate

intNewRow = objExcel.ActiveCell.Row + 1
strNewCell = "A" &  intNewRow

objExcel.Range(strNewCell).Activate

在我们对其进行解释之前,先来看看示例电子表格的外观:

Microsoft Excel


现在,我们并非是向您展示这个我们引以为豪的示例电子表格。(尽管细想起来,它确实相当漂亮,不是么?)而我们想要指出的是,这个电子表格中含有一些空白行。这重要吗?可能很重要。例如,可以利用脚本来实现“Ctrl+向下箭头”的功能。这可以帮助您确定电子表格中的最后一行 ...,当然前提是电子表格中没有空白行。但在我们的示例电子表格中,无法利用脚本来实现“Ctrl+向下箭头”的功能:这是因为“Ctrl+向下箭头”将在第一个空白行处停止,也就是它将认为第 5 行是电子表格中的最后一行。这就是我们没有使用能够实现“Ctrl+向下箭头”功能的脚本的原因。

顺便说一下,这也是我们没有仅检查 A 列单元格(无论哪一个)的值是否为空就调用它的原因。在类似这样的电子表格中,有些行在 A 列中根本没有任何值。

那我们的脚本做什么呢?嗯,它首先定义了一个名为 xlCellTypeLastCell 的常量,并将其值设置为 11。我们稍后将讨论它的意义。然后,我们使用下面几行代码创建一个 Excel.Application 对象的运行(和可见)实例,打开文件 C:\Scripts\test.xls,然后创建一个对 Sheet 1 的对象引用:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Activate

现在,应该卷起袖子开始工作了。我们首先要做的就是发出下面这条命令:

Set objRange = objWorksheet.UsedRange

为什么?我们很高兴您这样问。UsedRange 是一个工作表属性,代表其中含有数据的整个单元格区域。例如,假定我们有一张电子表格,在单元格 A1 和 Z37 中存在数据。使用的范围将是什么?该范围将从单元格 A1 开始,在单元格 Z37 结束,且包括这两个单元格之间的所有单元格。

此处的关键在于使用的范围包括电子表格中含有数据的最后一行。您可能想起来了,这正是我们正在寻找的那一行。现在的问题是:我们如何指出哪一行是最后一行?

方法如下。我们首先使用 SpecialCellsActivate 方法将光标移至范围中的最后一个单元格,并使该单元格成为活动单元格。下面就是使用常量 xlCellTypeLastCell 的位置,它会指示脚本转至范围中的最后一个单元格:

objRange.SpecialCells(xlCellTypeLastCell).Activate

它所做的全部事情就是将光标放在范围的最后一个单元格中。但是,我们仍然不知道这个单元格的行号,这意味着我们还是不知道哪一个是电子表格中的第一个可用行。那么,以下代码就来解决这个问题:

intNewRow = objExcel.ActiveCell.Row + 1
strNewCell = "A" &  intNewRow

在第一行中,我们获取活动单元格的 Row 属性的值,并将其加 1。为什么?嗯,在我们的示例电子表格中,范围中的最后一个单元格(现在是活动单元格)位于第 16 行。如果我们将该值加 1,那么我们将得到第 17 行,这正好是电子表格中的下一个可用行。在下一行,我们构建了一个包括字母 A 和行号的单元格地址。在本例中,即是单元格 A17,它代表我们向电子表格添加数据时的起始位置。

最后,我们创建一个包括单元格 A17 的新的范围对象,并使用 Activate 方法使得 A17 成为活动单元格。这样即可将光标移至单元格 A17,我们可以进行工作了。(不过这一次,至少这一次不必说“哎哟:我想知道我是否确实应该这样做?”)


更多信息

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

返回页首返回页首