Я знаю, что это старый вопрос, но недавно я начал использовать функцию CELL("filename")
в Excel, которая возвращает сведения как об именах файлов, так и листов.
Мы можем разобрать имя листа, используя эту известную формулу:
= MID (CELL ("" имя файла "", A1), FIND (""] "", CELL ("" имя файла "", "A1)) + 1,255)"
Записав эту функцию на скрытый лист, а затем отслеживая событие _Calculate
на этом листе, мы можем отследить любое изменение имени листа.
Мне пришлось прибегнуть к этому методу, потому что мне нужно было поделиться некоторым кодом VBA с клиентом, что дало ему возможность программно изменять некоторые имена рабочих листов, а также вводить их на вкладке. Этот метод фиксирует событие изменения имени листа, даже если оно было сделано в коде.
В приведенном ниже скелетном коде я только что зафиксировал изменение имени активной рабочей таблицы, но ничто не мешает вам добавить целевой список рабочей таблицы и соответствующим образом изменить код обработки.
Код, приведенный ниже, находится в коде рабочей книги:
Option Explicit
Private mSheetNamesWS As Worksheet
Private mOldSheetName As String
Private Sub Workbook_Open()
'Find or create the hidden worksheet
'containing the sheet reference.
On Error Resume Next
Set mSheetNamesWS = Me.Worksheets("SheetNames")
On Error GoTo 0
If mSheetNamesWS Is Nothing Then
'Disable events so that the _calculate event
'isn't thrown.
Application.EnableEvents = False
Set mSheetNamesWS = Me.Worksheets.Add
With mSheetNamesWS
.Name = "SheetNames"
.Visible = xlSheetVeryHidden
End With
Application.EnableEvents = True
End If
'Update the sheet reference.
If TypeOf ActiveSheet Is Worksheet Then
UpdateCellFormula
End If
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
'Active sheet has changed so update the reference.
If TypeOf ActiveSheet Is Worksheet Then
UpdateCellFormula
End If
End Sub
Private Sub UpdateCellFormula()
Dim cellRef As String
'Sense check.
If mSheetNamesWS Is Nothing Then Exit Sub
'The CELL function returns details about
'the file and sheet name of any
'specified range.
'By adding a formula that extracts the
'sheet name portion from the CELL function,
'we can listen for any changes
'of that value in the _calculate event method.
'Disable events to avoid a spurious
'_calculate event.
Application.EnableEvents = False
cellRef = ActiveSheet.Name & "!A1"
With mSheetNamesWS.Range("A1")
.Formula = _
"=MID(CELL(""filename""," & _
cellRef & _
"),FIND(""]"",CELL(""filename""," & _
cellRef & _
"))+1,255)"
mOldSheetName = .Value
End With
Application.EnableEvents = True
End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
'Disregard any sheet that isn't our reference sheet.
If Not Sh Is mSheetNamesWS Then Exit Sub
'The reference sheet has recalculated.
'It means the value of the cell containing
'the current sheet name has changed.
'Ergo we have a sheet name change.
'Handle the event here ...
MsgBox "You can't change the name of this sheet!"
Application.EnableEvents = False
ActiveSheet.Name = mOldSheetName
Application.EnableEvents = True
End Sub