2012-12-13 42 views
26

Tôi đang gặp sự cố với lỗi excel khi tôi chạy mã VBA trên bảng excel. Tôi có một số mã để thêm một công thức để một loạt các tế bào như sau:MS Excel gặp sự cố khi mã vba chạy

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

Khi mã này được chạy tôi nhận được một thông báo "excel đã gặp sự cố và cần phải đóng" và xuất sắc đóng cửa .

NẾU tôi chạy mã trong lớp worksheet_active() nó hoạt động tốt và không sụp đổ

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

Nhưng tôi thực sự cần nó để làm việc trong lớp worksheet_change().

Có ai gặp phải sự cố tương tự khi sử dụng lớp học worksheet_change() và bất kỳ ai có thể chỉ đúng hướng để khắc phục sự cố này không?

+0

Mã trong lớp không bị "treo" ở đó, mà đúng hơn là trong mã gọi. "Testpage" có tồn tại không? –

+0

Có tồn tại, lỗi dường như chỉ xảy ra khi tôi chạy mã trong Worksheet_Change – derek

+0

Phạm vi ("A1: A8") trong trang "testpage" có sạch khi bạn viết công thức không? Không có bảng tổng hợp hay bất cứ thứ gì như thế đã có? Ngoài ra, chỉ cần tò mò, tại sao bạn sẽ cần phải viết cùng một công thức trong cùng một vị trí sau mỗi thay đổi trong một bảng tính? –

Trả lời

58

Lưu ý: Tôi đã giới thiệu mọi người đến liên kết này khá thường xuyên vì vậy tôi sẽ làm cho bài đăng này là một điểm dừng cho Worksheet_Change. Mỗi khi bây giờ và sau đó, khi tôi nhận được thời gian, tôi sẽ thêm nội dung mới cho điều này để mọi người có thể hưởng lợi cho nó.


tôi luôn khuyên này khi sử dụng Worksheet_Change

  1. Bạn không cần tên sheet. Điều này được hiểu rằng mã sẽ được chạy trên trang tính hiện tại UNLESS bạn đang cố gắng sử dụng trang tính khác làm tài liệu tham khảo. Có phải "testpage" tên Activesheet hoặc là một trang tính khác?

  2. Bất cứ khi nào bạn đang làm việc với sự kiện Worksheet_Change. Luôn chuyển đổi các sự kiện Off nếu bạn đang ghi dữ liệu vào ô. Điều này là bắt buộc để mã không đi vào vòng lặp vô tận có thể

  3. Bất cứ khi nào bạn tắt sự kiện, hãy sử dụng xử lý lỗi nếu bạn gặp lỗi, mã sẽ không chạy vào lần tiếp theo.

Hãy thử điều này

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 

vài thứ khác mà bạn có thể muốn biết khi làm việc với sự kiện này.

Nếu bạn muốn đảm bảo rằng mã không chạy khi hơn một tế bào bị thay đổi sau đó thêm một kiểm tra nhỏ

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

    ' 
    '~~> Rest of code 
    ' 
End Sub 

Các CountLarge đã được giới thiệu trong Excel 2007 trở đi vì Target.Cells.Count lợi nhuận một giá trị Integer mà lỗi trong Excel 2007 bởi vì tăng hàng/cột. Target.Cells.CountLarge trả về giá trị 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 

Để làm việc với tất cả các tế bào đã được thay đổi sử dụng mã này

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 

Để phát hiện sự thay đổi trong một tế bào đặc biệt, sử dụng Intersect. Ví dụ, nếu một sự thay đổi xảy ra trong tế bào A1, sau đó mã dưới đây sẽ cháy

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 

Để phát hiện sự thay đổi trong một tập hợp các phạm vi, sử dụng Intersect một lần nữa. Ví dụ: nếu thay đổi xảy ra trong phạm vi A1:A10, thì mã bên dưới sẽ kích hoạt

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

cảm ơn Siddharth khi tôi xóa tên trang tính đã hoạt động tốt mà không gặp bất kỳ sự cố nào – derek

+0

Gr8! Tôi hy vọng bạn đã tắt/bật các sự kiện cũng như đề xuất ở trên? –

+0

Tôi sẽ không phải làm điều đó không? – derek

11

Excel bị lỗi, không phải chức năng VBA.
Các sự kiện không bị tắt và ngăn xếp cuộc gọi được lấp đầy bởi vòng lặp vô hạn của sự kiện OnChange.
Một lời khuyên nhỏ giúp tìm loại lỗi này: đặt điểm ngắt trên dòng đầu tiên của sự kiện, sau đó thực hiện từng bước nhấn F8.

Các vấn đề liên quan