使用 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 数组函数对过滤数据进行数据损坏的主要内容,如果未能解决你的问题,请参考以下文章