2012-12-13 70 views
26

我在excel表單上運行VBA代碼時遇到了Excel崩潰問題。 我有一些代碼,以一個公式添加到單元格區域如下:當VBA代碼運行時,MS Excel崩潰

Private Sub Worksheet_Change(ByVal Target As Range) 
    Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1" 
End Sub 

當這個代碼運行,我得到一個消息,說「Excel遇到問題,需要關閉」和excel關閉。

如果我運行在worksheet_active()類的代碼,它工作正常,並不會崩潰

Private Sub Worksheet_Activate() 
    Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1" 
End Sub 

但我真的需要它在worksheet_change()類工作。

有沒有人在使用worksheet_change()類時遇到類似的崩潰問題,任何人都可以指出正確的方向來解決此問題?

+0

類中的代碼不會在那裏「崩潰」,而是在調用代碼中。 「testpage」是否存在? –

+0

是的,它似乎只發生在我運行Worksheet_Change中的代碼時 – derek

+0

當你寫公式時,「testpage」表中的Range(「A1:A8」)是否乾淨?有沒有數據透視表或任何其他類似的東西?此外,只是好奇,爲什麼你需要在工作表中每次更改之後在同一個地方寫同一個公式? –

回答

58

注意:我一直在提及這個鏈接的人現在很多,所以我會讓這個Worksheet_Change一站式發佈。無論何時,當我抽出時間時,我都會添加新的內容,以便人們可以從中受益。


我使用Worksheet_Change

  1. 當你不需要工作表名稱總是推薦這樣做。據瞭解,該代碼將在當前圖紙上運行,除非您試圖使用另一張表作爲參考。 「testpage」是Activesheet的名稱還是不同的工作表?

  2. 每當您使用Worksheet_Change事件時。如果要將數據寫入單元,請始終切換Off事件。這是必需的,以便代碼不會進入無限循環

  3. 每當您關閉事件時,如果出現錯誤,請使用錯誤處理,否則代碼將不會在下次運行。

嘗試,你可能要與此事件工作時就知道這個

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo Whoa 

    Application.EnableEvents = False 

    Range("A1:A8").Formula = "=B1+C1" 

Letscontinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume Letscontinue 
End Sub 

一些其他的東西。

如果你想確保在多個小區改變,那麼加一個小檢查

Private Sub Worksheet_Change(ByVal Target As Range) 
    '~~> For Excel 2003 
    If Target.Cells.Count > 1 Then Exit Sub 

    ' 
    '~~> Rest of code 
    ' 
End Sub 

CountLarge在Excel 2007中引入的代碼不能運行以後,因爲Target.Cells.Count返回一個Integer值由於增加了行/列,Excel 2007中出現錯誤。 Target.Cells.CountLarge返回值Long

Private Sub Worksheet_Change(ByVal Target As Range) 
    '~~> For Excel 2007 
    If Target.Cells.CountLarge > 1 Then Exit Sub 
    ' 
    '~~> Rest of code 
    ' 
End Sub 

要與已更改使用此代碼

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim aCell As Range 

    For Each aCell In Target.Cells 
     With aCell 
      '~~> Do Something 
     End With 
    Next 
End Sub 

爲了檢測特定的細胞變化的所有細胞不起作用,使用Intersect。例如,如果在細胞A1一個改變發生,則下面的代碼將觸發

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("A1")) Is Nothing Then 
     MsgBox "Cell A1 was changed" 
     '~~> Your code here 
    End If 
End Sub 

要在一組特定的範圍檢測變化,再次使用Intersect。例如,如果在範圍A1:A10的變化情況,然後下面的代碼將火

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("A1:A10")) Is Nothing Then 
     MsgBox "Cell in A1:A10 range was changed" 
     '~~> Your code here 
    End If 
End Sub 
+0

謝謝Siddharth,當我刪除表單名稱,它工作正常,沒有任何崩潰 – derek

+0

Gr8!我希望你關閉/關閉事件以及上面的建議? –

+0

我不會這麼做嗎? – derek

11

Excel軟件崩潰,而不是VBA函數。
事件未被禁用,調用堆棧由無限循環的OnChange事件填充。
有一點建議可以幫助找到這種類型的錯誤:在事件的第一行設置一個斷點,然後按F8逐步執行它。