实现撤销。Implementing Undo。参加办公大师系列试译活动。

实现撤销

 

不幸的是,Excel没有提供一个直接的方法来撤销一个由VBA执行的操作。撤销一个VBA宏是可以的,但是这通常需要大量的工作。并且,不像Excel撤销特征,在文本工具功能中使用的撤销技术是一个单一的功能。换句话说,用户仅可以撤销那些最近的操作。获取在你的应用程序中关于使用撤销的额外信息,请翻阅至本节中“撤销一个VBA过程”处。

 

文本工具功能通过保存原始数据至一个工作表中来实现撤销。如果用户要撤销一个操作,那么原始数据就会拷贝至用户的工作簿中。

 

在文本工具功能中,Module1的VBA模块为处理撤销而声明2个共有变量:

 

Public UndoRange As Range

Public UserSelection As Range

 

在修改任何数据之前,ApplyButton_Click过程调用了SaveForUndo过程。这个过程会先执行以下三条语句:

 

Set UserSelection = Selection

Set UndoRange = WorkRange

ThisWorkbook.Sheets(1).UsedRange.Clear

 

UserSelection对象变量保存用户当前的选择区域,所以在撤销操作后你可以重新选择这份区域。WorkRange是一个由CreateWorkRange函数返回范围对象。WorkRange由用户选择区域中非空单元格和非公式单元格组成。后续的第三条语句在工作表中删除一切存在的保留数据。

 

接下来会执行下面的循环:

 

For Each RngArea In WorkRange.Areas

ThisWorkbook.Sheets(1).Range(RngArea.Address).Formula= RngArea.Formula

Next RngArea

 

这个代码遍历WorkRange中每一个地方,并且将数据存储在工作表里。(如果WorkRange含有一个共有区域的单元格,它将仅包含一个区域。)

 

在指定的操作执行后,如果用户选择撤销,代码将使用OnUndo方法来指定过程去执行。例如,执行change case操作后,这条语句会执行。

 

Application.OnUndo “Undo Change Case”,“UndoTextTools”

 

Excel的撤销下拉列表将包含一个菜单项:UndoChange Case(见图14-6)。如果用户选择这个菜单,下面UndoTextTools过程将会执行。

 

Private Sub UndoTextTools()

‘ Undoes the last operation

Dim a As Range

On Error GoTo ErrHandler

Application.ScreenUpdating = False

With UserSelection

.Parent.Parent.Activate

.Parent.Activate

.Select

End With

For Each a In UndoRange.Areas

a.Formula =ThisWorkbook.Sheets(1).Range(a.Address).Formula

Next a

Application.ScreenUpdating = True

On Error GoTo 0

Exit Sub

ErrHandler:

Application.ScreenUpdating = True

MsgBox “Can’t undo”, vbInformation, APPNAME

On Error GoTo 0

End Sub

 

图14-6:文本工具功能包含一个单一功能的撤销。

 

UndoTextTools过程首先确保正确的工作簿和工作表已被激活,然后选择用户选择的原始区域。接着循环遍历已保存数据(因为存在UndoRange公共变量,所以该数据是有效的)的每一片区域,并且将数据放入其原始位置(将原始数据写入)。

 

网站里:

 

此书的网站包含一个简单的用例。此用例阐述了怎样在VBA过程调用后激活撤销命令。此用例名为simpleundo demo.xlsm,它将数据存储在一个数组中而不是在一个工作表里。该数组由一个定制的数据类型组成。该类型包含了每个单元格的值和它的位置。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值