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
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?
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
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
Kod w klasie nie "ulega awarii", ale raczej w kodzie wywołującym. Czy istnieje "testpage"? –
Tak, istnieje, błąd wydaje się zdarzyć tylko wtedy, gdy wykonuję kod w Worksheet_Change – derek
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? –