không lọc được dữ liệu trong listbox gồm rất nhiều dòng

  • Thread starter Thread starter hic1802
  • Ngày gửi Ngày gửi
Liên hệ QC

hic1802

Thành viên tiêu biểu
Tham gia
16/2/13
Bài viết
545
Được thích
34
Giới tính
Nam
Chào mọi người trên GPE,
Tôi có chỉnh sửa 1 code sưu tầm trên diễn đàn mình áp dụng cho công việc của mình đó là tạo useform trong đó có listbox chứa dữ liệu, có 1 ô textbox dùng để lọc dữ liệu trên listbox theo ký tự nhập vào textbox
Tuy nhiên có thể do dòng dữ liệu trên textbox quá lớn hay sao mà chạy lệnh toàn báo lỗi (gần 10000 dòng)
Nhờ mọi người giúp xem phải xử lý như nào để giải quyết vấn đề này
code:
Mã:
strsearch = LCase(t1.Text)
Dim lr As Long
lr = Sheets("BC_ngay").Range("B" & Rows.Count).End(xlUp).Row
If lr - 3 <= 99999999 Then
    Dim rw As Range, R As Range
    Set R = Sheets("BC_ngay").Range("A5:AF" & lr)
    With l1
        .Clear ' Lam moi Listbox
        For Each rw In R.Rows
            ' Do tim theo Ma hang, ten hang, don vi tinh
            If InStr(LCase(Sheets("BC_ngay").Cells(rw.Row, 1) & Sheets("BC_ngay").Cells(rw.Row, 2) & Sheets("BC_ngay").Cells(rw.Row, 3) & Sheets("BC_ngay").Cells(rw.Row, 4) & Sheets("BC_ngay").Cells(rw.Row, 5) & Sheets("BC_ngay").Cells(rw.Row, 6) & Sheets("BC_ngay").Cells(rw.Row, 7) & Sheets("BC_ngay").Cells(rw.Row, 8) & Sheets("BC_ngay").Cells(rw.Row, 9) & Sheets("BC_ngay").Cells(rw.Row, 11) & Sheets("BC_ngay").Cells(rw.Row, 12)), strsearch) Then
                ' Neu chuoi can tim co trong chuoi Ma hang nôi voi Ten hang nôi voi Don vi tinh thi add vao Listbox
                .AddItem Sheets("BC_ngay").Cells(rw.Row, 1).Value
                .List(l1.ListCount - 1, 0) = Sheets("BC_ngay").Cells(rw.Row, 1).Value
                .List(l1.ListCount - 1, 1) = Sheets("BC_ngay").Cells(rw.Row, 2).Value
                .List(l1.ListCount - 1, 2) = Sheets("BC_ngay").Cells(rw.Row, 3).Value
                .List(l1.ListCount - 1, 3) = Sheets("BC_ngay").Cells(rw.Row, 4).Value
                .List(l1.ListCount - 1, 4) = Sheets("BC_ngay").Cells(rw.Row, 5).Value
                .List(l1.ListCount - 1, 5) = Sheets("BC_ngay").Cells(rw.Row, 6).Value
                .List(l1.ListCount - 1, 6) = Sheets("BC_ngay").Cells(rw.Row, 7).Value
                .List(l1.ListCount - 1, 7) = Sheets("BC_ngay").Cells(rw.Row, 8).Value
                .List(l1.ListCount - 1, 8) = Sheets("BC_ngay").Cells(rw.Row, 9).Value
                .List(l1.ListCount - 1, 9) = Sheets("BC_ngay").Cells(rw.Row, 10).Value
                .List(l1.ListCount - 1, 10) = Sheets("BC_ngay").Cells(rw.Row, 11).Value
                .List(l1.ListCount - 1, 11) = Sheets("BC_ngay").Cells(rw.Row, 12).Value
                .List(l1.ListCount - 1, 12) = Sheets("BC_ngay").Cells(rw.Row, 13).Value
                .List(l1.ListCount - 1, 13) = Sheets("BC_ngay").Cells(rw.Row, 14).Value
                .List(l1.ListCount - 1, 14) = Sheets("BC_ngay").Cells(rw.Row, 15).Value
                .List(l1.ListCount - 1, 15) = Sheets("BC_ngay").Cells(rw.Row, 16).Value
                .List(l1.ListCount - 1, 16) = Sheets("BC_ngay").Cells(rw.Row, 17).Value
                .List(l1.ListCount - 1, 17) = Sheets("BC_ngay").Cells(rw.Row, 18).Value
                .List(l1.ListCount - 1, 18) = Sheets("BC_ngay").Cells(rw.Row, 19).Value
                .List(l1.ListCount - 1, 19) = Sheets("BC_ngay").Cells(rw.Row, 20).Value
                .List(l1.ListCount - 1, 20) = Sheets("BC_ngay").Cells(rw.Row, 21).Value
                .List(l1.ListCount - 1, 21) = Sheets("BC_ngay").Cells(rw.Row, 22).Value
                .List(l1.ListCount - 1, 22) = Sheets("BC_ngay").Cells(rw.Row, 23).Value
                .List(l1.ListCount - 1, 23) = Sheets("BC_ngay").Cells(rw.Row, 24).Value
                .List(l1.ListCount - 1, 24) = Sheets("BC_ngay").Cells(rw.Row, 25).Value
                .List(l1.ListCount - 1, 25) = Sheets("BC_ngay").Cells(rw.Row, 26).Value
                .List(l1.ListCount - 1, 26) = Sheets("BC_ngay").Cells(rw.Row, 27).Value
                .List(l1.ListCount - 1, 27) = Sheets("BC_ngay").Cells(rw.Row, 28).Value
                .List(l1.ListCount - 1, 28) = Sheets("BC_ngay").Cells(rw.Row, 29).Value
                .List(l1.ListCount - 1, 29) = Sheets("BC_ngay").Cells(rw.Row, 30).Value
                .List(l1.ListCount - 1, 30) = Sheets("BC_ngay").Cells(rw.Row, 31).Value
                .List(l1.ListCount - 1, 31) = Sheets("BC_ngay").Cells(rw.Row, 32).Value
                
            End If
        Next rw
    End With
