VBA代码冲突

时间:2017-10-13 15:57:54

标签: excel vba excel-vba

我知道,我在问一个不寻常的问题。但是,请帮助我。

我在工作簿上有一个代码,用于处理工作表上的复制/粘贴数据。它允许我将数据粘贴到单元格中而不改变格式(仅过去值)。

基本上,代码将使用目标格式。类似于"粘贴值"。它允许用户粘贴任何其他格式的数据。因此,这种格式在表格中是一致的。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim vNewValues as Variant
    NewValues = Target
    Application.EnableEvents = False
    Application.Undo
    Target = NewValues
    Application.EnableEvents = True
End Sub

除了上面的代码,我还在工作表上有另一个代码,它将帮助我清除内容,代码链接到一个按钮。因此,当按下按钮时,它将清除工作表的内容。

Private Sub ResetKey_Click()
If MsgBox("Content of the sheet will be deleted and cannot be restored", vbOKCancel + vbInformation) = vbOK Then
    Worksheets("User").Range("E19:I3018").ClearContents
Else
    Exit Sub
End If
End Sub

关注:我发现这些代码之间存在冲突。因为,当我点击按钮时,我得到的错误会在第一个代码中指向Application.Undo。我尝试调试代码,但我无法兼顾两者。请建议。

enter image description here

2 个答案:

答案 0 :(得分:1)

您只能使用.Undo撤消工作表中的最后一个操作,不撤消vba操作,并且必须是宏中的第一行。如文档中所述。Application.Undo。引用如下:

  

此方法仅撤消用户之前采取的最后一个操作   运行宏,它必须是宏中的第一行。它   不能用于撤消Visual Basic命令。

答案 1 :(得分:1)

这将有效:

Private Sub ResetKey_Click()
    If MsgBox("Content of the sheet will be deleted and cannot be restored", vbOKCancel + vbInformation) = vbOK Then
        Application.EnableEvents = False
        Worksheets("User").Range("E19:I3018").ClearContents
        Application.EnableEvents = True
    Else
        Exit Sub
    End If
End Sub

也就是说,您必须在该工作表上的其他宏中禁止更改事件。不优雅,但可行。

澄清第一个宏的作用:它保存单元格的内容,撤消用户的粘贴或输入,然后只填写粘贴的值,保持格式不变。这种方法的问题在于事件处理程序不会返回有关触发它的操作的信息 - 它也可以是粘贴,但也可以清除单元格。