2017-10-13 167 views
2

我知道,我在問一個不尋常的問題。但是,請幫助我。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

'ClearContents'觸發'Workbook_SheetChange'和'Undo'無法工作,因爲運行一個宏(如'ResetKey_Click')會清除撤銷堆棧。不要觸發'ResetKey_Click'的事件或完全修改您的方法。 Excel專門具有「僅粘貼值」。 – GSerg

+2

你的第一塊代碼聲明'vNewValues',但使用'NewValues'。我建議在** VBE Options〜Editor **選項卡中勾選'需要變量聲明'(在所有新模塊的頂部添加Option Explicit)。 –

+1

@ DarrenBartrup-Cook,但它是如何解決我目前的問題。我試圖這樣做,沒有改變我的擔憂。 – sady

回答

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 

也就是說,你必須抑制對錶工作的其他宏Change事件。不典雅但可行。

澄清第一個宏的作用:它保存單元格的內容,撤銷用戶的粘貼或輸入,然後只填充粘貼的值,保持格式不變。這種方法的問題是事件處理程序不會返回觸發它的操作的信息 - 它可能是一個粘貼,但也會清除單元格。

+0

輝煌!非常感謝你 – sady

1

您只能使用.Undo撤消工作表中沒有撤消VBA行動的最後一個動作,而且必須在宏的第一行。正如文檔中所解釋的那樣。 Application.Undo。引用如下:

此方法只撤銷用戶在運行宏之前採取的最後一個動作,它必須是宏中的第一行。它不能用於 撤消Visual Basic命令。

+0

這是很好的,至少包括該鏈接的相關部分。這個答案在連接腐爛的日子裏失去了一半的價值。 –

+1

@ Mat'sMug - 你是對的。我已經相應更新了。 – QHarr