VBA,excel宏暂停并尽可能恢复工作

时间:2015-03-26 14:45:15

标签: excel vba excel-vba

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

我当前的问题是它找到了错误的值,然后我可以让它停止,所以我检查问题,或者它遍历所有工作表然后我必须记住哪些工作表有错误的值。

我想到的是制作一个列表,每次找到错误的值时都会添加工作表的名称。问题是,如果存在错误的值,通常在同一工作表中存在多于1个错误值,并且这会将相同的工作表名称多次添加到列表中。另一个问题是我无法立即纠正这些值。

我对编程非常缺乏经验,所以非常感谢您对如何最好地解决这个问题的想法(我不想花很长时间编写一些不会有效的编程方法。这样一个简单的问题。

5 个答案:

答案 0 :(得分:4)

当发现错误时(我假设您已经能够识别出错误),您可以使用Application.InputBox功能提示您输入新值。

例如,如果rng是一个Range变量,表示正在检查的单元,并且您有一些逻辑来确定错误发生的位置,那么您可以这样做:

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

在等待来自用户的输入时,inputbox函数有效地停止了过程的执行。

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

答案 1 :(得分:0)

我相信您可以通过在宏中使用一个或两个静态局部变量来处理此任务。使用“static”而不是“dim”声明的变量将记住上次运行该过程时的值。这可以保留在你离开的地方,这样你就可以从那里继续。

这个解决方案可能存在的一个问题是,如果宏被重新编译。这可能会导致VBA清除静态变量所持有的值。只是在Excel中进行数据编辑不应该导致重新编译,但是你需要注意这种情况,只是为了确保它不会出现。如果你在执行之间编辑任何代码,几乎可以肯定。

答案 2 :(得分:0)

创建一个公共变量,用于存储最后一个已检查单元格的单元格地址,并使用条件语句查看它是否是" mid-macro"因为缺少一个更好的短语。这是一个非常粗糙的例子......

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

答案 3 :(得分:0)

执行此操作的最佳方法是创建用户表单,并且如先前用户所述,创建公共变量。当程序发现错误时,存储单元并启动用户表单。您的代码将停止在userform上。当您完成检查问题后,在用户窗体上有一个按钮,您可以单击以继续检查。你的循环可以是下面的东西。

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

答案 4 :(得分:0)

如何插入按钮(在工作表上或菜单栏中)停止?

插入以下代码:

'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

现在您需要创建一个按钮并将其链接到名为“MyBreak”的宏。