2016-09-24 15 views
5

Tôi có một số biến trang tính công khai được khởi tạo lần đầu tiên khi sổ làm việc đang mở. Tôi có một nút thực hiện điều này về cơ bản:Biến toàn cục VBA không còn được khai báo sau khi xóa trang tính

Dim Response As Variant 

Response = MsgBox("Are you sure you want to delete this worksheet?", vbYesNo + vbExclamation, "Confirm Action") 
If Response = vbNo Then 
    GoTo exit sub 
End If 

'Save workbook prior to deletion as a precaution 
ThisWorkbook.Save 

ActiveSheet.Delete 

Vì lý do nào đó sau này, các biến bảng tính đó không còn được khai báo và tôi phải khởi động lại chúng mỗi lần. Tôi đã thử thêm cuộc gọi macro InitVariables của tôi sau khi .Delete và nó vẫn không hoạt động.

Bất kỳ lý do nào khiến điều này có thể xảy ra?

Trả lời

9

Lý do thực sự rất đơn giản - Bảng tính là một lớp trong VBA và mô-đun mã của nó được biên dịch cùng với phần còn lại của dự án ngay cả khi nó trống. Khi bạn xóa một trang tính và cho phép thực thi mã dừng, lần sau bạn chạy một số mã VBE phải biên dịch lại dự án vì bạn đã loại bỏ một mô-đun mã. Điều đó làm cho tiện ích mở rộng lớp tùy chỉnh của bạn mất trạng thái của chúng.

Lưu ý rằng điều này không không xảy ra trừ khi mã ngừng chạy và được biên dịch lại. Điều này chỉ hoạt động tốt:

Sheet1.foo = 42  'foo is a public variable in Sheet1 
Sheet2.Delete 
Debug.Print Sheet1.foo 'Prints 42 
+0

Tôi hiểu. Có cách nào tôi có thể chèn cuộc gọi InitVariables của tôi trong quá trình biên dịch lại sau đó? – KingKong

+0

Không thực sự là một cách tốt để đánh chặn các cuộc gọi biên dịch, và chắc chắn không phải từ VBA. Những gì bạn có trong globals của bạn? Nếu bạn có thể tạo lại chúng với một cuộc gọi 'InitVariables', nó sẽ không đơn giản hơn để gọi nó trước khi mã của bạn chạy? – Comintern

+0

Vâng, đó là khá nhiều những gì tôi đang làm. Tôi chỉ không muốn phải nhớ rằng mỗi khi tôi viết một phụ hoặc chức năng mới. – KingKong

3

Tôi vừa thử nghiệm nó bằng Comintern foo. Thật thú vị khi mô đun tiêu chuẩn foo làm mất giá trị nhưng biến foo công khai trong mô-đun trang tính không mất giá trị của nó.

enter image description here

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