Demo Form tìm kiếm nhiều cột trong Listbox

Liên hệ QC

ongke0711

Thành viên gắn bó
Tham gia
7/9/06
Bài viết
1,954
Được thích
2,537
Giới tính
Nam
Form tìm kiếm listbox thì diễn đàn cũng có nhiều bài rồi nhưng nó nằm chung trong các bài hỏi của thành viên nên tìm cũng mệt :). Vừa làm vừa học nên tôi tạo cái post này cho dễ tìm kiếm và nhờ các anh em giúp cải thiện cái form này cho chạy trơn tru và thuận tiện nhé.
- Form dùng tìm kiếm theo nhiều cột trong listbox. Chỉ cần gõ ký tự chuỗi bất kỳ, nó sẽ tìm trong tất cả các cột để lấy ra dòng có chứa chuỗi.
- Viết dạng hàm để có thể gọi sử dụng lại ở nhiều form.

Điểm chưa làm được:
- Chưa định dạng được dữ liệu hiển thị từng cột trong listbox (dùng mảng gán row source cho listbox). Cụ thể trong demo là cột [Đơn giá]: không có định dạng số (dấu cách phần ngàn .000).
- Chưa tuỳ chọn Sort dữ liệu tự động (theo cột đã chọn) trong listbox sau khi tìm kiếm (có tham khảo mấy hàm bubble sort trên mạng nhưng tích hợp vô).

Bạn nào chỉ cần tìm kiếm dữ liệu thì tôi nghĩ form này đáp ứng yêu cầu. :)
Các bạn hỗ trợ bổ sung thiết kế giùm nhé. File đính kèm bên dưới.
Cảm ơn.


Code cho Userform:

Mã:
Option Explicit

Dim oRngLstBx1 As Range

Private Sub txtChuoiTK_Change()
    Dim strTextSearch As String

    strTextSearch = Me.txtChuoiTK.Value
    Call faytLstBxMultiCol(oRngLstBx1, strTextSearch, "lstDanhSachVPP", Me)

End Sub

Private Sub UserForm_Initialize()
    ganSourceListbox
    Me.txtChuoiTK.SetFocus
End Sub


Sub ganSourceListbox()

    Dim sArr() As Variant

    Set oRngLstBx1 = Range(Range("A2"), Range("A2").End(xlDown).End(xlToRight))     'Khai báo cho biesn toàn cuc de su dung cho hàm TK
    ReDim sArr(1 To oRngLstBx1.Rows.Count, 1 To oRngLstBx1.Columns.Count)

    sArr = oRngLstBx1.Value
    Me.lstDanhSachVPP.List = sArr

End Sub


- Hàm faytLstBxMultiCol():

Mã:
Option Explicit

Function faytLstBxMultiCol(oLstBxRng As Range, strSearchTxt As String, strLstBxName As String, frm As UserForm) As Boolean
'----------------------------------------------------------
'# Hàm tim kiem,loc danh sach listbox theo chuoi tìm kiem.
'# oLstBxRng:       là Range làm Row Source cho Listbox.
'# strSearchTxt:    Chuoi can tim (tu textbox).
'# strLstBxName:    Ten cua listbox control tren userform.
'----------------------------------------------------------

On Error GoTo EH

    Dim sArr() As Variant
    Dim blnFound As Boolean 'bien neu tim thay chuoi can tìm
    Dim i As Long, j As Long, rCount As Long
    Dim oLstBx As Object

    faytLstBxMultiCol = False
    Set oLstBx = frm.Controls(strLstBxName)

    ReDim sArr(1 To oLstBxRng.Columns.Count, 1 To oLstBxRng.Rows.Count)

    For i = 1 To oLstBxRng.Rows.Count
        blnFound = False
        For j = 1 To oLstBxRng.Columns.Count
            If InStr(1, oLstBxRng.Cells(i, j).Value, strSearchTxt, vbTextCompare) > 0 Then  'Tim kiem chuoi tung dong, cot
                blnFound = True     'Tim thay chuoi
                Exit For
            End If
        Next j
        If blnFound Then
            rCount = rCount + 1     'Luu tong so dòng tìm hay chuoi
            For j = 1 To oLstBxRng.Columns.Count
                sArr(j, rCount) = oLstBxRng.Cells(i, j).Value   'Dua tri tim duoc vao mang, luu hang ngang
            Next j
        End If
    Next i

    'Khai bao lai kich thuoc mang theo so dong tim thay chuoi
    If rCount > 0 Then
        ReDim Preserve sArr(1 To j - 1, 1 To rCount)
    Else    'Khong tim thay dòng nào chua chuoi tk
        ReDim Preserve sArr(1 To j - 1, 1 To 1)
    End If

    If UBound(sArr, 2) > 1 Then     'Mang co nhieu gia tri giong chuoi tim kiem
        sArr = Application.WorksheetFunction.Transpose(sArr)
        oLstBx.List = sArr
    Else    'Mang tra ve chinh xác 1 giá tri tim kiem
        oLstBx.Clear
        oLstBx.AddItem
        For i = 1 To UBound(sArr)
            oLstBx.Column(i - 1, 0) = sArr(i, 1)
        Next i
    End If

    faytLstBxMultiCol = True
    Exit Function

EH_Exit:
    faytLstBxMultiCol = False
    Exit Function
EH:
    MsgBox "Loi: " & Err.Number & vbNewLine & "Noi dung loi: " & Err.Description
    Resume EH_Exit

End Function


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Bổ sung: (sau thời gian mò mẫm thêm :) )
- Thêm phần định các cột kiểu số (number) trong listbox với dấu phân cách hàng ngàn.
- Hàm dùng định dạng cột kiểu số trong listbox với tuỳ chọn nhiều cột.
(Đã đính kèm thêm file có định dạng cột)

Mình cũng có sưu tầm được một Class dùng để "canh lề" từng cột trong listbox riêng biệt (hiện nay Listbox chỉ cho phép canh lề một kiểu, áp dụng cho toàn bộ listbox) nhưng khi chạy thấy nó tải dữ liệu lên listbox chậm nên không đưa vô đây.
Giải thuật của các class này là xử lý từng cột -> từng record -> dùng label tạm để lưu nội dung record, thêm dấu cách vào trước, sau hoặc 2 bên để canh phải, trái, giữa rồi lưu lại nội dung vừa sửa vào listbox. Danh sách có 200 dòng mà nó chạy vòng lập cũng mất ~ 2s nên thôi bỏ qua giải pháp này.

Code hàm formatNumColumnLstBx() :

Mã:
Function formatNumColumnLstBx(sLstBxName As String, sColNumList As String, frm As UserForm, sNumFormat As String)

'----------------------------------------------------------------
'# Muc dích: dùng dinh dang các cot kieu Number trong listbox và dùng trong truong hop dùng Mang (Array) gan du lieu cho LstBox.
'# Tham so:
'#   - sColNumList: danh sách các cot can dinh dang So, cách nhau dau phay ','. Vd: "4,5,6".
'#   - sNumFormat:  kieu dinh dang so. Vd: "#,##0": "#,##0.00" hoac "$#,##0.00"
'----------------------------------------------------------------

    Dim arColNumList As Variant
    Dim lngIndex As Long, i As Integer, intColNum As Integer

    If sColNumList = "" Then Exit Function

    arColNumList = Split(sColNumList, ",")

    With frm.Controls(sLstBxName)
        For i = LBound(arColNumList) To UBound(arColNumList)
            intColNum = Val(Trim(arColNumList(i)))          'Trim de bo loi khoang trang neu co
            If intColNum > .ColumnCount Then Exit Function  'Neu so thu tu cot khong có trong listbox se bao loi
            For lngIndex = 0 To .ListCount - 1
                .List(lngIndex, intColNum - 1) = (Format(Val(.List(lngIndex, intColNum - 1)), sNumFormat))
            Next
        Next i
    End With
End Function


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Cập nhật: 06/06/2019

