- Option Explicit
- Private Type dtTest
- A As Long
- B As Long
- End Type
- Private aryTest() As dtTest
- Private Sub Form_Initialize()
- Const c& = 10
- ReDim aryTest(c) As dtTest
- Dim i& For i = 0 To 10
- With aryTest(i)
- .A = i
- .B = -i
- End With
- Next
- Call ShowTestInfo
- End Sub
- Private Sub Form_Terminate()
- Erase aryTest()
- End Sub
- Private Sub ShowTestInfo()
- Dim c& c = UBound(aryTest)
- Label1 = CStr(c)
- Label2 = CStr(aryTest(c).A)
- Label3 = CStr(aryTest(c).B)
- End Sub
- Private Sub TestAryVsWithStm(aT() As dtTest)
- On Error GoTo lE
- Dim c& c = UBound(aT)
- c = c + 1
- ReDim Preserve aT(c) As dtTest
- aT(c).A = c
- aT(c).B = -c
- Exit Sub
- lE Call MsgBox("Error " & Err.Description & vbCrLf & "Error Number " & Err.Number, vbCritical) Call Err.Clear
- End Sub
- Private Sub Command1_Click()
- Dim c& c = c = UBound(aryTest)
- If (aryTest(c).A = c And aryTest(c).B = -c) Then
- Call TestAryVsWithStm(aryTest())
- Call ShowTestInfo
- End If
- End Sub
- Private Sub Command2_Click()
- Dim c& c = c = UBound(aryTest)
- With aryTest(c)
- If (.A = c And .B = -c) Then
- Call TestAryVsWithStm(aryTest())
- Call ShowTestInfo
- End If
- End With
- End Sub
Với đoạn code ở trên (có đính kèm project mẫu ở dưới), mình test lỗi bằng cách cho Redim mảng động aryTest() được truyền như là một đối số cho thủ tục TestAryVsWithStm.
Về mặt lý thuyết, code ở thủ tục Command1_Click và Command2_Click là như nhau. Chỉ là ở Command2_Click có sử dụng statement: "With ... End With" để đơn giản hóa code. (https://docs.microsoft.com/en-us/dotnet ... -statement)
Khi gọi thủ tục Command1_Click thì code hoạt động bình thường.
Nhưng khi gọi thủ tục Command2_Click thì sẽ nhận được 1 lỗi: This array is fixed or temporarily locked.
Mình có google về lỗi này nhưng hầu như toàn nêu lý do tương tự như bài viết của msdn, hoặc có thể mình tìm chưa kĩ: https://msdn.microsoft.com/en-us/librar ... s.60).aspx
Cái lỗi này khiến mình bị ăn hành suốt 2 hôm trời, thậm chí mình có thử dùng API "__vbaAryUnlock" trong "msvbvm60.dll" nhưng vẫn không khắc phục được.
Mò mẫm đến giờ mới té ngữa ra là do sử dụng statement: "With ... End With".

Nay mạn phép viết bài này chia sẻ với mong muốn có thể giúp được phần nào cho những ai gặp trường hợp giống mình. Nếu bài viết có gì sai sót thì rất mong mọi người có thể góp ý để hoàn thiện.
Thanks!