vba excel使用非活动工作表的值填充数组

时间:2018-01-07 11:33:57

标签: arrays vba populate

我想用其他工作表中不同于活动工作表的范围值填充数组。我需要从许多不同的表中加载数组数据范围值,然后进行数千次操作。

我不能考虑激活工作表,使用循环,甚至更糟糕的是通过cells()访问工作表中的数据。我想写一个干净整洁的代码,避免循环以获得知识产权。

我开始时:

dim claimsarray as variant
claimsArray = Range(Cells(1, 1), Cells(a, b)).Value

a和b是整数 它似乎工作。没错。但是数组的值是空的,因为数组中填充了活动工作表的值。我希望从表格中获取值#34;声明"。

claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value

给我一​​个错误1004

在stackoverflow中寻找解决方案我尝试了以下修改:

FIRST worksheets()而不是sheets():

claimsArray = worksheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value

给我一​​个错误1004

第二

更改数组的尺寸

dim claimsarray as variant

VS

dim claimsarray() as variant

所有组合给我错误1004

在我看来,只能在活动工作表中以这种方式填充数组。所以我修改:

sheets(”claims”).activate
claimsArray = worksheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value

它有效。

问题: 如何在不使用循环的情况下从不同的工作表填充数组,而无需激活它。 为什么我不能引用其他工作表来填充数组?缺陷在哪里?只是VBA是弱代码吗?

NOTE1:

我阅读了许多关于使用范围填充数组的网站: http://www.cpearson.com/excel/ArraysAndRanges.aspx https://excelmacromastery.com/excel-vba-array/

无济于事。他们并没有真正处理这个特殊的问题。

注2: 我最终使用了典型的循环_:

For i = 1 To a
     For j = 1 To b
            claimsArray(i, j) = Sheets("claims").Cells(i, j).Value
     Next j
Next i

5行而不是1行。使代码更长,更简洁...

1 个答案:

答案 0 :(得分:2)

感谢@banana我明白将范围传递给数组的“缺陷”在哪里。

claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
当“声明”不是活动表时,

无法正常工作,因为Excel对哪个单元格实际是cells(1,1)

感到困惑 因此,优雅而有效的解决方案就是以这种方式告诉excel:

dim ST as worksheet
dim claimsArray as variant
set ST = thisworkbook.sheets("claims")
claimsArray = ST.Range(ST.Cells(1, 1), ST.Cells(a, b)).Value

这也非常重要,因为@banana在评论中指出ST初始化为引用“thisworkbook”以避免几个工作簿开放时有一张名为“声明”的表。 这整个问题可能是为什么然后用循环填充数组最终问题较少的原因。