2012-12-13 16 views
26

Mam problem z awarią programu Excel, gdy uruchamiam kod VBA na arkuszu programu Excel. mam jakiś kod, aby dodać formułę do zakresu komórek w następujący sposób:MS Excel ulega awarii po uruchomieniu kodu vba

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

Gdy ten kod jest uruchamiany dostaję komunikat „Excel napotkał problem i musi zostać zamknięty” i Excel zamyka .

Jeśli uruchomić kod w klasie worksheet_active() to działa dobrze i nie upaść

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

Ale ja naprawdę potrzebuję go do pracy w klasie worksheet_change().

Czy ktoś ma podobne awarie podczas korzystania z klasy worksheet_change() i czy ktokolwiek może wskazać właściwy kierunek, aby rozwiązać ten problem?

+0

Kod w klasie nie "ulega awarii", ale raczej w kodzie wywołującym. Czy istnieje "testpage"? –

+0

Tak, istnieje, błąd wydaje się zdarzyć tylko wtedy, gdy wykonuję kod w Worksheet_Change – derek

+0

Czy zakres ("A1: A8") w arkuszu "testpage" jest czysty podczas pisania formuły? Nie ma już stołu obrotowego czy czegoś podobnego? Co ciekawe, dlaczego trzeba pisać tę samą formułę w tym samym miejscu po każdej zmianie arkusza? –

Odpowiedz

58

Uwaga: Odsyłałem już ludzi do tego linku dość często, więc zrobię to jako post dla jednego posta dla Worksheet_Change. Co jakiś czas, gdy znajdę czas, dodam do tego nowe treści, aby ludzie mogli na tym skorzystać.


Zawsze polecam to podczas korzystania Worksheet_Change

  1. Nie trzeba nazwę arkusza. Rozumie się, że kod ma być uruchamiany na aktualnym arkuszu O UNLESS próbujesz użyć innego arkusza jako odniesienia. Czy "testpage" to nazwa Activesheet, czy jest to inny arkusz?

  2. Zawsze, gdy współpracujesz z wydarzeniem Worksheet_Change. Zawsze przełączaj zdarzenia Off, jeśli zapisujesz dane w komórce. Jest to wymagane, aby kod nie znalazł się w możliwej nieskończonej pętli

  3. Gdy wyłączasz zdarzenia, użyj obsługi błędów, jeśli wystąpi błąd, kod nie zostanie uruchomiony po raz kolejny.

Spróbuj tego

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 

kilka innych rzeczy, które może chcesz dowiedzieć się podczas pracy z tego wydarzenia.

Jeśli chcesz się upewnić, że kod nie działa, gdy więcej niż jedna komórka zostanie zmieniona następnie dodać niewielką kontrolę

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 została wprowadzona w programie Excel 2007 naprzód ponieważ Target.Cells.Count Zwraca wartość Integer który błędy w programie Excel 2007 ze względu na zwiększenie wierszy/kolumn. Target.Cells.CountLarge zwraca wartość 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 

Aby pracować ze wszystkimi komórkami, które zostały zmienione użyć tego kodu

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 

Aby wykryć zmiany w określonej komórce, użyj Intersect. Na przykład, jeśli zmiana dzieje się w komórki A1, to poniższy kod zadziała

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 

Aby wykryć zmiany w konkretnym zestawie zakresie, należy Intersect ponownie. Na przykład, jeśli zmiana dzieje się w zakresie A1:A10, to poniższy kod zadziała

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

dzięki Siddharth, gdy usunąłem nazwę arkusza, wszystko działało bez żadnych awarii – derek

+0

Gr8! Mam nadzieję, że wyłączyłeś/włączałeś wydarzenia, jak również zasugerowałeś wyżej? –

+0

Czy nie będę musiał tego robić? – derek

11

Excel został upaść, a nie funkcję VBA.
Zdarzenia nie zostały wyłączone, a stos wywołań został wypełniony nieskończoną pętlą zdarzeń OnChange.
Mała rada, która pomaga znaleźć ten typ błędów: ustaw punkt przerwania w pierwszym wierszu zdarzenia, a następnie wykonaj krok po kroku, naciskając klawisz F8.

Powiązane problemy