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 

除了上面的代码之外,我还在表单上添加了另一个代码,这将帮助我清除内容,并将代码链接到一个button。 所以,当按下button时,它将清除纸张的内容。

 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 

关注:我看到这些代码之间有冲突。 因为,当我点击button,我得到的错误,将指向我的第一个代码Application.Undo 。 我试着debugging代码,但我无法让这两个工作。 请build议。

在这里输入图像说明

这将工作:

 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 

也就是说,你必须在工作表上的其他macros中禁止Change事件。 不优雅,但可行。

为了弄清楚第一个macros的作用:它保存单元格的内容,撤销用户的粘贴或input,然后只填充粘贴的值,保持格式不变。 这种方法的问题是,事件处理程序不会返回触发它的动作的信息 – 它可能是一个粘贴,但也会清除单元格。

您只能使用.Undo撤消工作表中的最后一个操作,而不是撤消vba操作,并且必须是macros中的第一行。 正如文件中所解释的那样。 Application.Undo 。 引用如下:

此方法在运行macros之前只解除了用户最后一个操作,它必须是macros中的第一行。 它不能用于撤消Visual Basic命令。