Giúp mình sửa code search trên listbox bị lỗi (2 người xem)

  • Thread starter Thread starter ditimdl
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

ditimdl

Thành viên thường trực
Tham gia
11/10/06
Bài viết
378
Được thích
107
Giới tính
Nam
Nghề nghiệp
Pharmacist
Gửi Anh (Chị) và các bạn!

Mình có làm 1 form chứ listbox để tìm kiếm nhưng khi nhập ký tự cần tìm kiếm vào textbox thì nó báo lỗi.
Mong các bạn xem và giúp đỡ!
 

File đính kèm

Gửi Anh (Chị) và các bạn!

Mình có làm 1 form chứ listbox để tìm kiếm nhưng khi nhập ký tự cần tìm kiếm vào textbox thì nó báo lỗi.
Mong các bạn xem và giúp đỡ!

Bạn không khai báo biến pub_ArrDanhMuc. Cũng không khai báo biến FltCol

Nhưng code của bạn ngoài thiếu khai báo biến thì vẫn có vấn đề. Ta mổ sẻ nhé.

Mã:
Private Sub UserForm_Initialize()
    With Application
        .WindowState = xlMaximized
        'Zoom = Int(.Width / Me.Width * 100)
        Width = .Width
        Height = .Height
    End With
    'Load data
   [COLOR=#ff0000] If Not IsArray(pub_ArrDanhMuc) Then[/COLOR]
        pub_ArrDanhMuc = Sheet3.Range("A5:C" & Sheet3.Range("C65536").End(xlUp).Row)
        pub_Ubd = UBound(pub_ArrDanhMuc)
    [COLOR=#ff0000]End If[/COLOR]
    ListData.List =[COLOR=#ff0000] pub_ArrDanhMuc[/COLOR]
    'OpHS = True
End Sub

Chỗ đỏ đỏ là sao? Bạn khai báo vd. ở Module1: Public pub_ArrDanhMuc???
Tức mở Form lần thứ 2 thì không load dữ liệu từ sheet vào mảng nữa? Thế nếu trong thời gian giữa 2 lần mở Form mà dữ liệu thay đổi rồi thì sao? Hay dữ liệu luôn bất di bất dịch?

Ngoài ra khi textbox rỗng - khi chọn OptionButton hoặc nhập sai từ nên xóa hết nhập lại - thì code vẫn "cần cù" lọc. Như thế là tốn điện nước. Trong trường hợp ấy thì ta nhập vào ListBox mảng dữ liệu ban đầu thôi.

Tóm lại code đoại loại là

Mã:
Private Arr(), FltCol As Long

Private Sub UserForm_Initialize()
    With Application
        .WindowState = xlMaximized
        'Zoom = Int(.Width / Me.Width * 100)
        Width = .Width
        Height = .Height
    End With
    'Load data
    Arr = Sheet3.Range("A5:C" & Sheet3.Range("C65536").End(xlUp).Row).Value
    ListData.List = Arr
    OpHS.Value = True
End Sub

Private Sub OpHS_Click()
    If OpHS.Value Then
        FltCol = 3
        tbxTuKhoa = Null
        'tbxTuKhoa.SetFocus
    End If
End Sub

Private Sub OpID_Click()
    If OpID.Value Then
        FltCol = 2
        tbxTuKhoa = Null
        'tbxTuKhoa.SetFocus
    End If
End Sub

'Code chính:
Private Sub tbxTuKhoa_Change()
    Dim GetRows()
    Dim strType As String
    Dim n As Long, r As Long
    
    If tbxTuKhoa.Text = "" Then
        ListData.List = Arr
    Else
'        strType = "*" & UCase(tbxTuKhoa) & "*"  ''<-- Neu muon loc bat ky
        strType = UCase(tbxTuKhoa.Text) & "*"
        ReDim GetRows(1 To UBound(Arr))
        For r = 1 To UBound(Arr)
            If UCase(Arr(r, FltCol)) Like strType Then
                n = n + 1
                GetRows(n) = r
            End If
        Next
        
        If n Then
            Dim ArrFilter(), c As Byte
            ReDim ArrFilter(1 To n, 1 To 3)
            For r = 1 To n
                For c = 1 To 3
                    ArrFilter(r, c) = Arr(GetRows(r), c)
                Next
            Next
            ListData.List = ArrFilter
        Else
            ListData.Clear
        End If
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Thầy rất nhiều! Đúng là thiếu phần khai báo biến, phần code em lấy của anh Hoàng Trọng Nghĩa chứ em đâu đủ sức mà mổ xẻ nó ra.
Dữ liệu em load ra để sửa và nạp lại chứ đâu có bất di bất dịch, sau mỗi lần sửa em unload và show form lại nên dữ liệu vẫn nạp mới.
 
Upvote 0

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

Back
Top Bottom