vba excel 用非活动值填充数组 sheet
vba excel populate array with values of non active sheet
我想用与活动范围不同的 sheet 范围内的值填充一个数组。我确实需要将来自许多不同 sheet 的值加载到数组中,然后进行数千次操作。
我不能考虑激活 sheets,使用循环,或者更糟糕的是通过 cells() 访问 sheets 中的数据。而且我想编写一个整洁干净的代码,避免循环以提高可理解性。
我开始于:
dim claimsarray as variant
claimsArray = Range(Cells(1, 1), Cells(a, b)).Value
a和b是整数
它似乎工作。没有错误。但是数组的值是空的,因为数组中填充了活动 sheet 的值。我想从名为 "claims" 的 sheet 中获取值。
claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
这给我一个错误 1004
在Whosebug中寻找解决方案我尝试了以下修改:
第一个
worksheets() 而不是 sheets():
claimsArray = worksheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
给我一个错误 1004
第二个
更改数组的维度
dim claimsarray as variant
对
dim claimsarray() as variant
所有组合都出现错误 1004
在我看来,您只能在活动 sheet 中以这种方式填充数组。所以我修改:
sheets(”claims”).activate
claimsArray = worksheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
有效。
问题:
如何在不使用循环且无需激活它的情况下从不同的 sheet 填充数组。
为什么我不能引用其他 sheet 来填充数组?漏洞在哪里?只是 VBA 是弱代码吗?
注1:
我在许多网站上阅读了有关使用范围填充数组的信息:
http://www.cpearson.com/excel/ArraysAndRanges.aspx
https://excelmacromastery.com/excel-vba-array/
无济于事。他们并没有真正处理这个特殊的问题。
注2:
我最终使用了典型的 loop_:
For i = 1 To a
For j = 1 To b
claimsArray(i, j) = Sheets("claims").Cells(i, j).Value
Next j
Next i
5 行而不是一行。使代码变得更长更笨重...
感谢@banana,我明白了 "the flaw" 将范围传递给数组的位置。
claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
当 "claims" 不是活动 sheet 时, 无法正常工作,因为 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" 以避免打开多个工作簿并具有名为 [=22= 的 sheet ].
这整个问题可能就是为什么最后用循环填充数组是问题较少的方法的原因。
我想用与活动范围不同的 sheet 范围内的值填充一个数组。我确实需要将来自许多不同 sheet 的值加载到数组中,然后进行数千次操作。
我不能考虑激活 sheets,使用循环,或者更糟糕的是通过 cells() 访问 sheets 中的数据。而且我想编写一个整洁干净的代码,避免循环以提高可理解性。
我开始于:
dim claimsarray as variant
claimsArray = Range(Cells(1, 1), Cells(a, b)).Value
a和b是整数 它似乎工作。没有错误。但是数组的值是空的,因为数组中填充了活动 sheet 的值。我想从名为 "claims" 的 sheet 中获取值。
claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
这给我一个错误 1004
在Whosebug中寻找解决方案我尝试了以下修改:
第一个 worksheets() 而不是 sheets():
claimsArray = worksheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
给我一个错误 1004
第二个
更改数组的维度
dim claimsarray as variant
对
dim claimsarray() as variant
所有组合都出现错误 1004
在我看来,您只能在活动 sheet 中以这种方式填充数组。所以我修改:
sheets(”claims”).activate
claimsArray = worksheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
有效。
问题: 如何在不使用循环且无需激活它的情况下从不同的 sheet 填充数组。 为什么我不能引用其他 sheet 来填充数组?漏洞在哪里?只是 VBA 是弱代码吗?
注1:
我在许多网站上阅读了有关使用范围填充数组的信息: http://www.cpearson.com/excel/ArraysAndRanges.aspx https://excelmacromastery.com/excel-vba-array/
无济于事。他们并没有真正处理这个特殊的问题。
注2: 我最终使用了典型的 loop_:
For i = 1 To a
For j = 1 To b
claimsArray(i, j) = Sheets("claims").Cells(i, j).Value
Next j
Next i
5 行而不是一行。使代码变得更长更笨重...
感谢@banana,我明白了 "the flaw" 将范围传递给数组的位置。
claimsArray = sheets(“claims”).Range(Cells(1, 1), Cells(a, b)).Value
当 "claims" 不是活动 sheet 时, 无法正常工作,因为 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" 以避免打开多个工作簿并具有名为 [=22= 的 sheet ]. 这整个问题可能就是为什么最后用循环填充数组是问题较少的方法的原因。