【问题标题】:vba excel populate array with values of non active sheetvba excel用非活动工作表的值填充数组
【发布时间】:2018-06-16 15:05:22
【问题描述】:

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

我不能考虑激活工作表、使用循环,或者更糟糕的是通过单元格()访问工作表中的数据。而且我想编写一个简洁干净的代码,避免循环以获得可理解性。

我开始于:

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

a 和 b 是整数 它似乎工作。没有错误。但是数组的值是空的,因为数组中填充了活动工作表的值。我想从名为“声明”的工作表中获取值。

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

这给了我一个错误 1004

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

第一 工作表()而不是工作表():

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

给我一​​个错误 1004

第二

改变数组的尺寸

dim claimsarray as variant

dim claimsarray() as variant

所有组合都给我错误 1004

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

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

它有效。

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

注意1:

我阅读了许多关于使用范围填充数组的网站: 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 行。使代码变得如此冗长和繁琐......

【问题讨论】:

  • 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 也要注意引号,你的好像是错误的类型。
  • 它有效。我的天啊。很多。我使它更加简洁:claimsArray = Worksheets("claims").Range(Worksheets("claims").Cells(1, 1), Worksheets("claims").Cells(a, b)).Value 这样可以避免创建更多变量。所以有缺陷。在Range() excel 里面不知道cells() 是什么时不参考同一张表。所以单元格之前必须有相应的工作表。有时代码会因为不那么简洁而结束,几乎没有使用双循环那么长。
  • 我建议保留ST,并非所有内容都最好写在一个衬里。如果您以后需要更多次参考您的工作表,您最终会得到很多 thisworkbook.sheets("claims") 而不是简单的 ST 并且如果您稍后决定重命名您的工作表,您将不得不在整个过程中更改它代码而不是简单地改变第一行
  • 此外,由于我正在寻找的是代码中的简洁性,因此我也尝试了它并与sheets("claims")一起工作,这使代码更具可读性。 claimsArray = Sheets("claims").Range(Sheets("claims").Cells(1, 1), Sheets("claims").Cells(a, b)).Value
  • 这是一个很好的观点@Banana,我什至可以尝试在模块中使用public ST as worksheet所有例程。就这样吧。

标签: arrays vba populate


【解决方案1】:

感谢@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”以避免打开多个工作簿并打开名为“claims”的工作表,这也非常重要。 这整个问题可能就是为什么用循环填充数组最终是问题较少的方式。

【讨论】:

    猜你喜欢
    • 2016-11-04
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多