Lỗi khi dán xác thực trong VBA - Mẹo Excel

Mục lục

Nếu bạn đã đọc vài chương đầu tiên của VBA & Macro cho Microsoft Excel, bạn biết rằng tôi phàn nàn rằng trình ghi macro Excel không thực hiện công việc tốt nhất là ghi lại mã có thể sử dụng. Thông thường, mã hoạt động tốt, nhưng nó được ghi lại theo cách có thể không hữu ích cho các bộ dữ liệu kích thước khác nhau. Mã có thể hoạt động tốt hôm nay, nhưng không phải ngày mai.

Tôi đã gặp phải một vấn đề thực sự kỳ lạ trong đó trình ghi macro thực sự ghi lại mã không hoạt động. Tôi đang viết một macro cố gắng sao chép xác thực từ một ô sang một dải ô. Trong Excel 2002, mã này như sau:

Range(“E5”).Copy Range(“E6:E12”).PasteSpecial Paste:=xlPasteValidation

Mã này hoạt động tốt trong Excel 2002, nhưng không thành công trên máy của khách hàng với Excel 2000. Một trong những máy tính cũ trong văn phòng vẫn có Excel 2000, vì vậy tôi đã thử mã ở đó. Vấn đề là với xlPasteValidation. Bất cứ khi nào tôi gặp điều gì đó bất thường, tôi khởi động trình ghi macro để xem trình ghi macro sẽ ghi mã như thế nào. Tôi đã thiết lập xác thực trong E5, bật trình ghi macro, sao chép E5 và sử dụng Dán đặc biệt - Xác thực. Sau khi dừng trình ghi macro, tôi lưu ý rằng Excel 2000 đã ghi lại hằng số là:

Range(“E6:E12”).PasteSpecial Paste:=xlDataValidation

Vì vậy, tôi đã đi đến ứng dụng khách, thay đổi mã thành xlDataValidation và chạy lại. Thật kỳ lạ, nó tạo ra cùng một lỗi!

Nó chỉ ra rằng trình ghi macro Excel 2000 thực sự có một lỗi. Nó sẽ ghi lại hằng số xlDataValidation, nhưng trình thông dịch macro sẽ không nhận ra xlDataValidation hay xlPasteValidation. Trợ giúp Excel VBA trong Excel 2000 giả vờ như không có cách nào để dán chỉ xác nhận.

Để thực hiện công việc này, bạn cần khám phá giá trị cơ bản của xlPasteValidation. Trên máy XL2002 của tôi, tôi đã truy cập VBA Editor. Gõ Ctrl + G để mở cửa sổ ngay lập tức và nhập vào cửa sổ ngay lập tức:

Print xlPasteValidation

Nhấn enter và Excel 2002 sẽ cho bạn biết rằng xlPasteValidation là một cách nói thân thiện để nói "6". Quay lại máy Excel 2000, tôi đã thử mã này:

Range(“E6:E12”).PasteSpecial Paste:=6

May mắn thay, nó hoạt động. Bạn thực sự buộc phải sử dụng giá trị cơ bản thay vì hằng số. Tôi cảnh báo chống lại cách làm này trong cuốn sách vì nó khiến chương trình thực sự khó đọc đối với người tiếp theo khi xem mã. Trong trường hợp cụ thể này, bạn thực sự không có lựa chọn nào khác. Thêm nhận xét giải thích lý do tại sao bạn mã hóa nó theo cách này:

‘Bug in XL2000; need to use “6” instead of the constant Range(“E6:E12”).PasteSpecial Paste:=6

Vì vậy - bài học nhỏ hôm nay là vấn đề rất cụ thể về cách dán xác thực đặc biệt trong Excel 2000, nhưng bài học lớn hơn là công việc thám tử được yêu cầu để tìm ra điều gì đang xảy ra khi có điều gì đó kỳ lạ xảy ra trong Excel VBA.

thú vị bài viết...