将数组复制到已过滤的范围会产生不合理的结果

将过滤的范围的值复制到数组似乎没有问题:数组然后包含来自过滤和未过滤的单元格的值。 但是,当我将数组的内容复制回过滤的范围时,结果对我来说是不可理解的。

这是我的代码:

Sub test() Dim rangecopy() As Variant rangecopy() = Range(Cells(2, 1), Cells(14, 3)).Value For c = LBound(rangecopy, 1) To UBound(rangecopy, 1) rangecopy(c, 1) = c rangecopy(c, 2) = c * 10 rangecopy(c, 3) = c * 100 Next Range(Cells(2, 1), Cells(14, 3)).Value = rangecopy() End Sub 

它应该给出以下结果。 这里,当macros将数组复制到该范围时,范围未经过滤。

Imgur

如果范围被D列过滤(“NO”被过滤掉),结果如下所示:

Imgur

首先,过滤后的单元格不被更新。 然后,B列中的大多数单元格从数组的第一列(4,5,6)中获取值,而另外一些则正确地从数组的第二列中获取值(10)。 最后两行填有#N / A错误。 这应该这样工作吗? 我正在使用Office 2010。

我真的很希望熟悉VBA内部工作的人能够对你的问题提供更多的见解。 我可以分享以下内容:

首先,它是按照预期工作的。 但是,我不知道为什么这是devise,也不知道在分配过程中究竟发生了什么。

有很多情况下会产生类似的问题。 例如,如果您打开了filter(某些行被隐藏)并尝试向下填充(拖动)一个公式,您将看到类似的结果,因为隐藏的行不会被填充,但会影响(相对)引用在公式。 另一方面,如果您手动复制并粘贴到已过滤的范围,则将数据粘贴到隐藏的行(如您所愿)。

看来是自动filter范围的一部分引用的任何范围实际上是非连续的*。 使用Range.Address并不总是显示这一点,也没有循环Range.Areas。 如果我们修改你的例子,我们可以看到“真实”的错误在哪里:

 Dim r1 as range Dim r2 as range Set r1 = Sheet1.Range("A1:B5") 'some numbers in a range Set r2 = Sheet2.Range("A2:B6") 'same-size range underneath a filtered header r1.Copy Destination:=r2 

它可以在所有行都可见的情况下工作。 当Sheet2上的筛选器创build隐藏的行时,结果是“运行时错误'1004':…复制区域和粘贴区域不是相同的大小和形状。 另一方面,使用“手动”/剪贴板方法适用于隐藏行:

 r1.Copy r2.PasteSpecial (xlPasteValues) 

由于将一个数组分配给一个范围绕过了剪贴板(如第一个块),所以我们应该会收到一个错误(而不是最终的错误结果)。

我知道的唯一解决scheme是循环遍历范围,并为每个单元格分配一个值:

 For i = 1 to LastRow For j = 1 to LastCol Sheet1.Cells(i,j).Value = myArr(i,j) Next Next 

或(更好)移除自动filter,将数组分配到范围,然后重新应用filter。

*从技术上说它是连续的,所以最好说范围是由几个范围/区域组成,尽pipe使用.Address并不表示这一点,当你试图循环Range.Areas时只有一个区域