我想用其他工作表中不同于活动工作表的范围值填充数组。我需要从许多不同的表中加载数组数据范围值,然后进行数千次操作。
我不能考虑激活工作表,使用循环,甚至更糟糕的是通过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行。使代码更长,更简洁...
答案 0 :(得分:2)
感谢@banana我明白将范围传递给数组的“缺陷”在哪里。
claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
当“声明”不是活动表时,无法正常工作,因为Excel对哪个单元格实际是cells(1,1)
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”以避免几个工作簿开放时有一张名为“声明”的表。 这整个问题可能是为什么然后用循环填充数组最终问题较少的原因。