Đã cập nhật file mới sử dụng code (dùng mảng) của bạn befaint để tối ưu tốc độ tìm kiếm.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Cập nhật: 09/06/2019

Cập nhật thêm file mới sử dụng code (dùng mảng) của bạn HeSanbi rất ngắn gọn và bẫy lỗi khi range dữ liệu cho listbox không có data.


(***PS: tôi vẫn giữa các file phiên bản khác nhau để các tham khảo code các kiểu)


218600
 

File đính kèm

  • TimKiemListBox_nhieuCot.xlsm
    50.3 KB · Đọc: 427
  • TimKiemListBox_nhieuCot_FormatColumn.xlsm
    56.2 KB · Đọc: 333
  • TimKiemListBox_nhieuCot(dungArray).xlsm
    49.5 KB · Đọc: 302
  • TimKiemListBox_nhieuCot(dungArray)_HeSanbi.xlsm
    44.4 KB · Đọc: 467
Lần chỉnh sửa cuối:
Quên là trường hợp này bạn có thể dùng ADO để lấy cột dữ liệu nào muốn cũng dễ hơn.
"Select Ten, Gia From [Range]"
Bạn xem bài của bác HLMT:https://www.giaiphapexcel.com/diend...ile-không-mở-kết-nối-adodb-connection.141551/
Đúng form tìm kiếm em cần.
Các anh có thể hướng dẫn cụ thể chỗ chọn các Cột mình cần tìm. Em mới tìm hiểu VBA, nên chưa nắm bắt được. Em đang cần Form tìm kiếm như này ạ. Bây giờ em muốn chỗ Danh sách các nội dung mình tìm thấy thì Click đúp chuột vào thì Ô textbox tìm kiếm bên trên (hoặc ô textbox khác) sẽ nhận được giá trị tìm kiếm đó ạ. Em cảm ơn các anh chị ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
trước tiên cám ơn cả nhà đã hỗ trợ và cho em học hỏi được rất nhiều,
Còn 1 vấn đề ngoài luồng e cũng ko biết xin tư vấn từ ai, sẵn đây cho e xin hỏi các bác 1 chút
=> Em muốn Copy 1 Cells trong listbox đưa vào Clipboard . Mà mấy nay mò hoài không ra , mong các bác chỉ giáo
Xin 1 lần nữa đa tạ cả nhà
 
Upvote 0
trước tiên cám ơn cả nhà đã hỗ trợ và cho em học hỏi được rất nhiều,
Còn 1 vấn đề ngoài luồng e cũng ko biết xin tư vấn từ ai, sẵn đây cho e xin hỏi các bác 1 chút
=> Em muốn Copy 1 Cells trong listbox đưa vào Clipboard . Mà mấy nay mò hoài không ra , mong các bác chỉ giáo
Xin 1 lần nữa đa tạ cả nhà

Cách làm thì có nhiều nhưng thực sự mục đích xử lý cuối cùng mà bạn muốn là gì? Tại sao phải dùng ClipBoard, dữ liệu bạn lưu trên đó rồi lấy xuống có đáng tin cậy không? Sao không xử lý lấy và gán dữ liệu luôn.
 
Upvote 0
Đúng form tìm kiếm em cần.
Các anh có thể hướng dẫn cụ thể chỗ chọn các Cột mình cần tìm. Em mới tìm hiểu VBA, nên chưa nắm bắt được. Em đang cần Form tìm kiếm như này ạ. Bây giờ em muốn chỗ Danh sách các nội dung mình tìm thấy thì Click đúp chuột vào thì Ô textbox tìm kiếm bên trên (hoặc ô textbox khác) sẽ nhận được giá trị tìm kiếm đó ạ. Em cảm ơn các anh chị ạ.

Bạn xem file đính kèm.
Bạn nên tự mình mày mò code thử tới đâu, bị tắt chỗ nào rồi mới gửi file lên nhờ mọi người hỗ trợ.
Bạn đừng nói tôi là sau khi gán xong, muốn sửa nội dung sau đó lưu lại thì code làm sao nhé :) . Tự thân vận động trước đã.

Code gán dữ liệu từ Listbox xuống Textbox: bạn chú ý cách tôi thiết lập "Tag" của các Textbox trong UserForm.

Mã:
Private Sub lstDanhSachVPP_Click()
    Dim r As Long
    Dim ctl As Control

    If Me.lstDanhSachVPP.ListIndex = -1 Then    'Khong chon dong nao
        Exit Sub
    ElseIf Me.lstDanhSachVPP.ListIndex >= 0 Then    'Da chon dong
        r = Me.lstDanhSachVPP.ListIndex     'so dòng dang chon cua listbox
        For Each ctl In Me.Controls
            If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Or TypeName(ctl) = "CheckBox" Or TypeName(ctl) = "OptionButton" Then
                If Right(ctl.Tag, 3) = "yes" Then   'Tùy chon textbox nào can gan du lieu. Thiet lap trong Tag.
                    ctl.Value = Me.lstDanhSachVPP.List(r, CInt(Left(ctl.Tag, 1)) - 1)   'Ký tu dau trong tag la so cot trong lstbox
                End If
            End If
        Next ctl
    End If
End Sub
 

File đính kèm

  • TimKiemListBox_nhieuCot_GanDataVaoTextbox.xlsm
    48.4 KB · Đọc: 218
Lần chỉnh sửa cuối:
Upvote 0
File của anh chọn dòng trên cùng không được, chỉnh lại
Mã:
ElseIf Me.lstDanhSachVPP.ListIndex >= 1 Then    'Da chon dong
chỉnh lại=>>>>ElseIf Me.lstDanhSachVPP.ListIndex >= 0 Then    'Da chon dong
 
Upvote 0
Cách làm thì có nhiều nhưng thực sự mục đích xử lý cuối cùng mà bạn muốn là gì? Tại sao phải dùng ClipBoard, dữ liệu bạn lưu trên đó rồi lấy xuống có đáng tin cậy không? Sao không xử lý lấy và gán dữ liệu luôn.
Mục đích: là em đang làm 1 Form gồm các trường "Subject Mail" & "Nội dung Mail" theo template được em định dạng sẵn
=> Vì công việc đặc thù, em phải phản hồi mail case by case theo chủ đề và khách hàng
=> Hiện tại em đã nghiên cứu được cách copy all list box nhưng có vẻ nhưng ứng dụng vào thì không thích hợp với mục đích của mình
Code như sau :

Dim Dt3 As DataObject, Tm3, i3, j3
Set Dt3 = New DataObject
For i3 = 0 To Me.lstbaocao.ListCount - 1
For j3 = 0 To lstbaocao.ColumnCount - 1
Tm3 = Tm3 & Me.lstbaocao.List(i3, j3) & IIf(j3 < Me.lstbaocao.ColumnCount - 1, vbTab, vbNewLine)
Next
Next
Dt3.SetText Tm3
Dt3.PutInClipboard

-> Các bác thông thạo nhiều tính huống và có nghiên cứu đủ sâu và rộng về VBA nên mong các bác hỗ trợ em
Cám ơn các bác
 
Upvote 0
Mục đích: là em đang làm 1 Form gồm các trường "Subject Mail" & "Nội dung Mail" theo template được em định dạng sẵn
=> Vì công việc đặc thù, em phải phản hồi mail case by case theo chủ đề và khách hàng
=> Hiện tại em đã nghiên cứu được cách copy all list box nhưng có vẻ nhưng ứng dụng vào thì không thích hợp với mục đích của mình

Vậy tức là đối với mỗi người nhận bạn soạn thông tin riêng, lưu thành các record như trong hình listbox bạn gửi mấy này trước, sau đó muốn chọn hàng loạt người nhận rồi bấm gửi email một lúc luôn hay sao?
Nếu theo kểu đó bạn nên thiết kế form phụ tuỳ chọn ds người nhận rồi dùng vòng lặp duyệt qua từng người gọi code tạo email từng người rồi gửi.
 
