您好,AH。显然,没有一位脚本专家需要节食(打消这个念头!),但我们的确知道有一个历史悠久的节食策略的理论是小口小口地吃:而不是几大口就吞完食物,您要细嚼慢咽,您嚼的次数越多,身体就越会觉得饱了。说实话,我们不知道小口吃的策略是否可以有效节食,但是,对于在 Excel 中从一列数据生成一个数组,它确实很有效。
那么在本例中小口吃的策略是什么呢?我们不知道如何获取一列中的所有数据,也不知道如何只用一行代码,就神奇地将其转换为一个数组。不过没关系,因为可以很容易地从一个单元格中获取一个值,将该值存储在数组中,然后获取下一个单元格中的值,将其存储在数组中,如此反复。换句话说,我们通过一个一个获取电子表格中的数据来生成数组,如下所示:
Dim arrExcelValues()
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:/Scripts/Test.xls")
objExcel.Visible = True
i = 1
x = 0
Do Until objExcel.Cells(i, 1).Value = ""
ReDim Preserve arrExcelValues(x)
arrExcelValues(x) = objExcel.Cells(i, 1).Value
i = i + 1
x = x + 1
Loop
objExcel.Quit
For Each strItem in arrExcelValues
Wscript.Echo strItem
Next
在使用该代码之前,我们应该注意到:我们假定了您有一个电子表格(在该电子表格中要被检索的数据是在 A 列中);除此之外,我们还假定数据是从 A1 单元格开始的,并向下延续,并且在整列中没有空白单元格。
如果您的电子表格与上述不一样(例如,如果它有一个标题行或包括空白单元格),则您必须根据情况相应地调整代码。
现在,让我们看看那段代码。我们先定义了一个名为 arrExcelValues 的动态数组,正如您可能预料到的,我们将使用从电子表格获取的值填充该数组。
Dim arrExcelValues()
然后创建 Excel.Application 对象的一个实例,使用 Open 方法来打开文件 C:/Scripts/Test.xls,再将 Visible 属性设置为 True(这样我们就能够从屏幕上看到电子表格了)。
接下来分别向两个计数器变量 i 和 x 赋值,如下所示:
i = 1
x = 0
我们将使用 i 来跟踪我们在电子表格中的位置;因为我们的数据是从第 1 行开始的,所以将该值设置为 1。同时,我们将使用 x 来跟踪我们在数组 arrExcelValues 中的位置。因为数组中第一项始终是 0 项,所以我们将 x 的起始值设置为 0。
接下来构建一个 Do Until 循环,该循环将一直循环下去,直到遇到 A 列中的空白单元格;该代码行如下所示:
Do Until objExcel.Cells(i, 1).Value = ""
在该循环中,我们使用 ReDim Preserve 方法来调整数组 arrExcelValues 的大小(并将当前所有数据保存在该数组中)。向 ReDim Preserve 传递值 x,它表示数组的大小。然后将该数组中当前项的值设置为电子表格的单元格 A1(第 1 行,第 1 列)的值。
ReDim Preserve arrExcelValues(x)
arrExcelValues(x) = objExcel.Cells(i, 1).Value
换句话说,第一次执行循环时,我们获取了单元格(第 1 行,第 1 列)的值并将其存储为数组项 0。明白了吗?然后将两个变量的值递增一:
i = i + 1
x = x + 1
为什么会是这样?因为第二次执行循环时,i 将等于 2,这意味着我们将获取第 2 行第 1 列的值。同样,x 的值将为 1,这意味着我们将向数组中的项 1 赋值(因为数组中的第一项为项 0,数组中的第二项只能为项 1。)然后递增变量、再循环,重复该过程。该过程将一直继续,直到遇到 A 列中的空白单元格。
一旦遇到了空白单元格,我们将调用 Quit 方法来关闭 Excel 实例,然后使用一个简单的 For Each 循环来回显 arrExcelValues 中的项,这只不过是表明我们确实使用电子表格中的值生成了一个数组:
For Each strItem in arrExcelValues
Wscript.Echo strItem
Next
快速、简单,保证吃不胖噢。您还能要求什么呢?