2010-01-30 42 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

相关问题