Lỗi runtime error 9 subscript out of range trong Form tìm kiếm

Liên hệ QC

AnhThu-1976

Thành viên tích cực
Tham gia
17/10/14
Bài viết
1,019
Được thích
163
Hiện em đang bị lỗi như sau
Tại Sheet TH, phần màu vàng, Bấm tổ hợp Ctrl+Shift +I để hiện Form
Nếu trong phần tìm kiếm mà nhập:
11 thì Form tìm bình thường
a thì Form tìm bình thường
1 thì Form thì bị lỗi như trên
Em đã tìm nhưng vẫn không tìm ra tại sao lỗi, nhờ các anh chị giúp đỡ, em cảm ơn!
 

File đính kèm

  • KT.xlsm
    123 KB · Đọc: 13
Hiện em đang bị lỗi như sau
Tại Sheet TH, phần màu vàng, Bấm tổ hợp Ctrl+Shift +I để hiện Form
Nếu trong phần tìm kiếm mà nhập:
11 thì Form tìm bình thường
a thì Form tìm bình thường
1 thì Form thì bị lỗi như trên
Em đã tìm nhưng vẫn không tìm ra tại sao lỗi, nhờ các anh chị giúp đỡ, em cảm ơn!
Sửa chổ.
Mã:
ReDim arrKQ(1 To EndR, 1 To 3)
thành
Mã:
ReDim arrKQ(1 To EndR*2, 1 To 3)
 
Upvote 0
Hiện em đang bị lỗi như sau
Tại Sheet TH, phần màu vàng, Bấm tổ hợp Ctrl+Shift +I để hiện Form
Nếu trong phần tìm kiếm mà nhập:
11 thì Form tìm bình thường
a thì Form tìm bình thường
1 thì Form thì bị lỗi như trên
Em đã tìm nhưng vẫn không tìm ra tại sao lỗi, nhờ các anh chị giúp đỡ, em cảm ơn!
Sửa thành ReDim arrKQ(1 To EndR*2, 1 To 3) cũng sẽ có lúc sai.

Hiện EndR = 45. Nếu sửa như trên thì mảng arrKQ có 90 dòng. Mảng Arr có 36 dòng. Nếu 36 dòng ở cột 1, 2 và 3 của mảng Arr đều thỏa điều kiện thì s sẽ được tăng cho tới khi s = 91 (s bình thường có thể tăng tới s = 3*36 = 108) thì sảy ra lỗi do arrKQ chỉ có 90 dòng

Thậm chí nếu không có lỗi thì dữ liệu sẽ bị lặp lại rất nhiều trong ListBox. Giả sử ta tìm 1. Nếu ở dòng nào đó cả 3 cột đều chứa "1" thì dòng đó sẽ được lặp lại 3 lần trong mảng arrKQ và trong ListBox.
---------------
Mã:
If InStr(UCase(Arr(I, 1)), UCase(MaHHTim)) Then
    s = s + 1
    For K = 1 To 3
        arrKQ(s, K) = Arr(I, K)
    Next K
End If

If InStr(UCase(Arr(I, 2)), UCase(MaHHTim)) Then
    s = s + 1
    For K = 1 To 3
        arrKQ(s, K) = Arr(I, K)
    Next K
End If

If InStr(UCase(Arr(I, 3)), UCase(MaHHTim)) Then
    s = s + 1
    For K = 1 To 3
        arrKQ(s, K) = Arr(I, K)
    Next K
End If
s được tăng sau mỗi lần tìm thấy MaHHTim = "1" trong mỗi dòng dữ liệu hiện hành.
Cột 1, 2 và 3 của mảng Arr (tương ứng với cột H, I i J trên sheet) có lần lượt 10, 21 và 25 dòng thỏa điều kiện có chứa "1". Vậy thì bình thường s sẽ được tăng cho tới khi s = 10 + 21 + 25 = 56. Nhưng do
Mã:
ReDim arrKQ(1 To EndR, 1 To 3)

mà EndR = 45, nên mảng arrKQ chỉ có 45 dòng. Vậy khi s được tăng tới s = 46 thì dòng
Mã:
arrKQ(s, K) = Arr(I, K)
sẽ có lỗi (code định ghi dữ liệu vào dòng 46 trong mảng chỉ có 45 dòng). Lỗi này nằm ở IF ... END IF nào thì còn tùy vào số dòng có chứa "1" trong mỗi cột H, I và J. Với dữ liệu hiện hành thì lỗi nằm ở trong

Mã:
If InStr(UCase(Arr(I, 2)), UCase(MaHHTim)) Then
...
End If

Sửa:

1. Nếu thực hiện IF1 (đk thỏa) thì bỏ không thực hiện IF2 và IF3. Nếu IF2 thỏa thì bỏ IF3. Tức trong mỗi vòng lặp chỉ thực hiện code trong 1 IF (code giữa IF và END IF).
Tuy nhiên nếu chỉ có 1 kết quả thì ListBox vẫn có EndR dòng. Mà EndR có thể là hàng nghìn. Lúc đó chỉ có 1 dòng kết quả và hàng nghìn dòng trống (thừa)

2. Ta duyệt mảng Arr và ghi chỉ số dòng của mỗi dòng thỏa vào mảng chiso. Sau khi duyệt mảng Arr thì nếu mảng chiso có dữ liệu (có các chỉ số) thì copy các dòng ứng với chỉ số vào mảng arrKQ rồi nhập vào ListBox.

Lưu ý: Không UCase(MaHHTim) trong vòng lặp!

Mã:
Private Sub CB_Tim_Click()
Dim EndR As Long, r As Long, c As Long, count As Long
Dim Arr(), arrKQ(), chiso() As Long
Dim MaHHTim As String, timthay As Boolean
    MHList.Clear
  
    With Sheets("Note1")    ' doi Note1
        EndR = .Cells(65000, 8).End(xlUp).Row    '''' doi 4 thanh 8
        Arr = .Range(.Cells(10, 8), .Cells(EndR, 10)).Value    ' doi dong 12 thanh dong 10 & cot 1(A) thanh cot 8 (H)'''' doi 4 thanh 10
    End With
  
    count = 0
    MaHHTim = UCase(Me.NhomHang.Value)
    For r = 1 To UBound(Arr)
        timthay = InStr(UCase(Arr(r, 1)), MaHHTim) > 0
        If Not timthay Then
            timthay = InStr(UCase(Arr(r, 2)), MaHHTim) > 0
            If Not timthay Then timthay = InStr(UCase(Arr(r, 3)), MaHHTim) > 0
        End If
        If timthay Then
            count = count + 1
            ReDim Preserve chiso(1 To count)
            chiso(count) = r
        End If
    Next r
    If count Then
        ReDim arrKQ(1 To count, 1 To 3)
        For r = 1 To count            
            c = chiso(r)
            arrKQ(r, 1) = Arr(c, 1)
            arrKQ(r, 2) = Arr(c, 2)
            arrKQ(r, 3) = Arr(c, 3)
        Next r
        MHList.List = arrKQ
    Else
        MsgBox "No noi dung"
        Me.NhomHang.SetFocus
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom