2015-07-20 105 views
0

我有一個excel工作簿。不執行工作表計算事件工作簿打開

在其中一個工作表中,我使用了Worksheet_calculate事件。這工作正常。但是,首次打開工作簿時,我不希望調用MyFunction。做這件事最好的是​​什麼?

我到目前爲止唯一的想法是以下(我不喜歡這個雖然)。在工作簿打開方法中在其中一個工作表中放入一個時間戳,然後在我的worksheet_calculate中添加一個if語句,並且如果當前時間比時間戳(在工作簿打開事件上創建的時間戳)超出1分鐘,請運行代碼,否則,請不要運行代碼「T。

想一想還有更好的辦法嗎?

Private Sub Worksheet_Calculate() 
    MyFunction() 
End Sub 

更新

我不想打開工作簿時,我的代碼來執行的原因是因爲有需要一點時間來開始執行這樣的一些單元格的值是一些彭博公式#NA。

這會導致類型不匹配錯誤 - 記錄發生的任何錯誤並自動發送電子郵件。所以每次打開工作簿時有一個「錯誤」作爲彭博公式還沒有更新馬上

+1

也許會對開宣佈公共布爾,即在Workbook_Open方法的末尾設置爲true。只有在事情真的發生時才讓你的事情發生。它可能會阻止第一次運行。 –

+0

如果您的工作簿在打開狀態下計算,則會在任何事件運行之前發生,包括「Open」事件。你爲什麼不想讓代碼首先運行 - 它有什麼作用? – Rory

回答

1

下面的代碼應該適合你。 第一次計算被調用時,它會設置標誌以允許將來的調用進行處理。這意味着第一個計算調用不會處理您的代碼。

的ThisWorkbook代碼:

Private Sub Workbook_Open() 
    bFunctionFlag = False 
End Sub 

表代碼:

Public bFunctionFlag As Boolean 

Private Sub Worksheet_Calculate() 
    If bFunctionFlag = True Then Call MyFunction 
    bFunctionFlag = True 
End Sub 

Private Function MyFunction() 
    MsgBox "Calculate" 
End Function 
+0

'bFunctionFlag = False'在Workbook_Open()中是多餘的 – pathDongle

+0

雖然實質上你可能是正確的,但它不符合良好的編碼習慣。也許你應該看看以下內容:https://en.wikipedia.org/wiki/Uninitialized_variable – Tragamor

+0

我得到的是,通過在工作簿公開活動中設置'bFunctionFlag = False',您可能會失去bFunctionFlag的狀態如果變量重置。如果你交換事件和子事件中的真/假分配,那麼你不能失去狀態。 – pathDongle

0

在打開工作簿時,你可以有

Private Sub Workbook_Open() 
    Application.EnableEvents = False 
    'Run Workbook Open code 
    Application.EnableEvents = True 
End Sub 

,或者如果你需要的事件從外部運行服務然後做一些類似的公共變量。例如Dim wbOpenEventEnded as Boolean

相關問題