2009-12-21 77 views

回答

4

這裏有一個方法。訣竅是通過專門的課程將應用程序級別的事件進行陷阱。使用SheetActivate事件,存儲對活動工作表的引用及其名稱。當工作表處於停用狀態(和另一個已激活的工作表)時,將工作表參考的名稱與存儲的字符串進行比較。這裏的類(稱爲CExcelEvents):

Option Explicit 

Private WithEvents xl As Application 

Private CurrSheet As Worksheet 
Private CurrSheetName As String 


Private Sub Class_Initialize() 
    Set xl = Excel.Application 
    Set CurrSheet = ActiveSheet 
    CurrSheetName = CurrSheet.Name 
End Sub 

Private Sub Class_Terminate() 
    Set xl = Nothing 
End Sub 



Private Sub xl_SheetActivate(ByVal Sh As Object) 
    If CurrSheetName <> CurrSheet.Name Then 
     Debug.Print "You've renamed the sheet: " & CurrSheetName & " to " & CurrSheet.Name 
'  Do something here - rename the sheet to original name? 
    End If 

    Set CurrSheet = Sh 
    CurrSheetName = CurrSheet.Name 
End Sub 

實例化這個使用打開工作簿事件的全局變量:

Public xlc As CExcelEvents 

Sub Workbook_Open() 
    Set xlc = New CExcelEvents 
End Sub 

僅當用戶選擇另一個工作表上面的例子將觸發。如果您需要更多粒度,請同時監控Sheet Change事件。

+0

這不起作用了。 – plocks 2017-06-08 09:54:45

+0

我可以在Excel 2016中找到的唯一一個在重命名錶單時觸發的事件是Application.AfterCalculate。該方法大致相同:維護Worksheet對象及其當前名稱的映射,並在此事件期間交叉檢查所有這些對象。 – nicholas 2017-09-21 19:22:06

0

我急切地等待着這個答案,因爲我經過多次搜索後還沒有找到答案。在我發現的工作表上沒有重命名事件,因此您不得不採取其他方法。

我見過的最好的一個(它是可怕的)是通過使它們變爲只讀或不可見來禁止重命名,然後提供自己的工具欄或按鈕來完成重命名。非常醜陋,用戶討厭它。

我也看到了應用程序禁用了辦公室工具欄中的重命名菜單項,但是這並不妨礙雙擊該選項卡並在那裏重命名。也非常醜陋,用戶討厭它。

祝你好運,我希望有人想出了更好的答案。

3

顯然沒有事件來處理這個問題,即使使用Application對象。多煩人。

我可能會嘗試通過存儲Worksheet的啓動值並在儘可能多的事件上檢查它來嘗試捕獲它 - 這是公認的黑客攻擊。

以下似乎對我有用,希望它有幫助。

放在ThisWorkbook模塊:

Private strWorksheetName As String 

Private Sub Workbook_Open() 
    strWorksheetName = shtMySheet.Name 
End Sub 

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Call CheckWorksheetName 
End Sub 
Private Sub Workbook_NewSheet(ByVal Sh As Object) 
    Call CheckWorksheetName 
End Sub 
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) 
    Call CheckWorksheetName 
End Sub 
Private Sub Workbook_SheetActivate(ByVal Sh As Object) 
    Call CheckWorksheetName 
End Sub 
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 
    Call CheckWorksheetName 
End Sub 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 
    Call CheckWorksheetName 
End Sub 

Private Sub CheckWorksheetName() 
    'If the worksheet has changed name' 
    If shtMySheet.Name <> strWorksheetName Then 

     DoSomething 

    End If 
End Sub