2010-01-30 43 views
0

我第一次嘗試創建Excel VBA。如何將參數傳遞給VBA中的撤消處理程序

下面的宏本質上改變了細胞範圍內部的背景。

GenerateMarkerOnSheet將內部設置爲黑色。 ResetMarkerOnSheet旨在回滾撤消上的更改。

是否有可能通過 Application.OnUndo?將前一個內部作爲參數傳遞給撤消手柄(ResetMarkerOnSheet)

如果是這樣,我應該怎麼做呢?

Sub GenerateMarkerOnSheet() 
' 
' GenerateMarkerOnSheet Macro 
' Macro recorded 29/01/2010 by Everyone 
' 

' 

StartIndex = 99 

RangeGap = 100 

StartCell = "A" 

EndCell = "BU" 

PreviousBackground = 1 

Do While StartIndex < 65536 
    For Each c In Worksheets(ActiveSheet.Name).Range(StartCell & StartIndex & ":" & EndCell & StartIndex) 
     If PreviousBackground = 1 Then 
      PreviousBackground = c.Interior.ColorIndex 
     End If 
     c.Interior.Color = RGB(0, 0, 0) 
    Next 
    StartIndex = StartIndex + RangeGap 
Loop 
' How to pass PreviousBackground to the call below 
Application.OnUndo "Undoing", "ResetMarkerOnSheet" 


End Sub 


Sub ResetMarkerOnSheet() 
' 
' ResetMarkerOnSheet Macro 
' Macro recorded 29/01/2010 by Everyone 
' 

' 

StartIndex = 99 

RangeGap = 100 

StartCell = "A" 

EndCell = "BU" 

Do While StartIndex < 65536 
    For Each c In Worksheets(ActiveSheet.Name).Range(StartCell & StartIndex & ":" & EndCell & StartIndex) 
     c.Interior.ColorIndex = PreviousBackground 
    Next 
    StartIndex = StartIndex + RangeGap 
Loop 


End Sub 

回答

0

我不認爲有可能撤銷已通過VBA代碼執行的操作。例如,如果我手動改寫單元格中的值,那麼編輯>撤消將允許我返回到先前的值。但是,如果我使用更改值(Range(「a1」)=「New Value」)的代碼,那麼我無法撤消。

您可能會考慮將代碼添加到GenerateMarkerOnSheet代碼中,該代碼存儲每次運行時受影響的單元格的地址或範圍。您可以將地址/範圍存儲在隱藏的工作表中或指定的範圍內。

然後,您的ResetMarkerOnSheet例程將只更改所存儲地址/範圍的背景。

根據您的編碼方式,您可以存儲多個級別的「撤銷」。

+0

謝謝,但可以從'Application.OnUndo'提供撤銷處理程序。 雖然有好主意,但要使用隱藏的工作表。 我會給它一個鏡頭! – Everyone 2010-02-03 12:00:51

相關問題