Nhờ sửa giúp lỗi "Run-time error '16'. Expression too complex" trong VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

phananhvusv

Thành viên chính thức
Tham gia
28/3/17
Bài viết
72
Được thích
13
Em viết được đoạn code VBA như trong file đính kèm, nhưng chạy bị lỗi "Run-time error '16'. Expression too complex" mà không rõ nguyên nhân và cách khắc phục. Nhờ anh/chị trên diễn đàn xem giúp em với. em cám ơn ạ.
 

File đính kèm

  • Toan tinh chung sheet tra cứu F2.xlsm
    331.3 KB · Đọc: 14
Em viết được đoạn code VBA như trong file đính kèm, nhưng chạy bị lỗi "Run-time error '16'. Expression too complex" mà không rõ nguyên nhân và cách khắc phục. Nhờ anh/chị trên diễn đàn xem giúp em với. em cám ơn ạ.
Lỗi hàm Cdate hình như nó không chuyển đổi được thành dạng ngày tháng.Bạn tách nó thành tháng và năm rồi dùng hàm DateSerial rồi so sánh nhé.
 
Upvote 0
Lỗi hàm Cdate hình như nó không chuyển đổi được thành dạng ngày tháng.Bạn tách nó thành tháng và năm rồi dùng hàm DateSerial rồi so sánh nhé.
lạ thật, mình đưa vào mảng thì Cdate nó so sánh được ngay, còn lấy thẳng trên range thì báo lỗi.
Mã:
If CDate(arr2(i, 3)) >= CDate(dictuthang(arr2(i, 1))) And CDate(arr2(i, 4)) <= CDate(dicdenthang(arr2(i, 1))) Then
 
Upvote 0
CDate là hàm nguy hiểm. Biết chắc chắn khả năng và phạm vi của nó hãy dùng
Điển hình, nó có khả năng đoán ngày, và chỉnh theo hệ thống:
Hình dưới đây minh họa khả năng "đoán" ấy. Tôi theo hệ Âu, (dd/mm/yyyy) CDate sẽ đoán theo dạng ấy trước, nếu không được, nó sẽ tự đọng "thử" mm/dd/yyyy. Cuối cùng, nếu không thể đoán gì hêt thì nó báo lỗi:

1678364281556.png:
 
Upvote 0
lạ thật, mình đưa vào mảng thì Cdate nó so sánh được ngay, còn lấy thẳng trên range thì báo lỗi.
Mã:
If CDate(arr2(i, 3)) >= CDate(dictuthang(arr2(i, 1))) And CDate(arr2(i, 4)) <= CDate(dicdenthang(arr2(i, 1))) Then
Làm gì có chuyện lấy thẳng trên range thì lỗi mà lấy từ trị của mảng lại được. Lỗi từ đâu đó trong code thôi.
 
Upvote 0
Làm gì có chuyện lấy thẳng trên range thì lỗi mà lấy từ trị của mảng lại được. Lỗi từ đâu đó trong code thôi.
Khi đổ dữ liệu từ range ra mảng, Excel đã tính kết quả các biểu thức.
Khi lấy trị của một cell, Excel dùng phương thức khác.

Các hàm C* là hàm nắn kiểu - C là Cast. :úc dùng cell, CDate nắn kiểu của đối tượng mà nó lấy trong cell ra thành date. Lúc dùng trên array thì array đã nắn trước kiểu dữ liệu thành số hoặc chuỗi rồi.
 
Upvote 0
Khi đổ dữ liệu từ range ra mảng, Excel đã tính kết quả các biểu thức.
Khi lấy trị của một cell, Excel dùng phương thức khác.

Các hàm C* là hàm nắn kiểu - C là Cast. :úc dùng cell, CDate nắn kiểu của đối tượng mà nó lấy trong cell ra thành date. Lúc dùng trên array thì array đã nắn trước kiểu dữ liệu thành số hoặc chuỗi rồi.
Cám ơn anh, em học được một lý thuyết rất hay. Trước giờ thấy anh/chị trên diễn đàn dùng nhiều Dateserial mà ko hiểu tại sao không dùng Cdate. Vì em thấy Cdate gọn và tiện lợi hơn.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom