Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行宏时长时间计算公式的VBA解决方案_Vba_Excel - Fatal编程技术网

运行宏时长时间计算公式的VBA解决方案

运行宏时长时间计算公式的VBA解决方案,vba,excel,Vba,Excel,我有一个13MB大小的文件。当我运行宏时,它会计算3个不同工作表中的第一行,然后我使用AutoFill技术计算6000行,这需要很长时间,大约7-8分钟。在我看来,大多数公式都很简单,不需要很长时间。 有人能解决我的问题吗?也许计算本身会在模块和工作簿中发生,我们只会看到结果,值 我的代码从一个userform开始,然后调用一个模块,这占用了宏运行的大部分时间。正如我所说的,这3张纸中的每一张都有6000行。我希望在工作表的最后,我只看到值 Sub Formulas() Call Column

我有一个13MB大小的文件。当我运行宏时,它会计算3个不同工作表中的第一行,然后我使用
AutoFill
技术计算6000行,这需要很长时间,大约7-8分钟。在我看来,大多数公式都很简单,不需要很长时间。 有人能解决我的问题吗?也许计算本身会在模块和工作簿中发生,我们只会看到结果,值

我的代码从一个
userform
开始,然后调用一个模块,这占用了宏运行的大部分时间。正如我所说的,这3张纸中的每一张都有6000行。我希望在工作表的最后,我只看到

Sub Formulas()

Call Columns

LR = VacationWS.Cells(Rows.Count, "A").End(xlUp).Row

With VacationWS
    'Column D
        MyCol = .Range("D2").Column
        ColumnSpace = MonthCol - MyCol
        .Range("D2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-3],VacationWS!RC[-3],Visual!C[5],Lists!R3C3,Visual!C[4],Lists!R2C5)"
    'Column E
        MyCol = .Range("E2").Column
        ColumnSpace = MonthBefore - MyCol
        .Range("E2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-4],VacationWS!RC[-4],Visual!C[4],Lists!R4C3,Visual!C[3],Lists!R5C5)"
    'Column F
        MyCol = .Range("F2").Column
        ColumnSpace = MonthCol - MyCol
        .Range("F2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-5],VacationWS!RC[-5],Visual!C[3],Lists!R2C3,Visual!C[2],Lists!R2C5)"
    'Column G
        .Range("G2").FormulaR1C1 = "=RC[-3]+RC[-2]-RC[-1]"
    'Column H
        MyCol = .Range("H2").Column
        ColumnSpace = MonthCol - MyCol
        .Range("H2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-7],VacationWS!RC[-7],Visual!C[1],Lists!R4C3,Visual!C,Lists!R5C5)"
    'Column I
        .Range("I2").FormulaR1C1 = "=RC[-1]-RC[-2]"

    'Delete unnecessary rows
    .Range("D2:I2").AutoFill Destination:=VacationWS.Range("D2:I" & LR), Type:=xlFillDefault
    .Range("A1:I1").AutoFilter
    .Range("$A$1:$I$" & LR).AutoFilter Field:=9, Criteria1:="0"
     On Error Resume Next
    .Range("A2:I" & LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    .ShowAllData

End With


With IllnessWS
    'Column D
        MyCol = .Range("D2").Column
        ColumnSpace = MonthCol - MyCol
        .Range("D2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-3],IllnessWS!RC[-3],Visual!C[5],Lists!R3C3,Visual!C[4],Lists!R3C5)"
    'Column E
        MyCol = .Range("E2").Column
        ColumnSpace = MonthBefore - MyCol
        .Range("E2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-4],IllnessWS!RC[-4],Visual!C[4],Lists!R4C3,Visual!C[3],Lists!R6C5)"
    'Column F
        MyCol = .Range("F2").Column
        ColumnSpace = MonthCol - MyCol
        .Range("F2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-5],IllnessWS!RC[-5],Visual!C[3],Lists!R2C3,Visual!C[2],Lists!R3C5)"
    'Column G
        .Range("G2").FormulaR1C1 = "=RC[-3]+RC[-2]-RC[-1]"
    'Column H
        MyCol = .Range("H2").Column
        ColumnSpace = MonthCol - MyCol
        .Range("H2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-7],IllnessWS!RC[-7],Visual!C[1],Lists!R4C3,Visual!C,Lists!R6C5)"
    'Column I
        .Range("I2").FormulaR1C1 = "=RC[-1]-RC[-2]"

    'Delete unnecessary rows
    .Range("D2:I2").AutoFill Destination:=IllnessWS.Range("D2", "I" & LR), Type:=xlFillDefault
    .Range("A1:I1").AutoFilter
    .Range("$A$1:$I$" & LR).AutoFilter Field:=9, Criteria1:="0"
     On Error Resume Next
    .Range("A2:I" & LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    .ShowAllData

    'Delete what is equal to 90 or more in column H
    .Range("$A$1:$I$" & LR).AutoFilter Field:=8, Criteria1:=">=90", Operator:=xlAnd
    .Range("A2:I" & LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    .ShowAllData

End With


With HealingWS
    'Column D
        MyCol = .Range("D2").Column
        ColumnSpace = MonthCol - MyCol
        .Range("D2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-3],HealingWS!RC[-3],Visual!C[5],Lists!R3C3,Visual!C[4],Lists!R4C5)"
    'Column E
        MyCol = .Range("E2").Column
        ColumnSpace = MonthBefore - MyCol
        .Range("E2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-4],HealingWS!RC[-4],Visual!C[4],Lists!R4C3,Visual!C[3],Lists!R7C5)"
    'Column F
        .Range("F2").FormulaR1C1 = "=RC[-1]+RC[-2]"
    'Column G
        MyCol = .Range("G2").Column
        ColumnSpace = MonthCol - MyCol
        .Range("G2").FormulaR1C1 = _
        "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-6],HealingWS!RC[-6],Visual!C[2],Lists!R4C3,Visual!C[1],Lists!R7C5)"
    'Column H
        .Range("H2").FormulaR1C1 = "=RC[-1]-RC[-2]"

    'Delete unnecessary rows
    .Range("D2:H2").AutoFill Destination:=HealingWS.Range("D2:H" & LR), Type:=xlFillDefault
    .Range("A1:H1").AutoFilter
    .Range("$A$1:$H$" & LR).AutoFilter Field:=8, Criteria1:="0"
     On Error Resume Next
    .Range("A2:H" & LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    .ShowAllData

'Specific for June in HealingWS (Goes to Null)
    With Lists
        If MonthName = .Range("A7").Value Then
            HealingWS.Range("E2").Value = 0
            HealingWS.Range("E2").AutoFill Destination:=HealingWS.Range("E2:E" & LR), Type:=xlFillDefault
        End If
    End With
End With

'January formulas change
If MonthName = Lists.Range("A2").Value Then
    With VacationWS
        .Range("E2").FormulaR1C1 = _
        "=SUMIFS(December!C[7],December!C[-4],VacationWS!RC[-4],December!C[4],Lists!R4C3,December!C[3],Lists!R5C5)"
        .Range("E2").AutoFill Destination:=VacationWS.Range("E2:E" & LR), Type:=xlFillDefault
    End With

    With IllnessWS
        .Range("E2").FormulaR1C1 = _
        "=SUMIFS(December!C[7],December!C[-4],îçìä!RC[-4],December!C[4],Lists!R4C3,December!C[3],Lists!R6C5)"
        .Range("E2").AutoFill Destination:=IllnessWS.Range("E2:E" & LR), Type:=xlFillDefault
    End With

    With HealingWS
        .Range("E2").FormulaR1C1 = _
        "=SUMIFS(December!C[7],December!C[-4],HealingWS!RC[-4],December!C[4],Lists!R4C3,December!C[3],Lists!R7C5)"
        .Range("E2").AutoFill Destination:=HealingWS.Range("E2:E" & LR), Type:=xlFillDefault
    End With


End If

End Sub

SUMIF在计算上很昂贵,应该节约使用。你把它们分成14列,然后复制下来。如果他们都排在6000行,那么这是一个惊人的84000 SUMIFS。可能指向相当大的范围。火车。沉船

摆脱他们。改用数据透视表。你会发现事情只需要几秒钟,而不是几分钟

我写了一篇关于这方面的文章,可能会引起人们的兴趣

你可能也对我的答案感兴趣,我比较了很多不同的方法,在多种条件下求和:


其中之一就是所谓的范围切片,如果你决定使用公式,这将是最快的方法。但是,虽然闪电般地快,但设置起来很棘手,其他人也很难动脑。这又让我们回到了数据透视表。数据透视表就是为您正在做的事情而设计的。在这里,它们是更好的解决方案。

尝试在开头添加
Application.Calculation=xlCalculationManual
,在结尾添加
Application.Calculation=xlCalculationAutomatic
。另外,在开头添加:
Application.screenUpdate=false
,在结尾添加
Application.screenUpdate=true
。现在的结果是什么?@KazimierzJawor关于计算手册,它使宏变慢了,我已经试过了。屏幕更新-我在我的宏中有它,正如我所说的——这里的部分在代码的中间-代码以用户窗体开始。以防万一:确保你的计算有正确的方向(从上到下,从左到右)。例如,如果在A1
=B1+C1
(从右到左)中计算,则比在C1
=A1+B1
(从左到右)中计算要慢。这已经让我在大而复杂的工作表中慢了很多。尝试这样的代码
VacationWS.Range(“G2:G5000”)。FormulaR1C1=“=RC[-3]+RC[-2]-RC[-1]”
因为你的代码似乎在工作(尽管速度很慢),你可能想在感谢你的回答上发布你的问题,我现在将阅读你给我的链接,谁知道也许你会是那个打开我心扉的人,这是一个新的模型,所以我愿意改变。你也应该阅读PowerPivot和PowerQuery。最近,在Excel的庇护下,有一场悄无声息的革命正在进行。它现在是一个令人难以置信的数据库/转换工具。YouTube上有很多很棒的视频,还有来自Ken Puls、Rob Collie、Jon Acampora、Mike Girvin和Chandoo等网站的精彩内容。谷歌他们,并准备好惊讶。