获取错误VBAmacros中的过程过大(Excel)

我在VBAmacros中得到Procedure too Large Error

我正在使用MS-Excel 2003。

如果你的程序超过64kb,你会得到这个错误。 这些是你可以压缩你的代码的一些东西

1)摆脱重复的代码。 看到这个例子

 Sub Sample() Range("A1") = "Blah Blah" Range("A2") = "Blah Blah" Range("A3") = "Blah Blah" Range("A4") = "Blah Blah" Range("A5") = "Blah Blah" Range("A6") = "Blah Blah" Range("A7") = "Blah Blah" End Sub 

这段代码可以写成

 Sub Sample() For i = 1 To 7 Range("A" & i) = "Blah Blah" Next i End Sub 

另一个例子

 Sub Sample() Range("A1") = (Range("A1") * 10) + (Range("A1") + 30) + (Range("A1") / 30) Range("A5") = (Range("A5") * 10) + (Range("A5") + 30) + (Range("A5") / 30) Range("A11") = (Range("A11") * 10) + (Range("A11") + 30) + (Range("A11") / 30) Range("A6") = (Range("A6") * 10) + (Range("A6") + 30) + (Range("A6") / 30) Range("A8") = (Range("A8") * 10) + (Range("A8") + 30) + (Range("A8") / 30) Range("A56") = (Range("A56") * 10) + (Range("A56") + 30) + (Range("A56") / 30) End Sub 

这段代码可以写成

 Sub Sample() Range("A1") = GetVal(Range("A1")) Range("A5") = GetVal(Range("A5")) Range("A11") = GetVal(Range("A11")) Range("A6") = GetVal(Range("A6")) Range("A8") = GetVal(Range("A8")) Range("A56") = GetVal(Range("A56")) End Sub Function GetVal(rng As Range) As Variant GetVal = (rng.Value * 10) + (rng.Value + 30) + (rng.Value / 30) End Function 

这将确保你减less空间,不要写重复的代码。

2)如果你通过macros生成代码,那么你可能会得到这样的东西。 摆脱像ActiveWindow.ScrollRow = 8968无用的代码

 Option Explicit '~~> This procedure fills Excel's 10000 cells with random values and then removes the duplicates Sub FillExcelCells() Dim rowCount As Long '~~> Activate the necesary Sheet Sheets("Sheet1").Activate '~~> Loop through all the cells and store random numbers For rowCount = 1 To 10000 Sheets("Sheet1").Range("A" & rowCount).Select Sheets("Sheet1").Range("A" & rowCount).Value = Int((10000 - 1) * Rnd() + 1) Next rowCount '~~> Sort the Range Sheets("Sheet1").Range("A1").Select Sheets("Sheet1").Range(Selection, Selection.End(xlDown)).Select Application.CutCopyMode = False Range(Selection, Selection.End(xlDown)).Select ActiveWindow.SmallScroll Down:=-39 ActiveWindow.ScrollRow = 9838 ActiveWindow.ScrollRow = 9709 ActiveWindow.ScrollRow = 9449 ActiveWindow.ScrollRow = 8968 ActiveWindow.ScrollRow = 8319 ActiveWindow.ScrollRow = 7245 ActiveWindow.ScrollRow = 6003 ActiveWindow.ScrollRow = 4818 ActiveWindow.ScrollRow = 4040 ActiveWindow.ScrollRow = 3317 ActiveWindow.ScrollRow = 3076 ActiveWindow.ScrollRow = 2521 ActiveWindow.ScrollRow = 2298 ActiveWindow.ScrollRow = 2113 ActiveWindow.ScrollRow = 1724 ActiveWindow.ScrollRow = 1372 ActiveWindow.ScrollRow = 1038 ActiveWindow.ScrollRow = 872 ActiveWindow.ScrollRow = 668 ActiveWindow.ScrollRow = 538 ActiveWindow.ScrollRow = 464 ActiveWindow.ScrollRow = 446 ActiveWindow.ScrollRow = 427 ActiveWindow.ScrollRow = 409 ActiveWindow.ScrollRow = 390 ActiveWindow.ScrollRow = 353 ActiveWindow.ScrollRow = 334 ActiveWindow.ScrollRow = 297 ActiveWindow.ScrollRow = 279 ActiveWindow.ScrollRow = 242 ActiveWindow.ScrollRow = 223 ActiveWindow.ScrollRow = 205 ActiveWindow.ScrollRow = 168 ActiveWindow.ScrollRow = 149 ActiveWindow.ScrollRow = 112 ActiveWindow.ScrollRow = 94 ActiveWindow.ScrollRow = 57 ActiveWindow.ScrollRow = 20 ActiveWindow.ScrollRow = 1 Selection.Sort Key1:=Sheets("Sheet1").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal '~~> Delete duplicates For rowCount = 10000 To 2 Step -1 Sheets("Sheet1").Range("A" & rowCount).Select If Range("A" & rowCount).Value = Range("A" & rowCount - 1).Value Then Sheets("Sheet1").Rows(rowCount).Delete shift:=xlUp End If Next rowCount End Sub 

以上可以写成

 '~~> This procedure fills Excel's 10000 cells with random values and then removes the duplicates Sub FillExcelCells() Dim rowCount As Long With Sheets("Sheet1") '~~> Loop through all the cells and store random numbers For rowCount = 1 To 10000 .Range("A" & rowCount).Value = Int((10000 - 1) * Rnd() + 1) Next rowCount '~~> Sort Range .Range("A1:A10000").Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal '~~> Delete duplicates For rowCount = 10000 To 2 Step -1 If .Range("A" & rowCount).Value = .Range("A" & rowCount - 1).Value Then .Rows(rowCount).Delete shift:=xlUp End If Next rowCount End With End Sub 

3)声明你的对象,这样你就不必一直重复它们。 看到这个例子

 Sub Sample() Range("A1").Select ActiveCell.FormulaR1C1 = "sdasds" Range("A1").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 65535 .TintAndShade = 0 .PatternTintAndShade = 0 End With Selection.Font.Bold = True Selection.Font.Italic = True Selection.Font.Underline = xlUnderlineStyleSingle With Selection .HorizontalAlignment = xlGeneral .VerticalAlignment = xlBottom .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With End Sub 

这可以写成

 Sub Sample() Dim ws As Worksheet, rng As Range Set ws = Sheet1 Set rng = ws.Range("A1") With rng .FormulaR1C1 = "sdasds" With .Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 65535 .TintAndShade = 0 .PatternTintAndShade = 0 End With .Font.Bold = True .Font.Italic = True .Font.Underline = xlUnderlineStyleSingle .HorizontalAlignment = xlGeneral .VerticalAlignment = xlBottom .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With End Sub 

4)如果需要,打破你的程序。 并从第1次调用第2次程序

5)避免使用.Select.Activate它们不仅会让你的代码变慢,而且在代码中占用大量的空间。 如何避免在Excel VBAmacros中使用select

macros的大小限制为64kb,之后您将从Excel中收到错误消息。

我遇到了一个问题,没有从Excel的解释或错误信息,当我写一个macros,调用多个其他的macros的Excel无法完全计算资源的工作簿。

我假定需要考虑链中所有macros的长度之和。