VB,如果可能,excelmacros暂停并恢复工作

我找不出解决以下问题的最佳方法。 基本上我的macros(Excel,VB)正在检查几个(100+)工作表的正确值,如果发现错误的值,我希望它停止,给我一个警告,然后我可以看看为什么值是错误,手动更正,然后我想恢复macros,或者记住最后一个值,所以如果我返回,它会记住继续(恢复)的位置。

我目前的问题是,它发现错误的价值,那么我可以让它停止,所以我检查问题,或者它通过所有表,然后我必须记住哪些表错误值。

我想到的是在每次find错误的值时添加表单的名称。 问题是,如果根本不存在错误的值,通常在同一张纸上会有多个错误的值,并且这会将相同的纸张名称多次添加到列表中。 另一个问题是,我不能马上纠正这些值。

我对编程非常不熟悉,所以非常感谢您关于如何最好地解决这个问题的想法(我不想花很长时间编写一些对于这样一个“简单”问题来说效率不高的问题)。

当发现错误(我假设你已经能够识别这个),你可以使用Application.InputBox函数来提示你一个新的值。

例如,如果rng是代表被检查单元格的Rangevariables,并且您有一些逻辑来确定发生错误的位置,那么您可以执行:

 rng.Value = Application.InputBox("Please update the value in " & rng.Address, "Error!", rng.Value) 

input框函数在等待用户input的同时有效地停止执行过程。

如果InputBox不够健壮,那么你可以创build一个自定义的UserForm来做同样的事情。 但是对于一次只能修改一个范围值的情况,InputBox可能是最容易实现的。

我相信你可以通过在macros中使用一个或两个静态局部variables来处理这个任务。 用“static”而不是“dim”声明的variables将会记住从上次运行过程开始的值。 这可以保留你离开的地方,所以你可以从那里恢复。

有一个可能是这个解决scheme的问题是如果macros重新编译。 这可能会导致VBA清除静态variables持有的值。 在Excel中做一个数据编辑不应该导致重新编译,但是你会想看看这种情况,只是为了确保它不会出现。 如果你在执行之间编辑任何代码,这几乎肯定会。

创build一个公共variables,存储最后一个选中的单元格的单元格地址,并使用一个条件语句来查看它是否为“中等macros”,因为缺less更好的短语。 这里是一个非常粗糙的例子…

 Public lastCellChecked As String Sub Check_Someting() Dim cell As Excel.Range Dim WS As Excel.Worksheet If Not lastCellChecked = vbNullString Then Set cell = Evaluate(lastCellChecked) '// Rest of code... '// Some loop here I'm assuming... lastCellChecked = "'" & WS.Name & "'!" & cell.Address If cell.Value > 10 Then Exit Sub '// Lets assume this is classed as an error '// Rest of loop here... lastCellChecked = vbNullString End Sub 

做到这一点的最好方法是创build一个用户表单,并像之前的用户所提到的那样创build一个公共variables。 当程序发现一个错误存储单元格并启动用户窗体。 您的代码将停止在用户窗体上。 当你完成检查问题时,你可以点击一个button在用户窗体上继续检查。 你的循环可以是像下面的东西。

 public y as integer sub temp1 () rw1= range("a500000").end(xlup).row 'any method to create a range will do if y = null then y=1 for x = y to rw1 cells(x,1).select 'check for the problem your looking for if errorX=true then userform1.show y = activecell.row exit sub end if next x end sub 

插入一个button(在表单上或在菜单栏中)停下来怎么办?

插入下面的代码:

 'This at the top of the module Public mStop As Boolean 'This in the module Sub MyBreak() mStop = True End Sub 'This is your macro Sub YourMacro() 'This at the top of your code mStop = False 'Your code '... 'This code where you want to break DoEvents '<<<< This makes possible the stop If mStop Then mCont = MsgBox("Do you want to continue?", vbYesNo) If mCont = vbNo Then Exit Sub Else mStop = False End If End If 'Your code '... End Sub 

现在您需要创build一个button并将其链接到名为“MyBreak”的macros。