【发布时间】: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 worksheetdim claimsArray as variantset 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所有例程。就这样吧。