Lần chỉnh sửa cuối:
Upvote 0
Các cao nhân cho mình hỏi chút bình thường mình dùng Excel khoảng 60 đến 80k dòng thấy file load rất chậm và đơ luôn máy mình kiểm tra thấy nguyên nhân là có rất nhiều name Range tồn tại. Vậy mình dùng cái bảng cứ mỗi lần thêm mới dòng mình xóa hết name range đi có dc ko vậy hãy có cách nào khác ko
Bài đã được tự động gộp:

Mình muốn tạo mã tự động trong excel theo cái định dạng yyyymmddhhss (lấy theo mốc thời gian hiện tại) có được ko mọi ng.
Ví dụ mình có một cái bảng, mình có một nút button, khi click sẽ tự động tạo dòng mới và mã id mới, ví dụ: 20200410224822
 
Lần chỉnh sửa cuối:
Upvote 0
. . . . . . .
Mình muốn tạo mã tự động trong excel theo cái định dạng yyyymmddhhss (lấy theo mốc thời gian hiện tại) có được ko mọi ng.
Ví dụ mình có một cái bảng, mình có một nút button, khi click sẽ tự động tạo dòng mới và mã id mới, ví dụ: 20200410224822
Mã đó theo mình chứa quá nhiều ký số & như vậy sẽ có độ dài quá lớn
Nên chăng xài vầy YMDHMS, như ví dụ J4AV8V mà ở đây:
J là năm 2020, năm sau sẽ là K
4 là tháng 4, tháng 11 sẽ là B
A là ngày 10; D sẽ là ngày 13
V là giờ thứ 22 trong ngày
. . . .
Có vậy mã của ta sẽ có độ dài luôn như nhau & quan trọng là chỉ 6 kí tự (hay có kí số)
Nếu ưng ý, mình sẽ giúp bạn 2 hàm tự tạo chuyển đổi qua lại giữa mã ngày gợi ý bên trên & ngày giờ theo qui luật (?)

& lưu ý lần sau nên tạo chủ đề mới cho mình, đừng viết vô chủ đề của người khác sau này khó cho bạn trong việc tìm kiếm
 
Lần chỉnh sửa cuối:
Upvote 0
Mã đó theo mình chứa quá nhiều ký số & như vậy sẽ có độ dài quá lớn
Nên chăng xài vầy YMDHMS, như ví dụ J4AV8V mà ở đây:
J là năm 2020, năm sau sẽ là K
4 là tháng 4, tháng 11 sẽ là B
A là ngày 10; D sẽ là ngày 13
V là giờ thứ 22 trong ngày
. . . .
Có vậy mã của ta sẽ có độ dài luôn như nhau & quan trọng là chỉ 6 kí tự (hay có kí số)
Nếu ưng ý, mình sẽ giúp bạn 2 hàm tự tạo chuyển đổi qua lại giữa mã ngày gợi ý bên trên & ngày giờ theo qui luật (?)

& lưu ý lần sau nên tạo chủ đề mới cho mình, đừng viết vô chủ đề của người khác sau này khó cho bạn trong việc tìm kiếm
Vậy bạn chỉ giúp mình với
Mình Ko biết nhiều về có dễ VBA
 
Upvote 0
Bạn xem trong file
 

File đính kèm

  • Mã hóa MMDDyy.xlsm
    17.8 KB · Đọc: 74
Upvote 0
Mã đó theo mình chứa quá nhiều ký số & như vậy sẽ có độ dài quá lớn
Nên chăng xài vầy YMDHMS, như ví dụ J4AV8V mà ở đây:
J là năm 2020, năm sau sẽ là K
4 là tháng 4, tháng 11 sẽ là B
A là ngày 10; D sẽ là ngày 13
V là giờ thứ 22 trong ngày
. . . .
Có vậy mã của ta sẽ có độ dài luôn như nhau & quan trọng là chỉ 6 kí tự (hay có kí số)
Nếu ưng ý, mình sẽ giúp bạn 2 hàm tự tạo chuyển đổi qua lại giữa mã ngày gợi ý bên trên & ngày giờ theo qui luật (?)

