正文開始前,先插播一條廣告:
044 禁用宏則關(guān)閉工作簿
通常情況下,當(dāng)應(yīng)用程序的宏安全性的安全級別設(shè)置為“中”時,打開包含Microsoft Excel 4.0版的宏的工作簿,如果用戶選擇“禁用宏”按鈕,則會顯示如圖2所示的警告消息框,當(dāng)用戶選擇“否”時,不能打開該工作簿;用戶選擇“是”時,打開該工作簿,但VBA宏被禁止,而MicrosoftExcel 4.0版的宏未被禁止。
我們可以利用禁用VBA宏不能禁止MicrosoftExcel 4.0版的宏這個特點(diǎn),使用Microsoft Excel 4.0版的宏來實(shí)現(xiàn)禁用宏則關(guān)閉工作簿的功能。
步驟1 新建或打開需要添加此項功能的工作簿文件。
步驟2 按<Ctrl F11>組合鍵為工作簿添加一個宏表,添加的宏表名稱默認(rèn)為“Macro1”。
步驟3 在宏表“Macro1”的A1至A7單元格中輸入下面的內(nèi)容。
禁用宏則關(guān)閉工作簿
=ERROR(FALSE)
=IF(ERROR.TYPE(RUN('TestMacro'))=4)
= ALERT('因禁用了宏功能,文件將被關(guān)閉!',3)
= FILE.CLOSE(FALSE)
=END.IF()
=RETURN()
代碼解析:
Microsoft Excel 4.0宏函數(shù)以等號(=)開始,其他不是由等號開始的內(nèi)容將被視作注釋。通常用作定義的宏名稱或者作為宏函數(shù)實(shí)現(xiàn)功能的注釋內(nèi)容設(shè)置為斜體字樣以示區(qū)別,如圖3中單元格A1所示。
第2行代碼關(guān)閉錯誤檢查功能。如果關(guān)閉錯誤檢查,那么當(dāng)宏執(zhí)行遇到錯誤時,Microsoft Excel 將不予理會而繼續(xù)執(zhí)行。
第3行到第6行代碼使用If函數(shù)與End.If函數(shù)構(gòu)成條件判斷語句。其中,第3行中的語句通過檢查宏函數(shù)RUN('TestMacro')的返回錯誤類型是否為4(禁用宏時的返回結(jié)果),判斷工作簿是否禁用了宏功能。如果第3行的結(jié)果為True,則執(zhí)行下面的語句。
在第4、5行代碼,插入幾個空格來表示相關(guān)代碼之間的層次結(jié)構(gòu)。第4行中的代碼顯示一個消息框。第5行中的代碼關(guān)閉當(dāng)前活動工作簿,設(shè)置參數(shù)值為Fasle表示關(guān)閉時工作簿時不保存對其所作的更改。
第7行代碼終止當(dāng)前代碼的執(zhí)行。MicrosoftExcel 4.0宏要求每個宏必須使用RETURN或HALT函數(shù)結(jié)束。
步驟4 為每個表添加工作表級別的名稱“Auto_Activate”,并將引用都指向宏表“Macro1”的A2單元格?!?/span>Auto_Activate”是一個自動宏,表被激活時自動執(zhí)行。
添加工作表級別的名稱的方法如下:選擇一張工作表,假設(shè)為表“Sheet1”,單擊菜單“插入”→“名稱”→“定義名稱”。在“定義名稱”對話框中添加名稱,輸入完成后單擊“確定”按鈕,完成一張工作表的“Auto_Activate”的定義。完成定義后的名稱將在“定義名稱”對話框中顯示,如圖5所示。依次為每個表添加“Auto_Activate”名稱。此外,使用VBA也可以實(shí)現(xiàn)同樣的操作,并且使用VBA的好處是能夠隱藏名稱,以避免名稱被刪除或修改。代碼如下:
Sub AddPrivateNames()
Dimsht As Object
ForEach sht In Sheets
ThisWorkbook.Names.Add sht.Name &'!Auto_Activate',_
'=Macro1!$A$2',False
Next
End Sub
步驟5 運(yùn)行下面的代碼,隱藏宏表工作表:
Sub HideMacroSheet()
ThisWorkbook.Excel4MacroSheets(1).Visible= xlSheetHidden
End Sub
步驟6 保存工作簿。
當(dāng)應(yīng)用程序的宏安全性的安全級設(shè)置為“中”時,如果用戶打開該工作簿文件并選擇“禁用宏”,將顯示如圖 2所示的警告消息框。當(dāng)用戶選擇“是”時,活動工作表上的自動宏“Auto_Activate”將被執(zhí)行,執(zhí)行結(jié)果顯示如圖6所示的消息框,當(dāng)用戶選擇“確定”按鈕后,將強(qiáng)制關(guān)閉該工作簿文件。
▲045 關(guān)閉工作簿不顯示保存對話框
當(dāng)用戶更改工作簿后,沒有進(jìn)行保存操作而直接關(guān)閉工作簿時,將顯示消息框,提示用戶是否保存對工作簿的更改,如果希望不顯示該消息框而直接關(guān)閉關(guān)閉工作簿,可以在關(guān)閉時進(jìn)行相應(yīng)的設(shè)置。
045-1 使用Close方法關(guān)閉工作簿
使用Close方法關(guān)閉工作簿的,可以在Close方法中指定相應(yīng)的參數(shù),如下面的代碼所示。
Sub wbClose_1()
ThisWorkbook.CloseSaveChanges:=False
End Sub
代碼解析:
wbClose_1過程使用Close方法關(guān)閉工作簿,并放棄所有對工作簿的更改。
應(yīng)用于Workbook對象的Close方法關(guān)閉對象,語法如下:
expression.Close(SaveChanges,Filename,RouteWorkbook)
其中SaveChanges參數(shù)是可選的,如果工作簿沒有改變則忽略此參數(shù);如果工作簿發(fā)生了改變并且在另外的窗口中也打開了該工作簿,則仍然忽略此參數(shù);如果工作簿發(fā)生了改變并且沒有在另外的窗口中打開,則此參數(shù)將指定是否在工作簿中保存所發(fā)生的更改。如果希望在關(guān)閉工作簿時自動保存更改,將SaveChanges參數(shù)值設(shè)置為True即可。還可以在使用Close方法關(guān)閉工作簿時設(shè)置Workbook對象的Saved屬性,如下面的代碼所示。
Sub wbClose_2()
ThisWorkbook.Saved= True
ThisWorkbook.Close
End Sub
代碼解析:
wbClose_2過程使用Close方法關(guān)閉工作簿,并放棄所有對工作簿的更改。
Workbook對象的Saved屬性指示工作簿從上次保存至今是否發(fā)生過更改,如果工作簿進(jìn)行了更改,則該屬性值為False,否則為True。應(yīng)用程序在關(guān)閉工作簿之前判斷該屬性的值,如果其值為False,則顯示提示是否保存的消息框,詢問用戶是否保存對工作簿所做的更改。
第2行代碼將該屬性的值設(shè)置為True,使Excel認(rèn)為已經(jīng)保存了對工作簿所作的更改(實(shí)際上沒有保存更改),從而不再顯示提示是否保存的消息框。
如果需要保存對工作簿所作的更改,那么應(yīng)該在Close方法之前使用Save方法保存工作簿,代碼如下:
Sub wbClose_3()
ThisWorkbook.Save
ThisWorkbook.Close
End Sub
代碼解析:
wbClose_3過程使用Save方法保存工作簿所做的更改,然后使用Close方法關(guān)閉工作簿。
045-2 單擊工作簿關(guān)閉按鈕關(guān)閉工作簿
如果是通過單擊工作簿的關(guān)閉按鈕等操作關(guān)閉工作簿的,則使用BeforeClose事件過程來控制,如下面的代碼所示。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Me.Saved= True
End Sub
代碼解析:
工作簿的Workbook_BeforeClose事件,將工作簿的Saved屬性設(shè)置為True,不保存更改而直接關(guān)閉工作簿,且不顯示提示保存的消息框。
如果希望保存對工作簿的更改,則在Workbook_BeforeClose事件中使用Save方法保存工作簿,如下面的代碼所示。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Me.Save
End Sub
▲046 禁用工作簿的關(guān)閉按鈕
一般情況下,用戶可以通過菜單“文件”→“關(guān)閉”、工作簿窗口右上角的“關(guān)閉窗口”按鈕或者任務(wù)欄中圖標(biāo)右鍵菜單中的“關(guān)閉”菜單項關(guān)閉工作簿。如果希望禁用上述關(guān)閉工作簿的功能,而只能通過代碼關(guān)閉工作簿,則可以在相應(yīng)的工作簿事件中實(shí)現(xiàn),如下面的代碼所示。
Dim BClose As Boolean
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If BClose= False Then
Cancel = True
MsgBox '此功能已經(jīng)被禁止,請使用”“關(guān)閉”“按鈕關(guān)閉工作簿!',vbExclamation,'提示'
EndIf
End Sub
Public Sub CloseWorkbook()
BClose= True
Me.Close
End Sub
代碼解析:
第1行代碼在模塊頂部聲明變量BClose為Boolean類型,默認(rèn)初始值為False。
第2行到第7行代碼工作簿的BeforeClose事件過程,通過變量BClose的當(dāng)前值決定是否能夠關(guān)閉工作簿,只有當(dāng)BClose的值為True時,才允許關(guān)閉工作簿。如果變量BClose的值為False時將參數(shù)Cancel的值設(shè)置為True,以禁止關(guān)閉操作。
第8行到第11行代碼CloseWorkbook過程,將變量BClose的當(dāng)前值設(shè)置為True后使用Close方法關(guān)閉工作簿。關(guān)于Close方法請參閱▲45-1。
在添加以上代碼后,用戶只能通過調(diào)用CloseWorkbook過程關(guān)閉工作簿。如果通過菜單“文件”→“關(guān)閉”或者單擊工作簿窗口右上角的“關(guān)閉窗口”按鈕關(guān)閉工作簿,將顯示消息框。
▲047 保存工作簿的方法
047-1 使用Save方法
使用Workbook對象的Save方法保存工作簿的更改,如下面的代碼所示。
Sub SaveWork()
ThisWorkbook.Save
End Sub
代碼解析:
SaveWork過程保存代碼所在的工作簿的修改。
Save方法保存指定工作簿所做的更改,語法如下:
expression.Save
參數(shù)expression是必需的,該表達(dá)式返回一個Workbook對象。
如果是第一次保存工作簿,請使用SaveAs方法為該文件指定文件名,請參閱▲47-2。
047-2 直接保存為另一文件名
如果需要將工作簿另存為另一個文件名,可以使用Workbook對象的SaveAs方法,如下面的代碼所示。
Sub SaveAsWork()
ThisWorkbook.SaveAsFilename:=ThisWorkbook.Path & '\123.xls'
End Sub
代碼解析:
SaveAsWork過程將代碼所在的工作簿保存為“123”工作簿文件。
Workbook對象的SaveAs方法使用另外一個不同的文件名保存對工作簿所做的更改,語法如下:
Save As(FileName,FileFormat,Password,WriteResPassword,ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution,AddToMru,TextCodepage,TextVisualLayout,Local)
其中,參數(shù)Filename可選,表示要保存文件的文件名的字符串。可包含完整路徑,如果不指定路徑,將文件保存到當(dāng)前文件夾中。
使用SaveAs方法將工作簿另存為新文件后,將關(guān)閉原工作簿文件。
047-3 保存工作簿副本
如果用戶希望工作簿在保存為另一文件名后,能繼續(xù)編輯原工作簿,那么可以使用SaveCopyAs方法,如下面的代碼所示。
Sub SaveCopyWork()
ThisWorkbook.SaveCopyAsThisWorkbook.Path & '\123.xls'
End Sub
代碼解析:
SaveCopyWork過程使用SaveCopyAs方法保存代碼所在的工作簿副本,并指定其名稱。
SaveCopyAs方法將指定工作簿的副本保存到文件,但不修改內(nèi)存中的打開工作簿,語法如下:
SaveCopyAs(Filename)
參數(shù)Filename是必需的,用于指定工作簿副本的文件名。
聯(lián)系客服