End If
mọi người xem ở userform fchinhsua , textbox t1 và listbox l1 ở file excel đính kèm
Tiện thể sau khi sửa nhờ mọi người giúp đỡ viết code cho nút Sửa ở userform fchinhsua
Mục đích của nút Sửa là : khi ta chọn 1 list trong listbox l1 thì các ô textbox t2-t19 sẽ hiển thị nội dung dòng list tại listbox l1, sau đó ta thay đổi các ô textbox này ấn Sửa --> sẽ nhập lại dữ liệu các ô textbox trong userform vào đúng vị trí đã chọn trên bảng excel sheets "BC_ngay"
 

File đính kèm

Chào mọi người trên GPE,
Tôi có chỉnh sửa 1 code sưu tầm trên diễn đàn mình áp dụng cho công việc của mình đó là tạo useform trong đó có listbox chứa dữ liệu, có 1 ô textbox dùng để lọc dữ liệu trên listbox theo ký tự nhập vào textbox
Tuy nhiên có thể do dòng dữ liệu trên textbox quá lớn hay sao mà chạy lệnh toàn báo lỗi (gần 10000 dòng)
Nhờ mọi người giúp xem phải xử lý như nào để giải quyết vấn đề này
code:
Mã:
strsearch = LCase(t1.Text)
Dim lr As Long
lr = Sheets("BC_ngay").Range("B" & Rows.Count).End(xlUp).Row
If lr - 3 <= 99999999 Then
    Dim rw As Range, R As Range
    Set R = Sheets("BC_ngay").Range("A5:AF" & lr)
    With l1
        .Clear ' Lam moi Listbox
        For Each rw In R.Rows
            ' Do tim theo Ma hang, ten hang, don vi tinh
            If InStr(LCase(Sheets("BC_ngay").Cells(rw.Row, 1) & Sheets("BC_ngay").Cells(rw.Row, 2) & Sheets("BC_ngay").Cells(rw.Row, 3) & Sheets("BC_ngay").Cells(rw.Row, 4) & Sheets("BC_ngay").Cells(rw.Row, 5) & Sheets("BC_ngay").Cells(rw.Row, 6) & Sheets("BC_ngay").Cells(rw.Row, 7) & Sheets("BC_ngay").Cells(rw.Row, 8) & Sheets("BC_ngay").Cells(rw.Row, 9) & Sheets("BC_ngay").Cells(rw.Row, 11) & Sheets("BC_ngay").Cells(rw.Row, 12)), strsearch) Then
                ' Neu chuoi can tim co trong chuoi Ma hang nôi voi Ten hang nôi voi Don vi tinh thi add vao Listbox
                .AddItem Sheets("BC_ngay").Cells(rw.Row, 1).Value
                .List(l1.ListCount - 1, 0) = Sheets("BC_ngay").Cells(rw.Row, 1).Value
                .List(l1.ListCount - 1, 1) = Sheets("BC_ngay").Cells(rw.Row, 2).Value
                .List(l1.ListCount - 1, 2) = Sheets("BC_ngay").Cells(rw.Row, 3).Value
                .List(l1.ListCount - 1, 3) = Sheets("BC_ngay").Cells(rw.Row, 4).Value
                .List(l1.ListCount - 1, 4) = Sheets("BC_ngay").Cells(rw.Row, 5).Value
                .List(l1.ListCount - 1, 5) = Sheets("BC_ngay").Cells(rw.Row, 6).Value
                .List(l1.ListCount - 1, 6) = Sheets("BC_ngay").Cells(rw.Row, 7).Value
                .List(l1.ListCount - 1, 7) = Sheets("BC_ngay").Cells(rw.Row, 8).Value
                .List(l1.ListCount - 1, 8) = Sheets("BC_ngay").Cells(rw.Row, 9).Value
                .List(l1.ListCount - 1, 9) = Sheets("BC_ngay").Cells(rw.Row, 10).Value
                .List(l1.ListCount - 1, 10) = Sheets("BC_ngay").Cells(rw.Row, 11).Value
                .List(l1.ListCount - 1, 11) = Sheets("BC_ngay").Cells(rw.Row, 12).Value
                .List(l1.ListCount - 1, 12) = Sheets("BC_ngay").Cells(rw.Row, 13).Value
                .List(l1.ListCount - 1, 13) = Sheets("BC_ngay").Cells(rw.Row, 14).Value
                .List(l1.ListCount - 1, 14) = Sheets("BC_ngay").Cells(rw.Row, 15).Value
                .List(l1.ListCount - 1, 15) = Sheets("BC_ngay").Cells(rw.Row, 16).Value
                .List(l1.ListCount - 1, 16) = Sheets("BC_ngay").Cells(rw.Row, 17).Value
                .List(l1.ListCount - 1, 17) = Sheets("BC_ngay").Cells(rw.Row, 18).Value
                .List(l1.ListCount - 1, 18) = Sheets("BC_ngay").Cells(rw.Row, 19).Value
                .List(l1.ListCount - 1, 19) = Sheets("BC_ngay").Cells(rw.Row, 20).Value
                .List(l1.ListCount - 1, 20) = Sheets("BC_ngay").Cells(rw.Row, 21).Value
                .List(l1.ListCount - 1, 21) = Sheets("BC_ngay").Cells(rw.Row, 22).Value
                .List(l1.ListCount - 1, 22) = Sheets("BC_ngay").Cells(rw.Row, 23).Value
                .List(l1.ListCount - 1, 23) = Sheets("BC_ngay").Cells(rw.Row, 24).Value
                .List(l1.ListCount - 1, 24) = Sheets("BC_ngay").Cells(rw.Row, 25).Value
                .List(l1.ListCount - 1, 25) = Sheets("BC_ngay").Cells(rw.Row, 26).Value
                .List(l1.ListCount - 1, 26) = Sheets("BC_ngay").Cells(rw.Row, 27).Value
                .List(l1.ListCount - 1, 27) = Sheets("BC_ngay").Cells(rw.Row, 28).Value
                .List(l1.ListCount - 1, 28) = Sheets("BC_ngay").Cells(rw.Row, 29).Value
                .List(l1.ListCount - 1, 29) = Sheets("BC_ngay").Cells(rw.Row, 30).Value
                .List(l1.ListCount - 1, 30) = Sheets("BC_ngay").Cells(rw.Row, 31).Value
                .List(l1.ListCount - 1, 31) = Sheets("BC_ngay").Cells(rw.Row, 32).Value
               
            End If
        Next rw
    End With