& lưu ý lần sau nên tạo chủ đề mới cho mình, đừng viết vô chủ đề của người khác sau này khó cho bạn trong việc tìm kiếm
Bác làm thế này , dùng lâu dài có thể sẽ dính lỗi kiểu Y2K, có phải không ạ?
(Chào bác SA, bác vẫn sung sức và tràn đầy năng lượng, giờ thấy bác chiến đấu các mảng luôn)
 
Upvote 0
Bác làm thế này , dùng lâu dài có thể sẽ dính lỗi kiểu Y2K, có phải không ạ?
(Chào bác SA, bác vẫn sung sức và . . . )
Đúng, mà còn sử dụng đến 60 năm nữa cũng được, nếu biến hóa đi 1 chút nữa: Vì 3 năm chỉ cho 36 tháng, cho nên ta có thể làm sao đó 1 ký tự có thể đại diện cho 3 năm! (Nhưng dù sao cũng tới chừng đó hay thêm chút nữa mà thôi. . .bằng cách thêm ký tự trời ơi vô 'Alf', như '@ $ # %&,. . . )
:D
}}}}}


BS:
Chú mày đang ở đâu vậy & sinh nhật này có dự không?
 
Lần chỉnh sửa cuối:
Upvote 0
Bác viết thêm hàm đọc ngược lại cái mã hóa nữa thì mới đẹp.
Sẵn lòng thôi, nhưng tách ra làm 2 đáp án ngày riêng & thời gian riêng
PHP:
Const Alf As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Function TGMa(Ma As String, Optional Dat As Integer = 0)
 Dim Nm As Integer, VTr As Integer, Th As Integer, Ng As Integer
  
 If Dat Then
    VTr = InStr(Alf, Mid(Ma, 4, 1)):        Nm = VTr - 1
    VTr = CInt(Mid(Ma, 5, 2))
    TGMa = TimeSerial(Nm, VTr, 0)
 Else
    VTr = InStr(Alf, Left(Ma, 1)):         Nm = VTr + 2000
    VTr = InStr(Alf, Mid(Ma, 2, 1)):       Th = VTr - 1
    VTr = InStr(Alf, Mid(Ma, 3, 1)):       Ng = VTr - 1
    TGMa = DateSerial(Nm, Th, Ng)
 End If
End Function
 
Upvote 0
:) Bạn nên cho ví dụ 1 trường hợp cụ thể, thực tế gần sát với thao tác xử lý với form tìm kiếm này để dễ hình dung và có cái nhìn tổng thể mới dễ xử lý hơn vì nó còn liên quan nhiều thứ bẫy lỗi dữ liệu, qui trình, luồng xử lý thao tác trên Form ...
Chẳng hạn như tôi thường dùng Form này như 1 form danh sách (ds khách hàng, ds phiếu nhập, xuất ...), sau khi tìm kiếm sẽ click chọn record tìm thấy -> mở form chi tiết tương ứng record đó để chỉnh sửa.
Nếu có file dữ liệu mẫu thực tế nào đó tốt, khỏi mất công tự tạo để test :)

Như thế này đi anh, bây giờ mình phải thêm code như thế nào anh.

GPE listbox.png
 

File đính kèm

  • TimKiemListBox_nhieuCot_FormatColumn.xlsm
    52.1 KB · Đọc: 41
Upvote 0
Form tìm kiếm listbox thì diễn đàn cũng có nhiều bài rồi nhưng nó nằm chung trong các bài hỏi của thành viên nên tìm cũng mệt :). Vừa làm vừa học nên tôi tạo cái post này cho dễ tìm kiếm và nhờ các anh em giúp cải thiện cái form này cho chạy trơn tru và thuận tiện nhé.
- Form dùng tìm kiếm theo nhiều cột trong listbox. Chỉ cần gõ ký tự chuỗi bất kỳ, nó sẽ tìm trong tất cả các cột để lấy ra dòng có chứa chuỗi.
- Viết dạng hàm để có thể gọi sử dụng lại ở nhiều form.

