在不同Action中访问函数返回的二维数组问题排查
你的Excel读取数组问题的排查与修复
咱们先看看你的readExcel函数里藏着的几个坑,这些才是导致你访问数组元素异常的根本原因,不是你Action里的访问方式有问题哦:
1. 没用上的Excel对象冗余代码
你创建了xlwb = createObject("excel.application")但全程没用到它,反而靠Datatable来读数据,这行代码完全可以删掉,留着只会平白占用资源。
2. 数组维度和循环逻辑的致命错误
- 你用
ReDim getCellContents(row,1)的时候搞错了VBScript数组的规则:ReDim里的参数是数组的最大索引值,不是元素个数。比如如果Datatable.GetrowCount返回3(3行数据),那这个数组的行索引会是0到3,等于多占了一个空位置。 - 最关键的是:循环里你根本没切换Datatable的行!
Datatable.Value("A","Global")默认取的是当前激活行(一开始是第1行)的值,所以循环跑完,数组里所有位置存的都是第一行的A、B列数据,完全没遍历到其他行。
3. 修正后的函数代码
把这些问题改了之后,函数应该是这样的:
Function readExcel 'Importing and Reading an Excel into 2D Array Dim xlwb, excelpath, row, i, getCellContents, originalRow excelpath = "H:/SomeExcel.xlsx" Datatable.Import excelpath ' 你原来写的filePath是笔误,得改成定义好的excelpath row = Datatable.GetRowCount originalRow = Datatable.GetCurrentRow ' 记录当前行,方便后续恢复 ' 数组行索引从0到row-1,刚好对应row行数据 ReDim getCellContents(row-1, 1) For i = 0 To row-1 Datatable.SetCurrentRow(i+1) ' Datatable的行是从1开始的,所以要+1切换行 getCellContents(i, 0) = Datatable.Value("A", "Global") getCellContents(i, 1) = Datatable.Value("B", "Global") Next Datatable.SetCurrentRow(originalRow) ' 恢复原来的行,避免影响其他操作 readExcel = getCellContents End Function
4. 关于数组访问的说明
你在Action里写的:
Dim accessArrayValues accessArrayValues = readExcel MsgBox accessArrayValues(0,0) MsgBox accessArrayValues(0,1)
这个访问方式本身是完全正确的!之前出问题只是因为函数返回的数组内容不对,现在修正函数后,这段代码就能正常弹出第一行的A、B列值了。
最后补充个小提醒:如果你的Excel里第一行是表头,那Datatable.GetRowCount会把表头也算进去,这时候你得从第2行开始读,把循环改成For i = 0 To row-2,SetCurrentRow改成i+2就行。
内容的提问来源于stack exchange,提问作者psyder
相关产品推荐
相关产品推荐

