2009-12-21 4 views

답변

4

여기에 한 가지 방법입니다. 트릭은 전용 클래스를 통해 응용 프로그램 수준에서 이벤트를 트랩하는 것입니다. SheetActivate 이벤트를 사용하여 활성 시트 및 해당 이름에 대한 참조를 저장합니다. 시트가 비활성화되고 다른 활성화 된 경우 시트 참조의 이름과 저장된 문자열을 비교합니다. 통합 문서 오픈 이벤트를 사용하여 글로벌 변수

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 

예는 상기 트리거 여기서 클래스 (호출 CExcelEvents)가있다. 더 자세한 내용을 원하면 Sheet Change 이벤트도 모니터링하십시오.

+0

더 이상 작동하지 않습니다. – plocks

+0

시트 이름이 바뀔 때 발생하는 Excel 2016에서 유일한 이벤트는 Application.AfterCalculate입니다. 접근 방식은 대략 동일합니다 : 워크 시트 개체와 현재 이름의 매핑을 유지하고이 이벤트 동안 모든 개체를 교차 확인하십시오. – nicholas

0

많은 검색을 통해 찾지 못했기 때문에 열심히 답변을 기다리고 있습니다. 내가 찾은 워크 시트에는 이름 바꾸기 이벤트가 없으므로 대체 접근 방식을 강요 받고 있습니다.

제가 가장 잘 보았던 것은 (끔찍한) 시트를 읽기 전용 또는 보이지 않게하여 이름 바꾸기를 금지 한 다음 이름 바꾸기를 수행하는 고유 한 도구 모음이나 단추를 제공하는 것입니다. 매우 못생긴 사용자가 그것을 싫어합니다.

Office 도구 모음에서 이름 바꾸기 메뉴 항목을 사용할 수 없지만 탭을 두 번 클릭하고 이름을 바꾸지 못하는 응용 프로그램을 보았습니다. 또한 매우 못생긴 사용자가 그것을 싫어합니다.

행운을 빌어 사람들이 더 좋은 대답을 찾길 바랍니다.

3

Application 개체를 사용하는 경우에도이를 처리 할 이벤트가 없습니다. 얼마나 짜증나.

워크 시트의 시작 값을 저장하고 가능하면 많은 이벤트를 검사하여 캡처하려고 시도합니다. 이는 해킹입니다.

다음은 저에게 효과적이었습니다. 희망이 도움이됩니다. 에서 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 
관련 문제