在Excel中重命名工作表事件

mac*_*ojw 7 excel events vba

重命名Excel工作表时,运行某些VBA代码的最佳方法是什么?

Nos*_*dge 6

即使使用 Application 对象,显然也没有 Event 来处理这个问题。多么烦人。

我可能会尝试通过存储工作表的启动值并在尽可能多的事件上检查它来捕获它 - 这无疑是一个黑客。

以下似乎对我有用,希望它有所帮助。

在 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
Run Code Online (Sandbox Code Playgroud)


小智 5

这是一种方法。诀窍是通过专用类在应用程序级别捕获事件。使用 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
Run Code Online (Sandbox Code Playgroud)

使用工作簿打开事件用全局变量实例化它:

Public xlc As CExcelEvents

Sub Workbook_Open()
    Set xlc = New CExcelEvents
End Sub
Run Code Online (Sandbox Code Playgroud)

仅当用户选择另一个工作表时,上面的示例才会触发。如果您想要更详细的信息,还可以监视“Sheet Change”事件。