在VSTO项目中使用Excel的撤销功能(一)
在VBA环境下,运行VBA代码后,Excel的撤销按钮是灰色的,这意味着VBA代码导致工作表、工作簿的改变是无法撤销的,其实VBA内置了一个Application.OnUndo 方法 ,能够在运行代码后实现撤销功能,但是具体的撤销过程需要自行实现。OnUndo(Text,Procedure) 方法有两个参数,第一个是撤销按钮显示是文字信息,第二个是撤销命令具体的过程名称,其实就是在模块中函数的名称。第二个参数通过特殊的构造,可以实现传递参数效果,具体实现过程如下图:
由于OnUndo方法的第二个参数是模块中函数名称,在VBA中较容易可以实现,那如何在VSTO中实现。想解决这个问题,核心在于如何把撤销代码放入VBA工程,以及如何在VSTO中调用VBA工程模块中的代码。
一、新建一个Excel外接程序
然后在VSTO的debug目录建立一个xlam格式的加载宏,命名为iCells_Undo.xlam,如图:
在加载宏中的模块中,写入撤销的代码:
1 Sub undo(str As String) 2 ActiveSheet.Range("a1").Value = str 3 End Sub
如图:
二、在VSTO项目中的ThisAddIn中加入以下代码:
1 Private xlam As Object = Nothing
2 Private Sub ThisAddIn_Startup() Handles Me.Startup
3 Dim strPath As String = System.AppDomain.CurrentDomain.BaseDirectory
4 Dim strXlam As String = System.IO.Path.Combine(strPath, "iCells_Undo.xlam")
5 If IO.File.Exists(strXlam) Then
6 xlam = Globals.ThisAddIn.Application.Workbooks.Open(strXlam)
7 Else
8 xlam = Nothing
9 End If
10 End Sub
11
12 Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
13 Try
14 If xlam IsNot Nothing Then
15 xlam.close(False)
16 End If
17 Catch ex As Exception
18 End Try
19 End Sub
以上代码作用是在加载项开始的时候,就打开iCells_Undo.xlam,打开iCells_Undo.xlam的目的在于之后需要在加载宏中存放撤销的代码,并且调用。
三、在VSTO中添加一个Button,命名Button1,为这个Button添加事件:
1 Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click
2 Dim str As String = Nothing
3 Dim ExcelApp As Excel.Application = Globals.ThisAddIn.Application
4 str = ExcelApp.ActiveSheet.Range("a1").Value
5 ExcelApp.ActiveSheet.Range("a1").Value = "iCells"
6 ExcelApp.OnUndo("撤销A1单元格赋值", "'undo" & """" & str & """" & "'")
7 End Sub
最后,运行项目就可以实现撤销功能,但是如果每一个撤销过程如果都放入到iCells_Undo.xlam加载项中,已然失去了VSTO的优势,第二篇分享如何把具体的撤销过程放到VSTO项目中。