2015-10-14 51 views
0

我有一個Excel 2010工作簿,每次輸入時都堅持「計算」,即使沒有任何更改時退出單元格(空白)。Excel 2010在沒有任何變化時計算

如果上面的工作簿是開放的,它會將問題傳播到任何其他正在打開的工作簿。上述工作簿關閉時問題將消失。

有問題的工作簿包含3張表; 1有一個用SQL命令提取外部數據的表格, 2有各種公式可以彙總表格1中的數據, 3有各種使用Sheet2數據的圖表。

有問題的工作簿不包含宏。

我搜索了谷歌高低無濟於事,有什麼想法?

+4

尋找明顯的嫌疑人:**間接()**,**偏移()**,**今天()**,**現在()**等 –

+0

添加[ADDRESS]( https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89)添加到上面的** volatile **函數列表中。在大多數情況下,易失性公式可以用非易失性公式代替。查找揮發性公式的示例並編輯您的問題以包含它們。可能有替代品。 – Jeeped

+0

謝謝你們,問題是今天(),將在未來保持揮發性功能的記憶,現在尋找非揮發性版本的Today() –

回答

0

由於TODAY function被認爲是一個易失性函數,因此在長列和/或公式行中重複使用它是不明智的,特別是在計算密集的數組公式中。當整個工作簿中的任何內容發生變化時,計算滯後可以迅速增加,並且函數的易變本質將強制執行一個計算週期,而不僅僅是當實際影響其結果的某些事情隨着非易失性函數的規範而改變時。

基於公式的定義名稱並不實際引用任何工作表調用,這裏很適合。使用諸如=DATE(YEAR(TODAY()), MONTH(TODAY()), DAY(TODAY()))之類的東西會適得其反,因爲您尚未刪除易失性TODAY()函數。但是,VBA可以將硬編碼的本地工作表函數寫入定義名稱的RefersTo:。在這種情況下,當前日期將使用工作表'DATE function構建。

以下代碼屬於ThisWorkbook代碼頁。 Tap Alt + F11當VBE打開時,找到ThisWorkbook in Project Explorer。如果項目瀏覽器不可見,請點擊Ctrl + R或使用下拉菜單選擇View►Project Explorer。

ThisWorkbook Code sheet

雙擊的ThisWorkbook或右鍵單擊並選擇查看代碼。將以下內容粘貼到標題爲Book1 - ThisWorkbook(Code)的代碼表中。

Private Const dnCURRENT As String = "Current" 

Private Sub Workbook_Open() 
    'force a Workbook_SheetChange on open to check Current date 
    Call Workbook_SheetChange(Worksheets(1), Worksheets(1).Cells(1)) 
End Sub 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    On Error GoTo no_Current 
    With ThisWorkbook.Names(dnCURRENT) 
     On Error GoTo bm_Safe_Exit 
     If Application.Evaluate(.RefersTo) <> Date Then 
      Application.EnableEvents = False 
      .RefersTo = "=DATE(" & Year(Date) & ", " & Month(Date) & ", " & Day(Date) & ")" 
     End If 
    End With 

GoTo bm_Safe_Exit 
no_Current: 
    ThisWorkbook.Names.Add Name:=dnCURRENT, _ 
          RefersTo:="=DATE(" & Year(Date) & ", " & Month(Date) & ", " & Day(Date) & ")", _ 
          Visible:=True 
    Resume 
bm_Safe_Exit: 
    If CBool(Err.Number) Then _ 
     Debug.Print Err.Number & ":" & Err.Description 
    Application.EnableEvents = True 

End Sub 

如果你想改變的定義名稱的名稱,在頂部的私人常數變量聲明這樣做。點擊Alt + 問題返回到您的工作表。

第一次在任何工作表上進行任何更改時,將創建一個名爲工作簿範圍的新定義名稱,稱爲當前。它將有一個RefersTo:用硬編碼的DATE function返回當前系統日期(例如=DATE(2015, 10, 14))。如果當前日期不等於該公式返回的已定義名稱值,則會使用當前日期編寫新公式,這會強制引用所定義名稱的所有公式的新工作簿範圍計算週期。

定義的名稱當前是可以使用TODAY()函數的任何地方的直接替換。在實踐中,涉及當前的公式只會每天重新計算一次。下圖顯示了在開始將其鍵入公式時它將如何顯示爲選項。

Defined Name with Formula in native worksheet formula


¹揮發性功能重新計算一旦有事情在整個工作簿的改變,不只是當東西,影響了他們的成果的變化。 volatile的示例的功能是INDIRECT,OFFSET,TODAY,NOW,RANDRANDBETWEENCELLINFO工作表函數的一些子函數也會使它們變得不穩定。