使用 VBA 数组函数对过滤数据进行数据损坏

Posted

技术标签:

【中文标题】使用 VBA 数组函数对过滤数据进行数据损坏【英文标题】:Data corruption using VBA array function on filtered data 【发布时间】:2021-05-04 05:36:08 【问题描述】:

制作一个非常简单的电子表格

在其上运行以下代码。它只是将工作表复制到一个数组然后再返回。它不应该对工作表产生任何影响。

Option Explicit

Sub Test()
    Dim vArr As Variant
    
    ' Copy the contents of the sheet to a 2D variant array
    vArr = Sheets("Sheet1").Cells(1, 1).CurrentRegion
    
    ' Copy the variant array back to the sheet
    Sheets("Sheet1").Cells(1, 1).Resize(UBound(vArr, 1), UBound(vArr, 2)) = vArr
    
    ' There should be no difference to the sheet
End Sub

一切正常。现在过滤工作表并排除第 2 行(或实际上任何其他行)

再次运行代码,你会得到一团糟:

这是一个错误还是这里有一些更深层次的哲学在起作用?有没有办法解决这个问题,除了清除过滤器。

更新 我还要注意隐藏行和过滤行之间存在差异。如果您隐藏一行,则代码可以正常工作。它似乎只与过滤有关。

【问题讨论】:

appear 将成为.Value 的特性之一,它返回的内容(包括隐藏行的整个数组)不是它愿意接受的内容(忽略过滤的行)。 有点无关紧要,但不应该是Sheets("Sheet1").Cells(1, 1).Resize(UBound(vArr), 3) 吗? @QHarr 我相信这个想法是只更新前两列。这确实无关紧要,因为问题也发生在中间 Redim Preserve vArr(1 to 4, 1 to 2) 上。 同意与效果无关。我没有意识到意图是只更新两列。我的错。 @QHarr。你是对的,我已经更新了问题,但问题仍然存在。 【参考方案1】:

如果您将 VBA 脚本更改为使用 for 循环,则可以解决此问题。

稍微修改你的VBA脚本我没有看到你上面提到的问题。

Option Explicit

Sub Test()
    Dim vArr As Variant
    
    ' Copy the contents of the sheet to a 2D variant array
    vArr = Sheets("Sheet1").Cells(1, 1).CurrentRegion


    ' Copy the variant array back to the sheet
    'Sheets("Sheet1").Cells(1, 1).Resize(UBound(vArr, 1), UBound(vArr, 2)) = vArr

    Dim row As Integer
    Dim col As Integer
    
    For row = 1 To UBound(vArr, 1)
    
        For col = 1 To UBound(vArr, 2) 
            'Debug.Print vArr(row, col)
            Sheets("Sheet1").Cells(row, col) = vArr(row, col)
        Next col
    Next row
    ' There should be no difference to the sheet
End Sub

【讨论】:

- 不幸的是,这种方法也消除了使用变体数组带来的所有性能改进。对于大型表,差异是巨大的。

以上是关于使用 VBA 数组函数对过滤数据进行数据损坏的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Excel VBA 中对数组进行切片?

如何从 VBA 中的两个数组函数获取单个数组输出?

vba代码求助,将修改区域复制到数组中?

用于自动筛选排序 SortFields 的 VBA 不使用其他列排序进行排序

PHP 数组过滤空值 array_filter

如何将 CSV 数据导入多个数组并通过 VBA 中的函数或子函数返回多个数组?