Lỗi mới xuất hiện trong VBA cho Excel khi gán mảng có độ dài bằng không.
Tôi thường sử dụng mảng có độ dài bằng 0 làm giá trị trả về từ các hàm hoặc làm giá trị trong từ điển để chỉ ra một danh sách rỗng. Điều này vẫn luôn hoạt động tốt với tôi, nhưng đột nhiên (kể từ lần cập nhật Windows gần đây nhất?) nó lại báo lỗi (Lỗi thời gian chạy '5': Lời gọi thủ tục hoặc đối số không hợp lệ):
Mã số:
Tùy chọn rõ ràng
Hàm MyFunc() kiểu Variant
Dim MyDict As New Scripting.Dictionary
Khai báo biến MyVariant là Variant
MyVariant = Array()
MyDict("A") = MyVariant 'Câu lệnh này gây ra lỗi
MyFunc = MyVariant 'Câu lệnh này gây ra lỗi
Kết thúc hàm
Theo tôi, đây không phải là hành vi mong muốn! Điều gì đã thay đổi kể từ lần cập nhật Windows gần đây nhất?
/J
Trả lời:
Tôi đồng ý, đây là một lỗi, tôi đã xác định được vấn đề nằm ở hàm Array().
Sub Test()
Dim Data
Dữ liệu = Mảng()
Dừng lại
End Sub
Nếu bạn chạy đoạn mã đó và xem dữ liệu trong cửa sổ Watch, bạn sẽ thấy rằng nó không phải là một mảng (từ 0 đến -1) như lẽ ra phải vậy.
Để khắc phục sự cố, bạn có thể sử dụng đối tượng từ điển để lấy một mảng rỗng.
Sub Test2()
Dim Data
Dim Dict As Object
Set Dict = CreateObject("Scripting.Dictionary")
Dữ liệu = Dict.Items
Dừng lại
End Sub
Nếu bạn khám phá Dữ liệu trong cửa sổ Theo dõi tại thời điểm này, bạn có thể thấy rằng có một mảng (0 đến -1)
Andreas.
> > > > > > > > >Trả lời:
Tôi chỉ muốn thông báo lại, tôi đã cập nhật Windows lên phiên bản mới nhất nhưng vẫn không thấy lỗi nào:
Đúng vậy, nhưng bạn đang dùng Windows 10 và tôi cũng không gặp vấn đề đó trên các máy tính chạy Windows 10.
Nhưng tôi cũng có một máy tính chạy Win8.1 với Excel 2010 và tất cả các bản cập nhật, và tôi có thể tái hiện lỗi này trên máy đó.
Andreas.
> > > > >Trả lời:
Những thay đổi kể từ lần cập nhật Windows gần nhất là gì?
Cập nhật:
Tôi đã nhận được một số thông tin cập nhật vào tối qua:
https://support.microsoft.com/en-us/help/4464566/security-update-for-office-2010-september-10-2019
https://support.microsoft.com/en-us/help/4475599/security-update-for-office-2010-september-10-2019
https://support.microsoft.com/en-us/help/4475574/security-update-for-excel-2010-september-10-2019
https://support.microsoft.com/en-us/help/4516115/security-update-for-adobe-flash-player
https://support.microsoft.com/en-us/help/4516067/windows-8-1-kb4516067
https://support.microsoft.com/en-us/help/4514604/sep-10-2019-kb4514604
https://support.microsoft.com/en-us/help/4512938/compatibility-update-for-installing-windows-8-1-rt-and-server-2012-r2
Hôm nay vấn đề đã được giải quyết. Phù. :-)
Andreas.
> > > > >Trả lời:
Cảm ơn Andreas vì những nỗ lực của bạn. Tôi hy vọng vấn đề của tôi sẽ được giải quyết sau bản cập nhật ngày 10 tháng 9. Tôi đang làm việc với bộ phận CNTT ở đây để giải quyết vấn đề này càng sớm càng tốt. Tôi sẽ cập nhật tiến độ sau.
Chỉ tò mò thôi. Chắc hẳn phải có hàng trăm ứng dụng VBA ngoài kia bị lỗi vì điều này? Hay chỉ mình tôi sử dụng mảng rỗng được tạo bởi "Array()" làm giá trị trả về trong các hàm? Có cách nào tốt hơn (an toàn hơn) để khai báo mảng có kích thước bằng không không? (Tôi thấy cách giải quyết của bạn bằng cách sử dụng đối tượng từ điển).
Trả lời:
Chỉ tò mò thôi. Chắc hẳn phải có hàng trăm ứng dụng VBA ngoài kia bị lỗi vì điều này? Hay chỉ mình tôi sử dụng mảng rỗng được tạo bởi "Array()" làm giá trị trả về trong các hàm? Có cách nào tốt hơn (an toàn hơn) để khai báo mảng có kích thước bằng không không? (Tôi thấy cách giải quyết của bạn bằng cách sử dụng đối tượng từ điển).
Câu trả lời của tôi cho câu hỏi của bạn là không, không và không.
Tôi cũng sử dụng mảng rỗng, trong một số trường hợp là rất nhiều. Và tôi chắc chắn rằng các lập trình viên khác cũng vậy.
Điều thú vị là nếu bạn tạo một mảng rỗng ngay bây giờ, bạn có thể thay đổi kích thước của nó mà không gặp lỗi:
MyVariant = Array()
ReDim Preserve MyVariant(0 to UBound(MyVariant)+1)
Và đó là cách làm thông thường của hầu hết các lập trình viên.
Nhưng tôi cũng có một số đoạn mã trả về mảng rỗng từ một hàm hoặc lưu trữ nó vào một tập hợp hoặc từ điển. Vì vậy, tôi rất vui vì vấn đề này đã được khắc phục nhanh chóng.
Nhân tiện, việc một Dictionary trả về mảng rỗng chính xác cho thấy lỗi nằm ở đâu đó trong bản cập nhật Office, vì đối tượng đó nằm trong tệp scrrun.dll bên ngoài.
Andreas.
> > > > > > > > >
Comments
Post a Comment