在条件之后replacemultidimensional array中的元素

我想在一个不同的数组中满足条件时replace数组中的值。

这是我想要做的代码不起作用:

Dim rng As Variant rng = Range("A1:C20").Value Dim reset As Variant reset = Range("D1:F20").Value Dim newrng As Variant newrng = Range("G1:I20").Value For i = LBound(rng, 1) To UBound(rng, 1) For j = LBound(rng, 2) To UBound(rng, 2) Do Until reset(i, j) = "1" rng(i, j) = rng(i, j) Loop rng(i, j) = newrng(i, j) 'here is where I'm not sure to have a loop or what Next Next 

播种我想要做的是这样的是保持相同,直到一个条件满足的复位行,一旦这个条件得到满足,从该单元格向前,我想要replace行中的剩余值是从newrng。 我有不同的代码,通过单独计算每个单元格的工作,但是当我在900,000个单元格上这样做时,这是非常低效的。

不要一直设置rng(i,j)= rng(i,j),使用IF

  For i = LBound(rng, 1) To UBound(rng, 1) For j = LBound(rng, 2) To UBound(rng, 2) If reset(i, j) = "1" rng(i, j) = newrng(i, j) Next Next 

如果重置每行只出现一次,您可以设置一个布尔标志

  Dim useNewrng as Boolean useNewrng = false For i = LBound(rng, 1) To UBound(rng, 1) For j = LBound(rng, 2) To UBound(rng, 2) If reset(i, j) = "1" then useNewrng = true If useNewrng then rng(i, j) = newrng(i, j) Next useNewrng = false 'reset on row change Next 

我已经做了一些改变

  • testing每行在循环之前包含条件
  • 不需要在variables数组上使用Lbound ,因为它始终为1
  • Value2稍快于Value
  • 条件满足 ,代码开始在列上进行replace

 Sub a() Dim rng As Variant Dim reset As Variant Dim newrng As Variant Dim bFound As Boolean Dim bTest As Boolean Dim StrFind As String rng = Range("A1:C20").Value2 reset = Range("D1:F20").Value2 newrng = Range("G1:I20").Value2 StrFind = 1 For i = 1 To UBound(rng, 1) bTest = False bFound = IsEmpty(Filter(Application.Index(rng, i), StrFind, True)) If Not bFound Then For j = 1 To UBound(rng, 2) If bTest Then rng(i, j) = newrng(i, j) If reset(i, j) = StrFind Then bTest = True Next End If Next End Sub