在VBA環(huán)境下,運(yùn)行VBA代碼后,Excel的撤銷按鈕是灰色的,這意味著VBA代碼導(dǎo)致工作表、工作簿的改變是無法撤銷的,其實(shí)VBA內(nèi)置了一個(gè)Application.OnUndo 方法 ,能夠在運(yùn)行代碼后實(shí)現(xiàn)撤銷功能,但是具體的撤銷過程需要自行實(shí)現(xiàn)。OnUndo(Text,Procedure) 方法有兩個(gè)參數(shù),第一個(gè)是撤銷按鈕顯示是文字信息,第二個(gè)是撤銷命令具體的過程名稱,其實(shí)就是在模塊中函數(shù)的名稱。第二個(gè)參數(shù)通過特殊的構(gòu)造,可以實(shí)現(xiàn)傳遞參數(shù)效果,具體實(shí)現(xiàn)過程如下圖:
由于OnUndo方法的第二個(gè)參數(shù)是模塊中函數(shù)名稱,在VBA中較容易可以實(shí)現(xiàn),那如何在VSTO中實(shí)現(xiàn)。想解決這個(gè)問題,核心在于如何把撤銷代碼放入VBA工程,以及如何在VSTO中調(diào)用VBA工程模塊中的代碼。
一、新建一個(gè)Excel外接程序
然后在VSTO的debug目錄建立一個(gè)xlam格式的加載宏,命名為iCells_Undo.xlam,如圖:
在加載宏中的模塊中,寫入撤銷的代碼:
1 Sub undo(str As String) 2 ActiveSheet.Range("a1").Value = str 3 End Sub
如圖:
二、在VSTO項(xiàng)目中的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
以上代碼作用是在加載項(xiàng)開始的時(shí)候,就打開iCells_Undo.xlam,打開iCells_Undo.xlam的目的在于之后需要在加載宏中存放撤銷的代碼,并且調(diào)用。
三、在VSTO中添加一個(gè)Button,命名Button1,為這個(gè)Button添加事件:
1 Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click2 Dim str As String = Nothing3 Dim ExcelApp As Excel.Application = Globals.ThisAddIn.Application4 str = ExcelApp.ActiveSheet.Range("a1").Value5 ExcelApp.ActiveSheet.Range("a1").Value = "iCells"6 ExcelApp.OnUndo("撤銷A1單元格賦值", "'undo" & """" & str & """" & "'")7 End Sub
最后,運(yùn)行項(xiàng)目就可以實(shí)現(xiàn)撤銷功能,但是如果每一個(gè)撤銷過程如果都放入到iCells_Undo.xlam加載項(xiàng)中,已然失去了VSTO的優(yōu)勢(shì),第二篇分享如何把具體的撤銷過程放到VSTO項(xiàng)目中。
聯(lián)系客服