End If
mọi người xem ở userform fchinhsua , textbox t1 và listbox l1 ở file excel đính kèm
Tiện thể sau khi sửa nhờ mọi người giúp đỡ viết code cho nút Sửa ở userform fchinhsua
Mục đích của nút Sửa là : khi ta chọn 1 list trong listbox l1 thì các ô textbox t2-t19 sẽ hiển thị nội dung dòng list tại listbox l1, sau đó ta thay đổi các ô textbox này ấn Sửa --> sẽ nhập lại dữ liệu các ô textbox trong userform vào đúng vị trí đã chọn trên bảng excel sheets "BC_ngay"
Chỉ chỉnh code tạo list, còn code sửa nhờ bạn khác
Mã:
Dim sArr(), tArr(), eR As Long, sRow As Long, sCol As Long

Private Sub t1_Change()
  Dim Arr(), Res(), txt As String
  Dim i As Long, k As Long, ik As Long, n As Long, j As Long

  eRow = Range("B" & Rows.Count).End(xlUp).Row
  If eRow <> eR Then
    eR = eRow
    Call CreateArr
  End If
    
  txt = LCase(t1.Text)
  If Len(txt) = 0 Then
    l1.List = sArr
  Else
    k = 0
    ReDim Arr(1 To sRow)
    For i = 1 To sRow
      If InStr(1, tArr(i), txt) Then
        k = k + 1
        Arr(k) = i
      End If
    Next i
    If k = 0 Then
      l1.Clear
    Else
      ReDim Res(1 To k, 1 To sCol)
      For i = 1 To k
        ik = Arr(i)
        For j = 1 To sCol
          Res(i, j) = sArr(ik, j)
        Next j
      Next i
      l1.List = Res
    End If
  End If
End Sub

Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A6:AF" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To 12)
  For i = 1 To sRow
    For j = 1 To 12
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) = LCase(Join(Arr, ","))
  Next i
End Sub

Private Sub UserForm_Initialize()
Dim lr As Long, lr1 As Long, lr2 As Long
lr = Sheets("BC_ngay").Range("B" & Rows.Count).End(xlUp).Row
l1.List = Sheets("BC_ngay").Range("A5:AF" & lr).Value
End Sub
Private Sub c2_Click()
    Unload Me
End Sub

Private Sub l1_Click()
    
End Sub
 
Tiện thể sau khi sửa nhờ mọi người giúp đỡ viết code cho nút Sửa ở userform fchinhsua
Mục đích của nút là : (A) khi ta chọn 1 list trong listbox l1 thì các ô textbox t2-t19 sẽ hiển thị nội dung dòng list tại listbox l1,
(B) sau đó ta thay đổi các ô textbox này (C) ấn Sửa --> (D)sẽ nhập lại dữ liệu các ô textbox trong userform vào đúng vị trí đã chọn trên bảng excel sheets "BC_ngay"
Để thực hiện việc A ta cần khai báo biến dùng chung kiểu Long hay Integer gì đó & lưu vô biến này dòng ta đã dùng chuột bấm chọn trên ListBox
Ví dụ:
Dim lbID As Long ' Khai báo biến dùng chung (trong toàn bộ Form 'fChinhSua')
& viết 1 macro có nội dung sau để nắm bắt sự kiện ấn chuột lên ListBox của bạn
PHP:
Private Sub l1_Click()
lbID = 1 + Me!l1.ListIndex:          MsgBox lbID
End Sub
Để thực hiện được việc D, máy (hay VBE) cần nhận biết ngay dòng đã chọn trên ListBox là dòng nào trên CSDL
Muốn vậy cách theo mình duy nhất là nên đánh dấu các dòng dữ liệu để phân biệt

