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

Arrays vba excel使用非活动工作表的值填充数组,arrays,vba,populate,Arrays,Vba,Populate,我想用其他工作表中与活动工作表不同的范围值填充数组。我确实需要将来自许多不同工作表的数据范围值加载到数组中,然后进行数千次操作 我不能考虑激活工作表、使用循环,或者更糟糕的是通过单元格访问工作表中的数据()。我想写一个整洁干净的代码,避免智能化的循环 我从以下几点开始: dim claimsarray as variant claimsArray = Range(Cells(1, 1), Cells(a, b)).Value a和b是整数 它似乎起作用了。没有错误。但是数组的值为空,因为数组中

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

我不能考虑激活工作表、使用循环,或者更糟糕的是通过单元格访问工作表中的数据()。我想写一个整洁干净的代码,避免智能化的循环

我从以下几点开始:

dim claimsarray as variant
claimsArray = Range(Cells(1, 1), Cells(a, b)).Value
a和b是整数 它似乎起作用了。没有错误。但是数组的值为空,因为数组中填充了活动工作表的值。我想从一张名为“索赔”的表格中获取这些值

这给了我一个错误1004

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

首先 工作表()而不是工作表():

给我一个错误1004

第二

更改阵列的尺寸标注

dim claimsarray as variant
vs

所有的组合给我错误1004

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

sheets(”claims”).activate
claimsArray = worksheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
它起作用了

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

注1:

我阅读了许多关于使用范围填充数组的网站:

无济于事。他们并没有真正解决这个问题

注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行。由于@banana,我理解了将范围传递给数组的“缺陷”在哪里

claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
“claims”不是活动工作表时无法正常工作,因为Excel会混淆哪个单元格实际上是
单元格(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”,以避免打开多个工作簿,其中包含一个名为“claims”的工作表,这一点也非常重要。
这整个问题可能就是为什么用循环填充数组最终问题较少的原因。

dim ST as worksheet
dim claimsArray as variant
set ST=thiswook.sheets(“索赔”)
claimsArray=ST.Range(ST.Cells(1,1),ST.Cells(a,b)).Value
请注意引号,您的引号似乎是错误的类型。它有效。天啊。真是太多了。我让它更简洁:
claimsArray=Worksheets(“claims”).Range(Worksheets(“claims”).Cells(1,1),Worksheets(“claims”).Cells(a,b))。值以这种方式避免创建更多变量。因此,存在缺陷。在
范围内()
excel不知道什么是
单元格()。因此,单元格必须在相应的工作表之前。还有一种情况是,代码结束时不够简洁,几乎没有使用双循环那么长。我建议保留
ST
,并不是所有内容都最好用一行程序编写。如果您以后需要更多地参考工作表,您将得到大量的
此工作簿.sheets(“索赔”)
而不是简单的
ST
,如果您以后决定重命名工作表,您将不得不在整个代码中对其进行更改,而不是简单地更改第一行,由于我所关注的是代码的简洁性,所以我也尝试了一下,并使用了
表单(“索赔”)
,这使得代码更具可读性
claimsArray=Sheets(“claims”).Range(Sheets(“claims”).Cells(1,1),Sheets(“claims”).Cells(a,b)).Value
这是一个非常好的观点@Banana我甚至可以尝试在模块中与所有例程一起使用
public ST as worksheet
。就这样吧。
For i = 1 To a
     For j = 1 To b
            claimsArray(i, j) = Sheets("claims").Cells(i, j).Value
     Next j
Next i
claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
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