2009-12-21 18 views

risposta

4

Ecco un approccio. Il trucco è quello di intercettare gli eventi a livello di applicazione tramite una classe dedicata. Utilizzando l'evento SheetActivate, memorizza un riferimento al foglio attivo e il suo nome. Quando il foglio è disattivato (e un altro attivato) confronta il nome del riferimento del foglio con la stringa memorizzata. Ecco la classe (chiamati 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 

un'istanza di questo con una variabile globale utilizzando l'evento aperto cartella di lavoro:

Public xlc As CExcelEvents 

Sub Workbook_Open() 
    Set xlc = New CExcelEvents 
End Sub 

L'esempio precedente scatterà solo quando l'utente seleziona un altro foglio. Se si desidera una maggiore granularità, monitorare anche l'evento di cambio del foglio.

+0

Questo non funziona più. – plocks

+0

L'unico evento che riesco a trovare in Excel 2016 che si attiva quando un foglio viene ridenominato è Application.AfterCalculate. L'approccio è più o meno lo stesso: mantenere una mappatura degli oggetti del foglio di lavoro e dei loro nomi correnti e confrontarli tutti durante questo evento. – nicholas

0

Aspetto con impazienza una risposta a questo perché non l'ho capito dopo molte ricerche. Non è stato rinominato un evento su un foglio di lavoro che ho trovato, quindi sei costretto ad avere un approccio alternativo.

il migliore che ho visto (che è terribile ) è di vietare rinomina sui fogli rendendoli di sola lettura o invisibile, e quindi fornire la propria barra degli strumenti o il pulsante che fa la ridenominazione. Molto brutto e gli utenti lo odiano.

Ho anche visto applicazioni che disabilitano la voce di menu rinomina nella barra degli strumenti dell'ufficio, ma ciò non impedisce di fare doppio clic sulla scheda e rinominare lì. Anche molto brutto e gli utenti lo odiano.

Buona fortuna, spero che qualcuno fornisca una risposta migliore.

3

Apparentemente non esiste un evento per gestire questo, anche utilizzando l'oggetto Application. Che noioso.

Probabilmente cercherò di acquisirlo memorizzando il valore di avvio del foglio di lavoro e controllandolo su quanti più eventi possibile - che è certamente un trucco.

Quanto segue sembrava funzionare per me, Spero che sia d'aiuto.

Nel modulo 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 
Problemi correlati