Với DL của bạn theo mình nên đánh dấu phân biệt theo ngày
Ví dụ ngày 9/05/2019 bạn có 80 lần nhập hàng ta xài mã sau để ghi nhận từng dòng dữ liệu:
Từ Ị5900 cho đến I5979; Ở đây I chỉ là năm 2019, năm sau sẽ là 'J', con số 9 chỉ ngày, ngày 10 sẽ là 'A', . . . .
Như vậy mã IAA12 sẽ là dòng dữ liệu thuộc ngày 10 tháng 10 của năm 2019 & là sản phẩm thứ 13 trong ngày
Mình tin chắc rằng với trình độ của bạn bạn sẽ viết được hàm mã hóa đơn vị ngày-tháng-năm này thành công.
Bạn có thể tham khảo cách làm của mình trong file (Pages 'Nhap' thôi nha)

Việc B bạn không cần được giúp, phải vậy không?
Việc C Xem & tham khảo trên file đính kèm, nếu cần

Rất vui nếu được tiếp tục trao đổi cùng bạn!
 

File đính kèm

Chỉ chỉnh code tạo list, còn code sửa nhờ bạn khác
Mã:
Dim sArr(), tArr(), eR As Long, sRow As Long, sCol As Long

Private Sub t1_Change()
  Dim Arr(), Res(), txt As String
  Dim i As Long, k As Long, ik As Long, n As Long, j As Long

  eRow = Range("B" & Rows.Count).End(xlUp).Row
  If eRow <> eR Then
    eR = eRow
    Call CreateArr
  End If
   
  txt = LCase(t1.Text)
  If Len(txt) = 0 Then
    l1.List = sArr
  Else
    k = 0
    ReDim Arr(1 To sRow)
    For i = 1 To sRow
      If InStr(1, tArr(i), txt) Then
        k = k + 1
        Arr(k) = i
      End If
    Next i
    If k = 0 Then
      l1.Clear
    Else
      ReDim Res(1 To k, 1 To sCol)
      For i = 1 To k
        ik = Arr(i)
        For j = 1 To sCol
          Res(i, j) = sArr(ik, j)
        Next j
      Next i
      l1.List = Res
    End If
  End If
End Sub

Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A6:AF" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To 12)
  For i = 1 To sRow
    For j = 1 To 12
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) = LCase(Join(Arr, ","))
  Next i
End Sub

Private Sub UserForm_Initialize()
Dim lr As Long, lr1 As Long, lr2 As Long
lr = Sheets("BC_ngay").Range("B" & Rows.Count).End(xlUp).Row
l1.List = Sheets("BC_ngay").Range("A5:AF" & lr).Value
End Sub
Private Sub c2_Click()
    Unload Me
End Sub

Private Sub l1_Click()
   
End Sub
cảm ơn bác, cho em hỏi em muốn tạo 2 textbox tìm kiếm được không?
Dạng 2 lần lọc ở 2 cột khác nhau trong excel ấy : thí dụ mình lọc cột A, sau đó lọc tiếp cột B để ra listbox hiển thị kết quả ngắn hơn và sát nhất.
 
Để thực hiện việc A ta cần khai báo biến dùng chung kiểu Long hay Integer gì đó & lưu vô biến này dòng ta đã dùng chuột bấm chọn trên ListBox
Ví dụ:
Dim lbID As Long ' Khai báo biến dùng chung (trong toàn bộ Form 'fChinhSua')
& viết 1 macro có nội dung sau để nắm bắt sự kiện ấn chuột lên ListBox của bạn
PHP:
Private Sub l1_Click()
lbID = 1 + Me!l1.ListIndex:          MsgBox lbID
End Sub
Để thực hiện được việc D, máy (hay VBE) cần nhận biết ngay dòng đã chọn trên ListBox là dòng nào trên CSDL
Muốn vậy cách theo mình duy nhất là nên đánh dấu các dòng dữ liệu để phân biệt

Với DL của bạn theo mình nên đánh dấu phân biệt theo ngày
Ví dụ ngày 9/05/2019 bạn có 80 lần nhập hàng ta xài mã sau để ghi nhận từng dòng dữ liệu:
Từ Ị5900 cho đến I5979; Ở đây I chỉ là năm 2019, năm sau sẽ là 'J', con số 9 chỉ ngày, ngày 10 sẽ là 'A', . . . .
Như vậy mã IAA12 sẽ là dòng dữ liệu thuộc ngày 10 tháng 10 của năm 2019 & là sản phẩm thứ 13 trong ngày
Mình tin chắc rằng với trình độ của bạn bạn sẽ viết được hàm mã hóa đơn vị ngày-tháng-năm này thành công.
Bạn có thể tham khảo cách làm của mình trong file (Pages 'Nhap' thôi nha)

Việc B bạn không cần được giúp, phải vậy không?
Việc C Xem & tham khảo trên file đính kèm, nếu cần

Rất vui nếu được tiếp tục trao đổi cùng bạn!
cảm ơn bác, A và B em làm được rồi có cái D là chưa làm được, do em chưa biết cách dựa vào cái j để so sánh để đến dòng đó là nó ghi. Chắc phải thêm 1 cột (dạng STT) để bám vào.
Theo ngu kiến của em là thế. :v
Với lại file bác gửi em nghịch thử toàn báo lỗi
 
Lần chỉnh sửa cuối:
cảm ơn bác, cho em hỏi em muốn tạo 2 textbox tìm kiếm được không?
Dạng 2 lần lọc ở 2 cột khác nhau trong excel ấy : thí dụ mình lọc cột A, sau đó lọc tiếp cột B để ra listbox hiển thị kết quả ngắn hơn và sát nhất.
Chỉnh lại code
Mã:
Dim sArr(), tArr(), eR As Long, sRow As Long, sCol As Long

Private Sub t1_Change()
  Dim Arr(), Res(), S, txt As String
  Dim i As Long, k As Long, ik As Long, n As Long, j As Long

  eRow = Range("B" & Rows.Count).End(xlUp).Row
  If eRow <> eR Then
    eR = eRow
    Call CreateArr
  End If
   
  txt = LCase(t1.Text)
  If Len(txt) = 0 Then
    l1.List = sArr
  Else
    k = 0
    S = Split(txt, "&")
    ReDim Arr(1 To sRow)
    For i = 1 To sRow
      For j = 0 To UBound(S)
        If InStr(1, tArr(i), S(j)) = 0 Then GoTo Thoat
      Next j
      k = k + 1
      Arr(k) = i
Thoat:
    Next i
    If k = 0 Then
      l1.Clear
    Else
      ReDim Res(1 To k, 1 To sCol)
      For i = 1 To k
        ik = Arr(i)
        For j = 1 To sCol
          Res(i, j) = sArr(ik, j)
        Next j
      Next i
      l1.List = Res
    End If
  End If
End Sub

Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A6:AF" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To 12)
  For i = 1 To sRow
    For j = 1 To 12
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) =  "," & LCase(Join(Arr, ",")) & ","
  Next i
End Sub
Qui tắc nhập vào text box để tìm dữ liệu
"xx" tìm tất cả các cột có ký tự "xx" ở vị trí bất kỳ
",xx" tìm tất cả các cột có ký tự "xx" ở vị trí Đầu
"xx," tìm tất cả các cột có ký tự "xx" ở vị trí Cuối
"xx&yy" tìm tất cả các cột có ký tự "xx" ở vị trí bất kỳ và phải có cột có ký tự "yy" ở vị trí bất kỳ
Ký tự "," chỉ đầu hoặc cuối chuổi
Ký tự "&" phải thỏa đồng thời các điều kiện
Ví dụ nhập thử: "mơ&a2,&,5,"

Bạn viết code gán giá trị vào các text box khi chọn Listbox, mình sẽ viết thêm nút "Sửa"
 

File đính kèm

Chỉnh lại code
Mã:
Dim sArr(), tArr(), eR As Long, sRow As Long, sCol As Long

Private Sub t1_Change()
  Dim Arr(), Res(), S, txt As String
  Dim i As Long, k As Long, ik As Long, n As Long, j As Long

  eRow = Range("B" & Rows.Count).End(xlUp).Row
  If eRow <> eR Then
    eR = eRow
    Call CreateArr
  End If
  
  txt = LCase(t1.Text)
  If Len(txt) = 0 Then
    l1.List = sArr
  Else
    k = 0
    S = Split(txt, "&")
    ReDim Arr(1 To sRow)
    For i = 1 To sRow
      For j = 0 To UBound(S)
        If InStr(1, tArr(i), S(j)) = 0 Then GoTo Thoat
      Next j
      k = k + 1
      Arr(k) = i
Thoat:
    Next i
    If k = 0 Then
      l1.Clear
    Else
      ReDim Res(1 To k, 1 To sCol)
      For i = 1 To k
        ik = Arr(i)
        For j = 1 To sCol
          Res(i, j) = sArr(ik, j)
        Next j
      Next i
      l1.List = Res
    End If
  End If
End Sub

Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A6:AF" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To 12)
  For i = 1 To sRow
    For j = 1 To 12
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) =  "," & LCase(Join(Arr, ",")) & ","
  Next i
End Sub
Qui tắc nhập vào text box để tìm dữ liệu
"xx" tìm tất cả các cột có ký tự "xx" ở vị trí bất kỳ
",xx" tìm tất cả các cột có ký tự "xx" ở vị trí Đầu
"xx," tìm tất cả các cột có ký tự "xx" ở vị trí Cuối
"xx&yy" tìm tất cả các cột có ký tự "xx" ở vị trí bất kỳ và phải có cột có ký tự "yy" ở vị trí bất kỳ
Ký tự "," chỉ đầu hoặc cuối chuổi
Ký tự "&" phải thỏa đồng thời các điều kiện
Ví dụ nhập thử: "mơ&a2,&,5,"

Bạn viết code gán giá trị vào các text box khi chọn Listbox, mình sẽ viết thêm nút "Sửa"
1. Cảm ơn bác, em có thể hỏi thêm là có thể mở rộng vùng tìm kiếm được không? hiện tại bác cho tìm kiếm từ "A:L" các cột khác tìm không thấy dữ liệu
2. Đây là code em viết gán giá trị vào các textbox khi chọn listbox
Mã:
Private Sub l1_Click()
    t2 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 0)
    t3 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 1)
    t4 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 2)
    t5 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 3)
    t6 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 4)
    t7 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 5)
    t8 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 6)
    t9 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 7)
    t10 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 8)
    t11 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 10)
    t12 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 11)
    t13 = Format(fchinhsua.l1.List(fchinhsua.l1.ListIndex, 12), "hh:mm")
    t14 = Format(fchinhsua.l1.List(fchinhsua.l1.ListIndex, 13), "hh:mm")
    t15 = Format(fchinhsua.l1.List(fchinhsua.l1.ListIndex, 14), "#0.##")
    t16 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 15)
    t17 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 16)
    t18 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 24)
    t19 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 27)
    t20 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 30)
    lab1 = fchinhsua.l1.List(fchinhsua.l1.ListIndex, 32)
