VBA:错误的公式 - 冻结和没有足够的内存消息

时间:2017-07-11 09:36:28

标签: vba formula

我在VBA上有一个代码使我的Excel冻结(填充单元格)并给出输出消息,例如“没有足够的内存来运行”+错误1004,但我不明白为什么,因为它真的是一个简单的公式..完整代码中只有一部分会导致问题,这就是:

 Sub mismatches()
 Dim sht As Worksheet, cell As Range, areaToTrim As Range, LastRow As Long
 LastRow = Cells(Rows.Count, "A").End(xlUp).Row
 Set sht = ThisWorkbook.Worksheets("Mismatches")
 sht.Activate
 Range("O1").EntireColumn.Insert
 sht.Cells(1, 15) = "Mismatch DRP"
 Range("02:0" & LastRow).Value = _
 "=IF(ISNA(VLOOKUP(K2,CDL_data!D:D,1,0)),""N/A"",I2)"
 Range("02:0" & LastRow).Select
 Selection.Copy
 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, 
 SkipBlanks:=False, Transpose:=False

我想确切地说代码的其他部分几乎完全相同,只有公式不同,但它们运行正常!即使我已经使用过这种公式,公式中的某些东西也必须“错误”或“太重”。我已经尝试了只有3行的完整代码(在表单“Mismatches”上)但是在“CDL_data”表单中有9000行(用于Vlookup)。

1 个答案:

答案 0 :(得分:1)

你可能有一个拼写错误,在列引用中使用零而不是字母O.这意味着您引用了大量的整行,可能是9000行,并将Vlookup函数插入到每行16384个单元格中,这大约是需要计算Vlookup的1.47亿个单元格。

您可能希望使用零

更改此部分代码
 Range("02:0" & LastRow).Value = _
 "=IF(ISNA(VLOOKUP(K2,CDL_data!D:D,1,0)),""N/A"",I2)"
 Range("02:0" & LastRow).Select

,使用字母O作为列引用:

 Range("O2:O" & LastRow).Value = _
 "=IF(ISNA(VLOOKUP(K2,CDL_data!D:D,1,0)),""N/A"",I2)"
 Range("O2:O" & LastRow).Select

您可能希望将VBE字体更改为使用与大写字母O相比明显不同的字符的字体,以避免此类错误。 Consolas在零上使用对角线打击,这使得它很容易与O区分开来。

通常,如果您希望代码运行得更快,请避免选择内容然后根据选择进行操作。在大多数情况下,可以直接对该范围采取行动。