2014-06-24 88 views

回答

2

對不起,我最初誤讀你的問題。

將這個代碼在工作表中的代碼:

Public sheetOpenned As Boolean ' should go at the top of the page 

Private Sub Worksheet_Activate() 
    If sheetOpenned = False Then 
     ' run your macro 
     sheetOpenned = True 
    End If 
End Sub 

不過要注意的是,打開工作簿和片材是默認的一個是活躍在這一分將不會運行。我懷疑你將不得不添加另一段代碼來處理Workbook_Open()事件中的這種情況。

0

在Excel VB編輯器幫助中查找事件。有很多事件,並且你可以編寫例程來在發生興趣時調用。

下面的例程不處理用戶創建新工作表或改變現有工作表的順序,但應該爲您提供一些關於如何實現您所尋求的效果的想法。

打開工作簿,然後是VB編輯器。項目瀏覽器在左側。如有必要,點擊加號對其展開Microsoft Excel Objects。點擊ThisWorkbook,會顯示一個空的代碼區域。在該代碼區域複製下面的代碼。保存並關閉工作簿。重新打開工作簿並在工作表之間切換。打開VB編輯器以查看Debug.Print輸出。關閉工作簿以查看最終顯示。

希望這會有所幫助。

Option Explicit 
    Dim ActivateCount() As Long 
Sub Workbook_Open() 

    Dim InxS As Long 

    Debug.Print "Workbook """ & ActiveWorkbook.Name & """ opened" 

    ReDim ActivateCount(1 To Sheets.Count) 
    ' Entries will be initialised to zero. 

    ' SheetActivate is not called for the initial sheet 

    For InxS = 1 To Sheets.Count 
    If Sheets(InxS).Name = ActiveSheet.Name Then 
     ActivateCount(InxS) = ActivateCount(InxS) + 1 
     Debug.Print "Worksheet """ & ActiveSheet.Name & """ activation count = " & ActivateCount(InxS) 
     Exit For 
    End If 
    Next 

End Sub 
Private Sub Workbook_SheetActivate(ByVal Sh As Object) 

    Dim InxS As Long 

    For InxS = 1 To Sheets.Count 
    If Sheets(InxS).Name = Sh.Name Then 
     ActivateCount(InxS) = ActivateCount(InxS) + 1 
     Exit For 
    End If 
    Next 

    Debug.Print "Worksheet """ & Sh.Name & """ activation count = " & ActivateCount(InxS) 

End Sub 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    Dim InxS As Long 
    Dim Text As String 

    Text = "Activation counts" 
    For InxS = 1 To Sheets.Count 
    Text = Text & vbLf & " " & ActivateCount(InxS) & " " & Sheets(InxS).Name 
    Next 
    Call MsgBox(Text, vbOKOnly) 

End Sub 
+0

非常感謝託尼。我認爲按照@Armen的建議聲明一個公共變量就是一個竅門。變量在第一次激活表單時設置爲1,然後定義的事件代碼由於公共變量標誌爲1而不執行。 –

相關問題