End Sub
 

File đính kèm

. . . rồi có cái D là chưa làm được, do em chưa biết cách dựa vào cái j để so sánh để đến dòng đó là nó ghi. Chắc phải thêm 1 cột (dạng STT) để bám vào.
Với lại file bác gửi em nghịch thử toàn báo lỗi
Bạn nghịch như thế nào & báo lỗi ra sao
Ở Page1 Nhập Ta nhập 1 ngày tháng 5 nào đó
Chọn dữ liệu từ ComboBox thì macro sẽ gán mã nhận diện của dòng dữ liệu 1 cách tự động.
Khi nhập số liệu hàng hóa theo mã chọn (từ 2 ComboBox) về Sl & DG ta bấm lưu dòng DL lên ListBox
Muốn sửa dòng DL nào trên ListBox, ta bấm chuột vô nớ để vài các thông số có thể sửa như mã HH, . . . Sau sửa xong ta lại bấm lưu dòng sửa lên ListBox
Nhập hết 1 chứng từ, ta bấm lưu toàn bộ chúng từ đó lên trang 'Nhap'

1. Cảm ơn bác, em có thể hỏi thêm là có thể mở rộng vùng tìm kiếm được không? hiện tại bác cho tìm kiếm từ "A:L" các cột khác tìm không thấy dữ liệu
Nếu là mình thì mình làm 1 ComboBox để chọn duy nhất 1 trường (cột) cho công cuộc tìm kiếm mà thôi
Lúc đó ta nhập những trị cần tìm lên TextBox cũng tiện
Có ai thánh đến nổi nhớ hết các trị của 1 dòng dữ liệu đặt trưng (như mã, tên & . . . ) kia chứ?
 
Lần chỉnh sửa cuối:
1. Cảm ơn bác, em có thể hỏi thêm là có thể mở rộng vùng tìm kiếm được không? hiện tại bác cho tìm kiếm từ "A:L" các cột khác tìm không thấy dữ liệu
Bạn chỉnh trong code 2 dòng
"1 To 12"
thành
"1 To số cột" mà bạn muốn dò tìm
hay "cột đầu To cột cuối"
Mã:
Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A6:AF" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To 12)
  For i = 1 To sRow
    For j = 1 To 12
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) =  "," & LCase(Join(Arr, ",")) & ","
  Next i
End Sub
 
Bạn chỉnh trong code 2 dòng
"1 To 12"
thành
"1 To số cột" mà bạn muốn dò tìm
hay "cột đầu To cột cuối"
Mã:
Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A6:AF" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To 12)
  For i = 1 To sRow
    For j = 1 To 12
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) =  "," & LCase(Join(Arr, ",")) & ","
  Next i
End Sub
em có chỉnh như a nói mà cũng ko được???
Em chỉnh như sau :
Mã:
Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A6:AG" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To 33)
  For i = 1 To sRow
    For j = 1 To 33
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) =  "," & LCase(Join(Arr, ",")) & ","
  Next i
End Sub
em có chỉnh sai không nhỉ :v
 
em có chỉnh như a nói mà cũng ko được???
Em chỉnh như sau :
Mã:
Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A6:AG" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To 33)
  For i = 1 To sRow
    For j = 1 To 33
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) =  "," & LCase(Join(Arr, ",")) & ","
  Next i
End Sub
em có chỉnh sai không nhỉ :v
Bạn nhập các ký tự gì mà không tìm được
 
Bạn nghịch như thế nào & báo lỗi ra sao
Ở Page1 Nhập Ta nhập 1 ngày tháng 5 nào đó
Chọn dữ liệu từ ComboBox thì macro sẽ gán mã nhận diện của dòng dữ liệu 1 cách tự động.
Khi nhập số liệu hàng hóa theo mã chọn (từ 2 ComboBox) về Sl & DG ta bấm lưu dòng DL lên ListBox
Muốn sửa dòng DL nào trên ListBox, ta bấm chuột vô nớ để vài các thông số có thể sửa như mã HH, . . . Sau sửa xong ta lại bấm lưu dòng sửa lên ListBox
Nhập hết 1 chứng từ, ta bấm lưu toàn bộ chúng từ đó lên trang 'Nhap'


