VBA公式速度慢,数据量大
我有以下代码,每次都会导致Excel崩溃。工作表上的A列有大约280000行数据。关于如何更有效地编写此代码,您有什么想法吗?理想情况下,我希望有值,而不是公式VBA公式速度慢,数据量大,vba,excel,sumifs,Vba,Excel,Sumifs,我有以下代码,每次都会导致Excel崩溃。工作表上的A列有大约280000行数据。关于如何更有效地编写此代码,您有什么想法吗?理想情况下,我希望有值,而不是公式 sub test() Dim Total_Rows As Long Sheets("Sheet1").Activate Total_Rows = 13000 Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sh
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
End Sub
明显的改进是在宏填充公式时关闭屏幕更新和计算,然后在结束时重新打开。也许还有其他方法可以改善这一点,但我会从这些低挂果实开始
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
'## Disable screenupdating and calculation
Application.ScreenUpdating = False
Application.Calculation = -4135 xlCalculationManual
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
'## Put the calculation back to Automatic
Application.Calculation = -4105 'xlCalculationAutomatic
ActiveSheet.Calculate 'Force a calculation
'## Replace the formulas with values only:
Range("C2", "C" & Total_Rows).Value = Range("C2", "C" & Total_Rows).Value
'## Allow the screen to update
Application.ScreenUpdating = True
End Sub
明显的改进是在宏填充公式时关闭屏幕更新和计算,然后在结束时重新打开。也许还有其他方法可以改善这一点,但我会从这些低挂果实开始
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
'## Disable screenupdating and calculation
Application.ScreenUpdating = False
Application.Calculation = -4135 xlCalculationManual
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
'## Put the calculation back to Automatic
Application.Calculation = -4105 'xlCalculationAutomatic
ActiveSheet.Calculate 'Force a calculation
'## Replace the formulas with values only:
Range("C2", "C" & Total_Rows).Value = Range("C2", "C" & Total_Rows).Value
'## Allow the screen to update
Application.ScreenUpdating = True
End Sub
明显的改进是在宏填充公式时关闭屏幕更新和计算,然后在结束时重新打开。也许还有其他方法可以改善这一点,但我会从这些低挂果实开始
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
'## Disable screenupdating and calculation
Application.ScreenUpdating = False
Application.Calculation = -4135 xlCalculationManual
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
'## Put the calculation back to Automatic
Application.Calculation = -4105 'xlCalculationAutomatic
ActiveSheet.Calculate 'Force a calculation
'## Replace the formulas with values only:
Range("C2", "C" & Total_Rows).Value = Range("C2", "C" & Total_Rows).Value
'## Allow the screen to update
Application.ScreenUpdating = True
End Sub
明显的改进是在宏填充公式时关闭屏幕更新和计算,然后在结束时重新打开。也许还有其他方法可以改善这一点,但我会从这些低挂果实开始
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
'## Disable screenupdating and calculation
Application.ScreenUpdating = False
Application.Calculation = -4135 xlCalculationManual
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
'## Put the calculation back to Automatic
Application.Calculation = -4105 'xlCalculationAutomatic
ActiveSheet.Calculate 'Force a calculation
'## Replace the formulas with values only:
Range("C2", "C" & Total_Rows).Value = Range("C2", "C" & Total_Rows).Value
'## Allow the screen to update
Application.ScreenUpdating = True
End Sub
<>您可以始终限制<代码> SUFIFS 必须考虑的单元格个数,例如使用范围<代码> A1:A4000 而不是<代码> A: A<代码> < /P>
<>但是我认为你应该重新考虑创建13000个SUFIFS公式是否真的是必要的和有意义的。 < p>你可以总是限制<代码> SUFIFS 必须考虑的单元格个数,例如使用范围<代码> A1:A4000 而不是<代码> A: A<代码> < /P>
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
End Sub
<>但是我认为你应该重新考虑创建13000个SUFIFS公式是否真的是必要的和有意义的。 < p>你可以总是限制<代码> SUFIFS 必须考虑的单元格个数,例如使用范围<代码> A1:A4000 而不是<代码> A: A<代码> < /P>
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
End Sub
<>但是我认为你应该重新考虑创建13000个SUFIFS公式是否真的是必要的和有意义的。 < p>你可以总是限制<代码> SUFIFS 必须考虑的单元格个数,例如使用范围<代码> A1:A4000 而不是<代码> A: A<代码> < /P>
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
End Sub
但我认为您应该重新思考创建13000个sumifs公式是否确实必要,是否有意义。该公式在C2单元格中有效吗?它看起来是圆形的,假设它发生在第二张纸上。它发生在另一张纸上。更新的代码更直接。@simoco我知道这是正确的方法,但这是一次性的,我不想为了这个而学习数据库连接。如果我手动输入公式并向下拖动,它会工作(但需要大约一分钟)。该公式在单元格C2中工作吗?它看起来是圆形的,假设它发生在第二张纸上。它发生在另一张纸上。更新的代码更直接。@simoco我知道这是正确的方法,但这是一次性的,我不想为了这个而学习数据库连接。如果我手动输入公式并向下拖动,它会工作(但需要大约一分钟)。该公式在单元格C2中工作吗?它看起来是圆形的,假设它发生在第二张纸上。它发生在另一张纸上。更新的代码更直接。@simoco我知道这是正确的方法,但这是一次性的,我不想为了这个而学习数据库连接。如果我手动输入公式并向下拖动,它会工作(但需要大约一分钟)。该公式在单元格C2中工作吗?它看起来是圆形的,假设它发生在第二张纸上。它发生在另一张纸上。更新的代码更直接。@simoco我知道这是正确的方法,但这是一次性的,我不想为了这个而学习数据库连接。如果我手动输入公式并向下拖动,它会工作(但大约需要一分钟)。
sub test()
Dim Total_Rows As Long
Sheets("Sheet1").Activate
Total_Rows = 13000
Range("C2", "C" & Total_Rows) = "=SUMIFS('Sheet2'!C:C,'Sheet2'!A:A,'Sheet2!A2)"
End Sub