2009-12-21 9 views

Respuesta

4

Aquí es uno de los enfoques. El truco es atrapar los eventos en un nivel de aplicación a través de una clase dedicada. Usando el evento SheetActivate, almacene una referencia a la hoja activa así como su nombre. Cuando la hoja está desactivada (y otra activada) compare el nombre de la referencia de la hoja con la cadena almacenada. Aquí está la clase (llamados 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 

Instantiate esto con una variable global utilizando el evento abierto Libro de trabajo:

Public xlc As CExcelEvents 

Sub Workbook_Open() 
    Set xlc = New CExcelEvents 
End Sub 

el ejemplo anterior se activará sólo cuando el usuario selecciona otra hoja de cálculo. Si desea más granularidad, controle también el evento Cambio de hoja.

+0

Esto ya no funciona. – plocks

+0

El único evento que puedo encontrar en Excel 2016 que se activa cuando se cambia el nombre de una hoja es Application.AfterCalculate. El enfoque es más o menos el mismo: mantener un mapeo de los objetos de la hoja de trabajo y sus nombres actuales, y verificarlos todos durante este evento. – nicholas

0

Espero ansiosamente una respuesta a esto porque no me he dado cuenta después de mucha búsqueda. No hay un evento de cambio de nombre en una hoja de trabajo que he encontrado, por lo que se ve obligado a tener un enfoque alternativo.

La mejor que he visto (que es horrible) es prohibir el cambio de nombre en las hojas haciéndolas de solo lectura o invisibles, y luego proporcione su propia barra de herramientas o botón que hace el cambio de nombre. Muy feo y los usuarios lo odian.

También he visto aplicaciones que desactivan el elemento de menú cambiar nombre en la barra de herramientas de la oficina, pero eso no impide que haga doble clic en la pestaña y cambie el nombre allí. También es muy feo y los usuarios lo odian.

Buena suerte, espero que a alguien se le ocurra una mejor respuesta.

3

Parece que no hay Evento para manejar esto, incluso utilizando el objeto Aplicación. Que molesto.

Probablemente intente capturarlo almacenando el valor de inicio de la hoja de cálculo y comprobándolo en tantos eventos como sea posible, lo que es un verdadero truco.

Lo siguiente parecía funcionar para mí, espero que ayude.

En el módulo 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 
Cuestiones relacionadas