Nếu là mình thì mình làm 1 ComboBox để chọn duy nhất 1 trường (cột) cho công cuộc tìm kiếm mà thôi
Lúc đó ta nhập những trị cần tìm lên TextBox cũng tiện
Có ai thánh đến nổi nhớ hết các trị của 1 dòng dữ liệu đặt trưng (như mã, tên & . . . ) kia chứ?
Chỉnh toàn bộ các code
Mã:
Dim sArr(), tArr(), rArr(), eR As Long, sRow As Long, sCol As Long, id As Long
Private Sub c1_Click()
  Dim res(), Arr(), i As Long
  i = rArr(id + 1)
  res = Range("A" & i + 4).Resize(, sCol).Value
  res(1, 1) = t2.Value
  res(1, 2) = t3.Value
  res(1, 3) = t4.Value
  res(1, 4) = t5.Value
  res(1, 5) = t6.Value
  res(1, 6) = t7.Value
  res(1, 7) = t8.Value
  res(1, 8) = t9.Value
  res(1, 9) = t10.Value
  res(1, 11) = t11.Value
  res(1, 12) = t12.Value
  res(1, 13) = t13.Value
  res(1, 14) = t14.Value
  res(1, 15) = t15.Value
  res(1, 16) = t16.Value
  res(1, 17) = t17.Value
  res(1, 25) = t18.Value
  res(1, 28) = t19.Value
  res(1, 31) = t20.Value
 
  Me.l1.List(id, 0) = res(1, 1)
  Me.l1.List(id, 1) = res(1, 2)
  Me.l1.List(id, 2) = res(1, 3)
  Me.l1.List(id, 3) = res(1, 4)
  Me.l1.List(id, 4) = res(1, 5)
  Me.l1.List(id, 5) = res(1, 6)
  Me.l1.List(id, 6) = res(1, 7)
  Me.l1.List(id, 7) = res(1, 8)
  Me.l1.List(id, 8) = res(1, 9)
  Me.l1.List(id, 10) = res(1, 11)
  Me.l1.List(id, 11) = res(1, 12)
  Me.l1.List(id, 12) = res(1, 13)
  Me.l1.List(id, 13) = res(1, 14)
  Me.l1.List(id, 14) = res(1, 15)
  Me.l1.List(id, 15) = res(1, 16)
  Me.l1.List(id, 16) = res(1, 17)
  Me.l1.List(id, 24) = res(1, 25)
  Me.l1.List(id, 27) = res(1, 28)
  Me.l1.List(id, 30) = res(1, 31)
 
  Range("A" & rArr(id + 1) + 4).Resize(, sCol) = res
  sArr = Range("A5").Resize(sRow, sCol).Value
 
  ReDim Arr(1 To sCol)
  For j = 1 To sCol
      If TypeName(sArr(i, j)) = "Error" Then sArr(i, j) = Empty
      Arr(j) = sArr(i, j)
  Next j
  tArr(i) = "," & LCase(Join(Arr, ",")) & ","
End Sub

Private Sub l1_Click()
  id = Me.l1.ListIndex
  t2 = fchinhsua.l1.List(id, 0)
  t3 = fchinhsua.l1.List(id, 1)
  t4 = fchinhsua.l1.List(id, 2)
  t5 = fchinhsua.l1.List(id, 3)
  t6 = fchinhsua.l1.List(id, 4)
  t7 = fchinhsua.l1.List(id, 5)
  t8 = fchinhsua.l1.List(id, 6)
  t9 = fchinhsua.l1.List(id, 7)
  t10 = fchinhsua.l1.List(id, 8)
  t11 = fchinhsua.l1.List(id, 10)
  t12 = fchinhsua.l1.List(id, 11)
  t13 = Format(fchinhsua.l1.List(id, 12), "hh:mm")
  t14 = Format(fchinhsua.l1.List(id, 13), "hh:mm")
  t15 = Format(fchinhsua.l1.List(id, 14), "#0.##")
  t16 = fchinhsua.l1.List(id, 15)
  t17 = fchinhsua.l1.List(id, 16)
  t18 = fchinhsua.l1.List(id, 24)
  t19 = fchinhsua.l1.List(id, 27)
  t20 = fchinhsua.l1.List(id, 30)
End Sub

Private Sub t1_Change()
  Dim res(), S, txt As String
  Dim i As Long, k As Long, ik As Long, n As Long, j As Long
 
  txt = LCase(t1.Text)
  If Len(txt) = 0 Then
    l1.List = sArr
    For i = 2 To sRow
      rArr(i) = i
    Next i
  Else
    k = 1
    S = Split(txt, "&")
    For i = 2 To sRow
      For j = 0 To UBound(S)
        If InStr(1, tArr(i), S(j)) = 0 Then GoTo Thoat
      Next j
      k = k + 1
      rArr(k) = i
Thoat:
    Next i
    If k = 1 Then
      l1.Clear
    Else
      ReDim res(1 To k, 1 To sCol)
      For j = 1 To sCol
        res(1, j) = sArr(1, j)
      Next j
      For i = 2 To k
        ik = rArr(i)
        For j = 1 To sCol
          res(i, j) = sArr(ik, j)
        Next j
      Next i
      l1.List = res
    End If
  End If
End Sub

Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A5:AF" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim rArr(1 To sRow)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To sCol)
  Application.ScreenUpdating = False
  For i = 1 To sRow
    For j = 1 To sCol
      If TypeName(sArr(i, j)) = "Error" Then sArr(i, j) = Empty
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) = "," & LCase(Join(Arr, ",")) & ","
    rArr(i) = i
  Next i
  Application.ScreenUpdating = True
End Sub

Private Sub UserForm_Initialize()
Dim eRow As Long, lr1 As Long, lr2 As Long
  eRow = Range("B" & Rows.Count).End(xlUp).Row
  If eRow <> eR Then
    eR = eRow
    Call CreateArr
  End If
  l1.List = sArr
End Sub

Private Sub c2_Click()
    Unload Me
End Sub
 
