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