【问题标题】:How to run this code faster如何更快地运行此代码
【发布时间】:2015-03-08 09:35:58
【问题描述】:

我有这段代码,内容是:在没有公式的单元格中填充公式,然后复制/粘贴这些单元格整行的值。我使用了 2 次“For Next”,第一次用于填充公式,第二次用于粘贴值

Sub CDPSKoCongThuc()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
    Dim RowNKC As Integer
    RowNKC = Range("CuoiNKC").Row - 1
    Dim RowCDPS As Integer
    RowCDPS = Range("CuoiCDPS").Row - 1
    Dim i As Integer
    Dim x As Integer
    For i = 9 To RowCDPS
        If Cells(i, 9).HasFormula = False Then
            Cells(i, 7).FormulaR1C1 = "=SUMIF(NKC!R9C12:R" & RowNKC & "C12,CDPS!RC[-6],NKC!R9C15:R" & RowNKC & "C15)"
            Cells(i, 8).FormulaR1C1 = "=SUMIF(NKC!R9C13:R" & RowNKC & "C13,CDPS!RC[-7],NKC!R9C15:R" & RowNKC & "C15)"
            Cells(i, 9).FormulaR1C1 = "=ROUND(SUMIF(NKC!R9C12:R" & RowNKC & "C12,CDPS!RC[-8],NKC!R9C14:R" & RowNKC & "C14),0)"
            Cells(i, 10).FormulaR1C1 = "=ROUND(SUMIF(NKC!R9C13:R" & RowNKC & "C13,CDPS!RC[-9],NKC!R9C14:R" & RowNKC & "C14),0)"

            Cells(i, 11).FormulaR1C1 = "=MAX(RC[-8]+RC[-4]-RC[-3]-RC[-7],0)"
            Cells(i, 12).FormulaR1C1 = "=MAX(RC[-4]+RC[-8]-RC[-5]-RC[-9],0)"
            Cells(i, 13).FormulaR1C1 = "=ROUND(MAX(RC[-8]+RC[-4]-RC[-7]-RC[-3],0),0)"
            Cells(i, 14).FormulaR1C1 = "=ROUND(MAX(RC[-4]+RC[-8]-RC[-5]-RC[-9],0),0)"
        End If
    Next i

'Paste Values Formula

    For x = 9 To RowCDPS
        If Cells(x, 9).Font.Bold = False And Len(Cells(x, 1).Value) > 3 Then
            Rows(x).EntireRow.Copy
            Rows(x).PasteSpecial xlPasteValues
        End If
    Next x

Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我不会全部写出来,但您可以使用 VBA 进行计算并将值放入单元格中,这样您就不必粘贴值或使用 excel 计算。

    例如...

      Cells(i, 11).FormulaR1C1 = "=MAX(RC[-8]+RC[-4]-RC[-3]-RC[-7],0)"
    

      Cells(i, 11) = Application.Max(Cells(i, 3) + Cells(i, 7) - Cells(i,8) -Cells(i, 4), 0)
    

    您还应该为每个工作表创建一个变量并使用它们来引用单元格,以便更清晰地阅读

    Dim shCDPS as Worksheet
    Dim shNKC as worksheet
    
    Set shCDPS = Sheets("CDPS")  
    Set shNKC = Sheets("NKC")  
    

    那么这个公式

     Cells(i, 7).FormulaR1C1 = "=SUMIF(NKC!R9C12:R" & RowNKC & "C12,CDPS!RC[-6],NKC!R9C15:R" & RowNKC & "C15)" 
    

    会变成

    shCDPS.Cells(i, 7) = Application.SumIf(shNKC.Range("L9:L" & RowNKC) , shCDPS.Range("A" & i), shNKC.Range("O15:O" & RowNKC))
    

    【讨论】:

    • 当我只使用 1 个“For”来填充公式时,它运行得非常快,但是使用第二个“For”来复制/粘贴值时,它运行得非常非常慢。我不知道将 2 "for" 组合成 1 是否更快以及如何组合?
    • 如果按照我的建议修改第一个循环,则不需要第二个循环
    • 它的复制/粘贴速度较慢,而不是 for 循环,而且您复制整行,您应该只复制带有公式的范围或整个工作表,实际上会更快
    • 非常感谢,我按照你说的做了,成功了。现在我理解了你的代码,因为我的代码写成宏(Excel 函数)并且你使用 VB 函数
    • 只使用round(application.sumif())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多