Chỉnh toàn bộ các code
Mã:
Dim sArr(), tArr(), rArr(), eR As Long, sRow As Long, sCol As Long, id As Long
Private Sub c1_Click()
  Dim res(), Arr(), i As Long
  i = rArr(id + 1)
  res = Range("A" & i + 4).Resize(, sCol).Value
  res(1, 1) = t2.Value
  res(1, 2) = t3.Value
  res(1, 3) = t4.Value
  res(1, 4) = t5.Value
  res(1, 5) = t6.Value
  res(1, 6) = t7.Value
  res(1, 7) = t8.Value
  res(1, 8) = t9.Value
  res(1, 9) = t10.Value
  res(1, 11) = t11.Value
  res(1, 12) = t12.Value
  res(1, 13) = t13.Value
  res(1, 14) = t14.Value
  res(1, 15) = t15.Value
  res(1, 16) = t16.Value
  res(1, 17) = t17.Value
  res(1, 25) = t18.Value
  res(1, 28) = t19.Value
  res(1, 31) = t20.Value

  Me.l1.List(id, 0) = res(1, 1)
  Me.l1.List(id, 1) = res(1, 2)
  Me.l1.List(id, 2) = res(1, 3)
  Me.l1.List(id, 3) = res(1, 4)
  Me.l1.List(id, 4) = res(1, 5)
  Me.l1.List(id, 5) = res(1, 6)
  Me.l1.List(id, 6) = res(1, 7)
  Me.l1.List(id, 7) = res(1, 8)
  Me.l1.List(id, 8) = res(1, 9)
  Me.l1.List(id, 10) = res(1, 11)
  Me.l1.List(id, 11) = res(1, 12)
  Me.l1.List(id, 12) = res(1, 13)
  Me.l1.List(id, 13) = res(1, 14)
  Me.l1.List(id, 14) = res(1, 15)
  Me.l1.List(id, 15) = res(1, 16)
  Me.l1.List(id, 16) = res(1, 17)
  Me.l1.List(id, 24) = res(1, 25)
  Me.l1.List(id, 27) = res(1, 28)
  Me.l1.List(id, 30) = res(1, 31)

  Range("A" & rArr(id + 1) + 4).Resize(, sCol) = res
  sArr = Range("A5").Resize(sRow, sCol).Value

  ReDim Arr(1 To sCol)
  For j = 1 To sCol
      If TypeName(sArr(i, j)) = "Error" Then sArr(i, j) = Empty
      Arr(j) = sArr(i, j)
  Next j
  tArr(i) = "," & LCase(Join(Arr, ",")) & ","
End Sub

Private Sub l1_Click()
  id = Me.l1.ListIndex
  t2 = fchinhsua.l1.List(id, 0)
  t3 = fchinhsua.l1.List(id, 1)
  t4 = fchinhsua.l1.List(id, 2)
  t5 = fchinhsua.l1.List(id, 3)
  t6 = fchinhsua.l1.List(id, 4)
  t7 = fchinhsua.l1.List(id, 5)
  t8 = fchinhsua.l1.List(id, 6)
  t9 = fchinhsua.l1.List(id, 7)
  t10 = fchinhsua.l1.List(id, 8)
  t11 = fchinhsua.l1.List(id, 10)
  t12 = fchinhsua.l1.List(id, 11)
  t13 = Format(fchinhsua.l1.List(id, 12), "hh:mm")
  t14 = Format(fchinhsua.l1.List(id, 13), "hh:mm")
  t15 = Format(fchinhsua.l1.List(id, 14), "#0.##")
  t16 = fchinhsua.l1.List(id, 15)
  t17 = fchinhsua.l1.List(id, 16)
  t18 = fchinhsua.l1.List(id, 24)
  t19 = fchinhsua.l1.List(id, 27)
  t20 = fchinhsua.l1.List(id, 30)
End Sub

Private Sub t1_Change()
  Dim res(), S, txt As String
  Dim i As Long, k As Long, ik As Long, n As Long, j As Long

  txt = LCase(t1.Text)
  If Len(txt) = 0 Then
    l1.List = sArr
    For i = 2 To sRow
      rArr(i) = i
    Next i
  Else
    k = 1
    S = Split(txt, "&")
    For i = 2 To sRow
      For j = 0 To UBound(S)
        If InStr(1, tArr(i), S(j)) = 0 Then GoTo Thoat
      Next j
      k = k + 1
      rArr(k) = i
Thoat:
    Next i
    If k = 1 Then
      l1.Clear
    Else
      ReDim res(1 To k, 1 To sCol)
      For j = 1 To sCol
        res(1, j) = sArr(1, j)
      Next j
      For i = 2 To k
        ik = rArr(i)
        For j = 1 To sCol
          res(i, j) = sArr(ik, j)
        Next j
      Next i
      l1.List = res
    End If
  End If
End Sub

Private Sub CreateArr()
  Dim Arr(), i As Long, eRow As Long, j As Long

  sArr = Range("A5:AF" & eR).Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim rArr(1 To sRow)
  ReDim tArr(1 To sRow)
  ReDim Arr(1 To sCol)
  Application.ScreenUpdating = False
  For i = 1 To sRow
    For j = 1 To sCol
      If TypeName(sArr(i, j)) = "Error" Then sArr(i, j) = Empty
      Arr(j) = sArr(i, j)
    Next j
    tArr(i) = "," & LCase(Join(Arr, ",")) & ","
    rArr(i) = i
  Next i
  Application.ScreenUpdating = True
End Sub

Private Sub UserForm_Initialize()
Dim eRow As Long, lr1 As Long, lr2 As Long
  eRow = Range("B" & Rows.Count).End(xlUp).Row
  If eRow <> eR Then
    eR = eRow
    Call CreateArr
  End If
  l1.List = sArr
End Sub

Private Sub c2_Click()
    Unload Me
End Sub
code chuẩn cơ mà đọc không hiểu gì luôn, thế này gặp bài khác biết biến tấu kiểu gì được bác @HieuCD :v :v :v
 
Web KT

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

Back
Top Bottom