因为循环运行需要很长时间



在Macro中,我使用以下代码自动填充列。Excel工作表有近90000行,但它需要一个多小时才能完成。除了For Loop之外,还有其他方法吗。

有人能指导我吗?

为了参考,我在自动填充方法的链接中附上了一个示例快照。

[https://i.stack.imgur.com/k4Wu9.png][1]

irow10 = ActiveSheet.Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row

For i = 1 To irow10
If ActiveSheet.Cells(i, 4) = "" Then
ActiveSheet.Cells(i, 4).Value = ActiveSheet.Cells(i - 1, 4)
End If
Next

正如我之前所写:首先尝试powerquery。

如果你想保留VBA,那么你应该使用一个数组来执行";变换";然后写回纸张

Sub fillDown()
Dim lastRow As Long
lastRow = ActiveSheet.Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row
Dim rgData As Range
Set rgData = ActiveSheet.Cells(1, 4).Resize(lastRow)
Dim arrData As Variant
arrData = rgData.Value
Dim i As Long
For i = 2 To lastRow
If arrData(i, 1) = vbNullString Then
arrData(i, 1) = arrData(i - 1, 1)
End If
Next
rgData.Value = arrData
End Sub

为什么不使用一个简单的Excel公式呢?

我刚刚创建了一个Excel表格,其中包含以下数据:

Col1 Col2
A       1
B       2
C       <BLANK>
A       1
B       2
C       <BLANK>
A       1
B       2
C       <BLANK>
...
(up to 97345 cells (you mentioned 90k))

然后,我选择了下一列中的所有单元格,并编写了以下公式:

=IF(ISBLANK(B2),A2,B2)

之后,我按Ctrl+ENTER键在所有选定的单元格中输入该公式。

我得到了以下结果:

Col1 Col2        Col3
A       1           1
B       2           2
C       <BLANK>  C
A       1           1
B       2           2
C       <BLANK>  C
A       1           1
B       2           2
C       <BLANK>  C
...

这是在几秒钟内完成的!

我也记录了我的动作,最后我得到了这样一个宏(经过一些编辑(:

Sub Macro1()
Range("C2:C97345").FormulaR1C1 = "=IF(ISBLANK(RC[-1]),RC[-2],RC[-1])"
End Sub

执行这个宏甚至不需要一秒钟。

最新更新