Điểm chưa làm được:
- Chưa định dạng được dữ liệu hiển thị từng cột trong listbox (dùng mảng gán row source cho listbox). Cụ thể trong demo là cột [Đơn giá]: không có định dạng số (dấu cách phần ngàn .000).
- Chưa tuỳ chọn Sort dữ liệu tự động (theo cột đã chọn) trong listbox sau khi tìm kiếm (có tham khảo mấy hàm bubble sort trên mạng nhưng tích hợp vô).

Bạn nào chỉ cần tìm kiếm dữ liệu thì tôi nghĩ form này đáp ứng yêu cầu. :)
Các bạn hỗ trợ bổ sung thiết kế giùm nhé. File đính kèm bên dưới.
Cảm ơn.
Chào anh, nhờ anh hướng dẫn giúp em chỉnh sửa lại code nếu số dòng và số cột của em khác với file của anh
Vùng dữ liệu A7:I2000, các cột địng dạng số là :E,F,G,H => thì phải chỉnh sửa thế nào ạ
Cảm ơn anh
 
Upvote 0
Chào anh, nhờ anh hướng dẫn giúp em chỉnh sửa lại code nếu số dòng và số cột của em khác với file của anh
Vùng dữ liệu A7:I2000, các cột địng dạng số là :E,F,G,H => thì phải chỉnh sửa thế nào ạ
Cảm ơn anh

- Sửa vùng dữ liệu: Vô Userform "frmSearch", bạn kiếm cái Sub "ganSourceListbox", khai báo Range ("A2") --> "A7"

Mã:
Set oRngLstBx1 = Range(Range("A2"), Range("A2").End(xlDown).End(xlToRight))

- Sửa định dạng cột: kiếm sub "Userform_Initialize", kiếm dòng code bên dưới và thêm 3 dòng cho các cột F,G,H

Mã:
With Me.lstDanhSachVPP
        For lngIndex = 0 To .ListCount - 1
            .List(lngIndex, 4) = (Format(Val(.List(lngIndex, 4)), "$#,##0.00")) 'Cot E
            .List(lngIndex, 5) = (Format(Val(.List(lngIndex, 5)), "#,##0.00"))  'Cot F
            .List(lngIndex, 6) = (Format(Val(.List(lngIndex, 6)), "#,##0.00"))  'Cot G
            .List(lngIndex, 7) = (Format(Val(.List(lngIndex, 7)), "#,##0.00"))  'Cot H
        Next
    End With
 
Upvote 0
- Sửa vùng dữ liệu: Vô Userform "frmSearch", bạn kiếm cái Sub "ganSourceListbox", khai báo Range ("A2") --> "A7"

Mã:
Set oRngLstBx1 = Range(Range("A2"), Range("A2").End(xlDown).End(xlToRight))

- Sửa định dạng cột: kiếm sub "Userform_Initialize", kiếm dòng code bên dưới và thêm 3 dòng cho các cột F,G,H

Mã:
With Me.lstDanhSachVPP
        For lngIndex = 0 To .ListCount - 1
            .List(lngIndex, 4) = (Format(Val(.List(lngIndex, 4)), "$#,##0.00")) 'Cot E
            .List(lngIndex, 5) = (Format(Val(.List(lngIndex, 5)), "#,##0.00"))  'Cot F
            .List(lngIndex, 6) = (Format(Val(.List(lngIndex, 6)), "#,##0.00"))  'Cot G
            .List(lngIndex, 7) = (Format(Val(.List(lngIndex, 7)), "#,##0.00"))  'Cot H
        Next
    End With
Em cám ơn anh đã hỗ trợ.
-Em đã làm được dữ liệu được gán vào ListBox nhưng khi gõ ký tự ở TextBox thì nó không hoạt động
-Trường hợp em muốn tìm kiếm theo sheet chỉ định thì phải làm thế nào ạ.
Rất mong anh hỗ trợ thêm do file này của công ty nên em không thể đính kèm lên diễn đàn được
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom