Xin hỏi về vấn đề xoá control hàng loạt bằng VBA bị lỗi:
Nguyên là thành viên Kyo muốn tạo dựng lại Game Trúc xanh, nhưng làm trên form, không làm trên sheet. Code điểu khiển lật ô đã có rồi.
Nhưng khi thay level, số lượng control sẽ thay đổi theo level (16, 24, 36), thì làm theo hướng vẽ sẵn 36 Command button và 36 label, đặt tên theo thứ tự.
Khi đổi level sẽ phải dấu bớt hoặc làm hiện ra các control, đồng thời sắp xếp lại các control khác theo thứ tự, để có thể điều khiển.
Ngoài ra sẽ phải viết sẵn code cho 36 command button, mỗi button 1 sub.
Thấy có vẻ phức tạp, tôi bèn hỗ trợ Kyo bằng code vẽ control hàng loạt. Khi thay đổi thì sẽ xoá hết các control cũ và vẽ lại controls mới, đúng số lượng cần thiết, cho nhanh. Đồng thời, hỗ trợ Kyo dùng Class (tạo 1 Class module) để có thể dùng 1 sub duy nhất điều khiển các button (số lượng buttton thay đổi không ảnh hưởng gì nữa).
Xin nói trước là mỗi lần chạy, code sẽ lần lượt làm những việc sau:
- xoá hết control cũ
- căn cứ vào level hiện tại, vẽ 1 số lượng label, và 1 số lượng commandButton
- Gán caption cho các labels bằng các tên hàm Excel ngẫu nhiên ở các vị trí ngẫu nhiên, theo cặp. (Kyo viết hàm ngẫu nhiên)
- Gán caption cho các Button bằng số thứ tự từ 1 đến hết
- Gán các Button vào Class
- Hiện form
Code đã viết xong, chạy cũng được. nhưng sinh ra lỗi như sau mà không lý giải được là lỗi do đâu.
- Mở file lên, chạy lần thứ nhất, bình thường
- Chạy lần 2, lần 3 có thể bình thường, kể cả chọn lại level
- Nhưng đến 1 lúc nào đó, có thể là lần 2 trở đi (lần 1 chắc chắn không lỗi), sẽ bị sinh ra lỗi: Invalid Forward reference, or refer to uncompiled type. Chỉ có thể end, không có debug
- Nếu cố nhấn nút play lần nữa, thì lại ra thông báo khác: Element not found. Lần này thì cho debug.
- Không chạy thêm được lần nào nữa, trừ khi làm như sau:
- Nếu để nguyên Excel, chỉ đóng file mở lên lại, thì xác suất lỗi giảm xuống.
Nhờ mọi người test hộ, tìm nguyên nhân, và tìm hướng khắc phục. Để Kyo tiếp tục hoàn thiện dự án VBA Game đầu tay của mình, và cả tôi cũng có dịp học hỏi.
Xin cám ơn,
Ghi chú:
Khi bị lỗi và ngừng code, thấy rằng code Delete Controls không xoá hết được control trên form, chỉ xoá 1 button duy nhất. Do đó lỗi trong code vẽ lại control. Ngoài ra không phát hiện điều gì khác.
Nguyên là thành viên Kyo muốn tạo dựng lại Game Trúc xanh, nhưng làm trên form, không làm trên sheet. Code điểu khiển lật ô đã có rồi.
Nhưng khi thay level, số lượng control sẽ thay đổi theo level (16, 24, 36), thì làm theo hướng vẽ sẵn 36 Command button và 36 label, đặt tên theo thứ tự.
Khi đổi level sẽ phải dấu bớt hoặc làm hiện ra các control, đồng thời sắp xếp lại các control khác theo thứ tự, để có thể điều khiển.
Ngoài ra sẽ phải viết sẵn code cho 36 command button, mỗi button 1 sub.
Thấy có vẻ phức tạp, tôi bèn hỗ trợ Kyo bằng code vẽ control hàng loạt. Khi thay đổi thì sẽ xoá hết các control cũ và vẽ lại controls mới, đúng số lượng cần thiết, cho nhanh. Đồng thời, hỗ trợ Kyo dùng Class (tạo 1 Class module) để có thể dùng 1 sub duy nhất điều khiển các button (số lượng buttton thay đổi không ảnh hưởng gì nữa).
Xin nói trước là mỗi lần chạy, code sẽ lần lượt làm những việc sau:
- xoá hết control cũ
- căn cứ vào level hiện tại, vẽ 1 số lượng label, và 1 số lượng commandButton
- Gán caption cho các labels bằng các tên hàm Excel ngẫu nhiên ở các vị trí ngẫu nhiên, theo cặp. (Kyo viết hàm ngẫu nhiên)
- Gán caption cho các Button bằng số thứ tự từ 1 đến hết
- Gán các Button vào Class
- Hiện form
Code đã viết xong, chạy cũng được. nhưng sinh ra lỗi như sau mà không lý giải được là lỗi do đâu.
- Mở file lên, chạy lần thứ nhất, bình thường
- Chạy lần 2, lần 3 có thể bình thường, kể cả chọn lại level
- Nhưng đến 1 lúc nào đó, có thể là lần 2 trở đi (lần 1 chắc chắn không lỗi), sẽ bị sinh ra lỗi: Invalid Forward reference, or refer to uncompiled type. Chỉ có thể end, không có debug
- Nếu cố nhấn nút play lần nữa, thì lại ra thông báo khác: Element not found. Lần này thì cho debug.
- Không chạy thêm được lần nào nữa, trừ khi làm như sau:
- Nhấn debug
- Nhấn nút stop trên thanh công cụ
- Mở form bằng nút Run trên thanh công cụ
- Không làm gì cả, Đóng form lại
- Quay trở ra sheet
- Chơi bình thường, 5, 7 lần không thấy lỗi lại. Kể cả thay đổi level trên sheet
- Nếu để nguyên Excel, chỉ đóng file mở lên lại, thì xác suất lỗi giảm xuống.
Nhờ mọi người test hộ, tìm nguyên nhân, và tìm hướng khắc phục. Để Kyo tiếp tục hoàn thiện dự án VBA Game đầu tay của mình, và cả tôi cũng có dịp học hỏi.
Xin cám ơn,
Ghi chú:
Khi bị lỗi và ngừng code, thấy rằng code Delete Controls không xoá hết được control trên form, chỉ xoá 1 button duy nhất. Do đó lỗi trong code vẽ lại control. Ngoài ra không phát hiện điều gì khác.
File đính kèm
Lần chỉnh sửa cuối: