2015-08-23 92 views
0

这个简单的宏会在178次迭代后发生错误28消息而停止。我怎样才能绕过这个问题,让宏继续运行?我已经尝试了很多来自论坛的建议,但都没有成功。我使用Excel 2007中 d哈奇比尔托芬NL如何解决vba中的堆栈溢出错误28 Excel中

Sub Macro1() 

' Macro1 Macro 

' Keyboard Shortcut: Ctrl+a 

    ActiveCell.Range("A1:B1").Select 
    Selection.Copy 
    ActiveCell.Offset(1, 0).Range("A1").Select 
    ActiveSheet.Paste 
    ActiveCell.Offset(-1, 0).Range("A1:B1").Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    ActiveCell.Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    ActiveCell.Offset(1, 0).Range("A1").Select 
    Application.Run "Macro1" 
End Sub 
+1

为什么不尝试调试呢? –

+1

这可能是一个调用堆栈问题。宏一次又一次地调用自己,没有遇到退出或返回。我可以想象这个调用堆栈的大小是有限的。丑陋的代码。 –

+0

宏启动时第一个“ActiveCell”是什么?它是否始终是当前选定的单元格?你想要一个粘贴和一个粘贴特殊值,还是应该是一个或另一个?什么阻止宏?它看起来处于无限循环(直到它耗尽行和崩溃)。 – Jeeped

回答

1

您的宏递归调用本身没有限制。调用堆栈应该溢出。如果你想要的这个非常简单的例子,尝试:

Sub macro1() 
    Call macro1 
End Sub 

enter image description here

0

您没有提供退出方法不会再次调用自身的一种方式。

你需要做以下操作之一: -

  1. 添加围绕Application.Run "Macro1"代码的条件/测试,所以你给它一个机会退出
  2. 删除此行:Application.Run "Macro1"。说实话,如果没有它被包围,我看不到它的重点。If/Then/Else

事实上,这种方法似乎没有意义。如果你想复制工作表中的两个单元格,有更快的方法可以这样做: -

ActiveCell.Range("A1:B1").Select 
Selection.Copy 
'Select the range you want to copy it down to - but there must be *some* limit! 
ActiveCell.Offset(1, 0).Range("A1:B1000").Select 
ActiveSheet.Paste 
Application.CutCopyMode = False 
ActiveCell.Offset(-1, 0).Select