Cập nhật dữ liệu từ Listbox sang texbox

Liên hệ QC

xuantamc6

Thành viên hoạt động
Tham gia
18/11/13
Bài viết
157
Được thích
59
Kính chào các Thầy, các anh/ chị.
Hôm nay em xin nhờ mọi người hỗ trợ giúp em vấn đề chuyển dữ liệu từ listbox sang texbox. Chi tiết em xin được đính kèm file và dẫn giải như sau ạ.
Tại sheet "HOME" em có phần "NHẬP THÔNG TIN KH", Trên Userform1 này, có trường tìm kiếm theo tên khách hàng hoặc mình có thể "SHOW DSKH", khi đó dữ liệu sẽ hiện ra tại phần listbox. Và lúc này ta có thể click vào 1 trong các dòng trên listbox đó để trả dữ liệu lại texbox nhưng vấn đề mà em đang gặp phải ở đây đó là: một khách hàng có mã khách hàng được lặp đi lặp lại nhiều lần nhưng những thông tin về sau (ví dụ như địa chỉ, người liên hệ...) thì lại khác, khi ta click vào 1 trong những dòng thông tin tại Listbox thì nó chỉ trả về dữ liệu của lần đầu tiên chứ nó không hiện ra những dự liệu phía sau đó.
Mong các thầy các anh/ chị giúp đỡ
Trân trọng cám ơn!
 

File đính kèm

Kính chào các Thầy, các anh/ chị.
Hôm nay em xin nhờ mọi người hỗ trợ giúp em vấn đề chuyển dữ liệu từ listbox sang texbox. Chi tiết em xin được đính kèm file và dẫn giải như sau ạ.
Tại sheet "HOME" em có phần "NHẬP THÔNG TIN KH", Trên Userform1 này, có trường tìm kiếm theo tên khách hàng hoặc mình có thể "SHOW DSKH", khi đó dữ liệu sẽ hiện ra tại phần listbox. Và lúc này ta có thể click vào 1 trong các dòng trên listbox đó để trả dữ liệu lại texbox nhưng vấn đề mà em đang gặp phải ở đây đó là: một khách hàng có mã khách hàng được lặp đi lặp lại nhiều lần nhưng những thông tin về sau (ví dụ như địa chỉ, người liên hệ...) thì lại khác, khi ta click vào 1 trong những dòng thông tin tại Listbox thì nó chỉ trả về dữ liệu của lần đầu tiên chứ nó không hiện ra những dự liệu phía sau đó.
Mong các thầy các anh/ chị giúp đỡ
Trân trọng cám ơn!
Thì rõ ràng code bạn viết nó lấy giá trị đầu tiên mà.Khi hàm Find trả về giá trị kết quả bạn lấy ngay giá trị đầu tiên của kết quả đó.Nếu muốn lấy các giá trị khác bạn nên xét thêm điều kiện để lấy.Ví dụ như những cái mà không giống nhau đó.
 
Upvote 0
Cần hiễn thị 1 dòng trên ListBox thì cần TextBox; Nếu cần hiễn thị nhiều dòng DL của nó thì nên xài thêm 1 ListBox nữa thay cho TextBox

Nếu là mình thì mình xài bộ mã như sau:

Mã KHTên KHĐịa chỉSố điện thoạiSinh nhậtEmail
FFD00ĐỖ ĐÌNH DƯƠNG
111111​
FFD00ĐỖ ĐÌNH DƯƠNG
111112​
FFD00ĐỖ ĐÌNH DƯƠNG
111113​
FFD00ĐỖ ĐÌNH DƯƠNG
111114​
FFD00ĐỖ ĐÌNH DƯƠNG
111115​
DFF00DƯƠNG ĐÌNH ĐẮC
222221​
DFF00DƯƠNG ĐÌNH ĐẮC
222222​
DFF00DƯƠNG ĐÌNH ĐẮC
222223​
DFF00DƯƠNG ĐÌNH ĐẮC
222224​
DFF00DƯƠNG ĐÌNH ĐẮC
222225​
NDF00NGÔ DUY ĐÔNG
333331​
NDF00NGÔ DUY ĐÔNG
333332​
NDF00NGÔ DUY ĐÔNG
333333​
NDF00NGÔ DUY ĐÔNG
333334​
NDF01NG. DUY ĐÔNG
633335​
NDF01NG. DUY ĐÔNG
633336​
NHN00NGUYỄN THỊ HỒNG NGA
444441​
NHN00NGUYỄN THỊ HỒNG NGA
444442​
NHN00NGUYỄN THỊ HỒNG NGA
444443​
NHN01NGUYỄN HỒNG NGA
544444​
NHN01NGUYỄN HỒNG NGA
544445​
TJL00TRẦN LÊ
TJL00TRẦN LÊ
TJL00TRẦN LÊ
TJL00TRẦN LÊ
TJL00TRẦN LÊ
 
Lần chỉnh sửa cuối:
Upvote 0
Thì rõ ràng code bạn viết nó lấy giá trị đầu tiên mà.Khi hàm Find trả về giá trị kết quả bạn lấy ngay giá trị đầu tiên của kết quả đó.Nếu muốn lấy các giá trị khác bạn nên xét thêm điều kiện để lấy.Ví dụ như những cái mà không giống nhau đó.
Dạ để em mò mẫm xem như thế nào ạ.
Bài đã được tự động gộp:

Cần hiễn thị 1 dòng trên ListBox thì cần TextBox; Nếu cần hiễn thị nhiều dòng DL của nó thì nên xài thêm 1 ListBox nữa thay cho TextBox

Nếu là mình thì mình xài bộ mã như sau:

Mã KHTên KHĐịa chỉSố điện thoạiSinh nhậtEmail
FFD00ĐỖ ĐÌNH DƯƠNG
111111​
FFD00ĐỖ ĐÌNH DƯƠNG
111112​
FFD00ĐỖ ĐÌNH DƯƠNG
111113​
FFD00ĐỖ ĐÌNH DƯƠNG
111114​
FFD00ĐỖ ĐÌNH DƯƠNG
111115​
DFF00DƯƠNG ĐÌNH ĐẮC
222221​
DFF00DƯƠNG ĐÌNH ĐẮC
222222​
DFF00DƯƠNG ĐÌNH ĐẮC
222223​
DFF00DƯƠNG ĐÌNH ĐẮC
222224​
DFF00DƯƠNG ĐÌNH ĐẮC
222225​
NDF00NGÔ DUY ĐÔNG
333331​
NDF00NGÔ DUY ĐÔNG
333332​
NDF00NGÔ DUY ĐÔNG
333333​
NDF00NGÔ DUY ĐÔNG
333334​
NDF00NGÔ DUY ĐÔNG
333335​
NDF00NGÔ DUY ĐÔNG
333336​
NHN00NGUYỄN THỊ HỒNG NGA
444441​
NHN00NGUYỄN THỊ HỒNG NGA
444442​
NHN00NGUYỄN THỊ HỒNG NGA
444443​
NHN00NGUYỄN THỊ HỒNG NGA
444444​
NHN00NGUYỄN THỊ HỒNG NGA
444445​
TJL00TRẦN LÊ
TJL00TRẦN LÊ
TJL00TRẦN LÊ
TJL00TRẦN LÊ
TJL00TRẦN LÊ

Dạ bộ mã là của hệ thống phần mềm cty nó tự chạy thầy ạ.
 
Upvote 0
Dạ bộ mã là của hệ thống phần mềm cty nó tự chạy ạ.
Là mình thì mình thêm 1 cột (trường) nữa cho công việc của mình được tiện thêm trong việc giao tiếp với danh sách khách hàng trong CSDL

Nói rõ thêm: Khi đó ta chỉ việc nhập 3 kí tự phần đặc tính của mã vô TextBox tìm kiếm là trong ListBox chỉ cho ta danh sách những mã có cùng phần đặc tính này mà thôi!
 
Upvote 0
Là mình thì mình thêm 1 cột (trường) nữa cho công việc của mình được tiện thêm trong việc giao tiếp với danh sách khách hàng trong CSDL

Nói rõ thêm: Khi đó ta chỉ việc nhập 3 kí tự phần đặc tính của mã vô TextBox tìm kiếm là trong ListBox chỉ cho ta danh sách những mã có cùng phần đặc tính này mà thôi!
Dạ, do liên quan đến sự tương tác. Khi em gửi file này qua bộ phận khác nta vẫn có thể tìm kiếm trên hệ thống phần mềm của ngân hàng. Trong trường hợp không thể thay đổi mã Kh mình có thể giải quyết bằng cách nào khác không ạ?
 
Upvote 0
Dạ, do liên quan đến sự tương tác. Khi em gửi file này qua bộ phận khác nta vẫn có thể tìm kiếm trên hệ thống phần mềm của ngân hàng. Trong trường hợp không thể thay đổi mã Kh mình có thể giải quyết bằng cách nào khác không ạ?
Có không dùng Find nữa dùng mảng mà duyệt lấy giá trị.
 
Upvote 0
Có không dùng Find nữa dùng mảng mà duyệt lấy giá trị.
Dùng FindNext cũng sẽ có thể lấy hết các dòng giá trị trùng cần thiết; Chỉ co điều là lấy xong cất vô đâu & sau đó hiện lên đâu mà thôi!
Tất nhiên xài FindNext chậm & không 'hàn lâm' hơn là điều chắc chắn :D
. . . . Trong trường hợp không thể thay đổi mã Kh mình có thể giải quyết bằng cách nào khác không ạ?
Mình không iêu cầu bạn bỏ mã KH cũ, chỉ là thêm 1 cột mã cho riêng mình xài mà thôi!
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ nhờ mọi người hướng dẫn giúp em với ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Không phải thêm Mã gì cả.

Tất cả các Sub có ở dưới đây phải thay thế cho những Sub cũ tương ứng
Mã:
Private Sub UserForm_Initialize()
    With UserForm1
        .LISTKH.ColumnCount = 8
        .LISTKH.ColumnWidths = ("50,120,180,60,60,100,100,120")
    End With
End Sub

Private Sub TIMKIEM_change()
    RC1 = Sheets("THONGTINKH").Cells(10000, "B").End(xlUp).Row
    LISTKH.Clear
    If TIMKIEM <> "" Then
        For r = 3 To RC1
            If InStr(Sheets("THONGTINKH").Cells(r, 3), (TIMKIEM)) > 0 Or InStr(Sheets("THONGTINKH").Cells(r, 3), LCase(TIMKIEM)) > 0 Then
                LISTKH.AddItem Sheets("THONGTINKH").Cells(r, 2).Value
                LISTKH.List(LISTKH.ListCount - 1, 1) = Sheets("THONGTINKH").Cells(r, 3).Value
                LISTKH.List(LISTKH.ListCount - 1, 2) = Sheets("THONGTINKH").Cells(r, 4).Value
                LISTKH.List(LISTKH.ListCount - 1, 3) = Sheets("THONGTINKH").Cells(r, 5).Value
                LISTKH.List(LISTKH.ListCount - 1, 4) = Sheets("THONGTINKH").Cells(r, 6).Value
                LISTKH.List(LISTKH.ListCount - 1, 5) = Sheets("THONGTINKH").Cells(r, 7).Value
                LISTKH.List(LISTKH.ListCount - 1, 6) = Sheets("THONGTINKH").Cells(r, 8).Value
                LISTKH.List(LISTKH.ListCount - 1, 7) = Sheets("THONGTINKH").Cells(r, 9).Value
                LISTKH.List(LISTKH.ListCount - 1, 8) = r
            End If
        Next
    End If
End Sub

Private Sub SHOW_Click()
Dim Rng(), lastRow As Long, i As Long
    lastRow = Worksheets("THONGTINKH").Range("B65536").End(xlUp).Row
    Rng = Worksheets("THONGTINKH").Range("B3:I" & lastRow).Value
    ReDim Preserve Rng(1 To UBound(Rng), 1 To 9)
    For i = 1 To UBound(Rng)
        Rng(i, 9) = i + 2
    Next i
    LISTKH.List = Rng
End Sub

Private Sub LISTKH_Click()
    If LISTKH.ListCount = -1 Then Exit Sub
    MKH = LISTKH.List(LISTKH.ListIndex, 0)
    MKH_AfterUpdate
    NHAPDULIEU.Enabled = False
    CAPNHAT.Enabled = True
    TKH.SetFocus
End Sub

Private Sub MKH_AfterUpdate()
Dim curr_row As Long, Cl As Range
    If LISTKH.ListIndex = -1 Then Exit Sub
    curr_row = LISTKH.List(LISTKH.ListIndex, 8)
    Set Cl = Sheet2.Cells(curr_row, "B")
    With Cl
        TKH = .Offset(, 1)
        TTDC = .Offset(, 2)
        SDT = .Offset(, 3)
        SN = Format(.Offset(, 4), "dd/mm/yyyy")
        EMAIL = .Offset(, 5)
        CVCD = .Offset(, 6)
        NLH = .Offset(, 7)
        TKTT = .Offset(, 8)
        TKV = .Offset(, 9)
        STV = .Offset(, 10)
        THV = .Offset(, 11)
        SPV = .Offset(, 12)
        SHDTD = .Offset(, 13)
        NHDTD = .Offset(, 14)
        '            With .Offset(0, 14)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.NHDTD.Text)
        '            End With
        SHDTC = .Offset(, 15)
        NHDTC = .Offset(, 16)
        '            With .Offset(0, 16)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.NHDTC.Text)
        '            End With
        MTSDB = .Offset(, 17)
        GTTSDB = .Offset(, 18)
        DT = .Offset(, 19)
        DCTSDB = .Offset(, 20)
        NGN = .Offset(, 21)
        '            With .Offset(0, 21)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.NGN.Text)
        '            End With
        NTN = .Offset(, 22)
        '            With .Offset(0, 22)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.NTN.Text)
        '            End With
        GIAYDIDUONG = .Offset(, 23)
        '            With .Offset(0, 23)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.GIAYDIDUONG.Text)
        '            End With
        GC = .Offset(, 24)
    End With
End Sub
 
Upvote 0
Không phải thêm Mã gì cả.

Tất cả các Sub có ở dưới đây phải thay thế cho những Sub cũ tương ứng
Mã:
Private Sub UserForm_Initialize()
    With UserForm1
        .LISTKH.ColumnCount = 8
        .LISTKH.ColumnWidths = ("50,120,180,60,60,100,100,120")
    End With
End Sub

Private Sub TIMKIEM_change()
    RC1 = Sheets("THONGTINKH").Cells(10000, "B").End(xlUp).Row
    LISTKH.Clear
    If TIMKIEM <> "" Then
        For r = 3 To RC1
            If InStr(Sheets("THONGTINKH").Cells(r, 3), (TIMKIEM)) > 0 Or InStr(Sheets("THONGTINKH").Cells(r, 3), LCase(TIMKIEM)) > 0 Then
                LISTKH.AddItem Sheets("THONGTINKH").Cells(r, 2).Value
                LISTKH.List(LISTKH.ListCount - 1, 1) = Sheets("THONGTINKH").Cells(r, 3).Value
                LISTKH.List(LISTKH.ListCount - 1, 2) = Sheets("THONGTINKH").Cells(r, 4).Value
                LISTKH.List(LISTKH.ListCount - 1, 3) = Sheets("THONGTINKH").Cells(r, 5).Value
                LISTKH.List(LISTKH.ListCount - 1, 4) = Sheets("THONGTINKH").Cells(r, 6).Value
                LISTKH.List(LISTKH.ListCount - 1, 5) = Sheets("THONGTINKH").Cells(r, 7).Value
                LISTKH.List(LISTKH.ListCount - 1, 6) = Sheets("THONGTINKH").Cells(r, 8).Value
                LISTKH.List(LISTKH.ListCount - 1, 7) = Sheets("THONGTINKH").Cells(r, 9).Value
                LISTKH.List(LISTKH.ListCount - 1, 8) = r
            End If
        Next
    End If
End Sub

Private Sub SHOW_Click()
Dim Rng(), lastRow As Long, i As Long
    lastRow = Worksheets("THONGTINKH").Range("B65536").End(xlUp).Row
    Rng = Worksheets("THONGTINKH").Range("B3:I" & lastRow).Value
    ReDim Preserve Rng(1 To UBound(Rng), 1 To 9)
    For i = 1 To UBound(Rng)
        Rng(i, 9) = i + 2
    Next i
    LISTKH.List = Rng
End Sub

Private Sub LISTKH_Click()
    If LISTKH.ListCount = -1 Then Exit Sub
    MKH = LISTKH.List(LISTKH.ListIndex, 0)
    MKH_AfterUpdate
    NHAPDULIEU.Enabled = False
    CAPNHAT.Enabled = True
    TKH.SetFocus
End Sub

Private Sub MKH_AfterUpdate()
Dim curr_row As Long, Cl As Range
    If LISTKH.ListIndex = -1 Then Exit Sub
    curr_row = LISTKH.List(LISTKH.ListIndex, 8)
    Set Cl = Sheet2.Cells(curr_row, "B")
    With Cl
        TKH = .Offset(, 1)
        TTDC = .Offset(, 2)
        SDT = .Offset(, 3)
        SN = Format(.Offset(, 4), "dd/mm/yyyy")
        EMAIL = .Offset(, 5)
        CVCD = .Offset(, 6)
        NLH = .Offset(, 7)
        TKTT = .Offset(, 8)
        TKV = .Offset(, 9)
        STV = .Offset(, 10)
        THV = .Offset(, 11)
        SPV = .Offset(, 12)
        SHDTD = .Offset(, 13)
        NHDTD = .Offset(, 14)
        '            With .Offset(0, 14)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.NHDTD.Text)
        '            End With
        SHDTC = .Offset(, 15)
        NHDTC = .Offset(, 16)
        '            With .Offset(0, 16)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.NHDTC.Text)
        '            End With
        MTSDB = .Offset(, 17)
        GTTSDB = .Offset(, 18)
        DT = .Offset(, 19)
        DCTSDB = .Offset(, 20)
        NGN = .Offset(, 21)
        '            With .Offset(0, 21)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.NGN.Text)
        '            End With
        NTN = .Offset(, 22)
        '            With .Offset(0, 22)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.NTN.Text)
        '            End With
        GIAYDIDUONG = .Offset(, 23)
        '            With .Offset(0, 23)
        '                .NumberFormat = "dd/mm/yyyy"
        '                .Value = DMYtoDate(Me.GIAYDIDUONG.Text)
        '            End With
        GC = .Offset(, 24)
    End With
End Sub
Dạ em xin cám ơn ạ
Nhờ anh có thể xem thêm giúp em sub CAPNHAT với được không ạ
 
Upvote 0
Dạ em xin cám ơn ạ
Nhờ anh có thể xem thêm giúp em sub CAPNHAT với được không ạ
Tôi sẽ không xem giúp bất cứ cái gì nữa. Tôi trả lời cho vấn đề cụ thể ở bài #1. Nếu làm nhiều thứ thì phải viết ngay trong bài #1. Lúc đó ai muốn thì làm. Không có chuyện người ta thấy có 1 vấn đề nên xung phong, rồi sau đó lại nhờ tiếp. Làm tiếp thì có thể không thích vì người ta không dự kiến là sẽ tham gia vào chuyện rất mất thời gian, mà từ chối thì có nhiều người không hài lòng.

1. Tôi đề nghị đổi tên Private Sub MKH_AfterUpdate() thành Private Sub WriteTextBoxes()

2. Trong Sub LISTKH_Click
sửa
Mã:
MKH_AfterUpdate
thành
Mã:
WriteTextBoxes

3. Bạn không nói nên tôi đoán cách hoạt động như sau: Khi chọn mục trong ListBox thì dữ liệu liên quan tới mục được chọn sẽ được nhập từ sheet THONGTINKH vào các TextBox. Sau khi chỉnh sửa ở các TextBox và nhấn CAPNHAT thì dữ liệu từ các TextBox sẽ làm mới trên sheet và trong cả ListBox ở mục đang được chọn. Mục đích để ListBox phản ánh đúng thực trạng trên sheet sau khi cập nhật.

Nếu tôi hiểu sai thì nhớ lần sau phải mô tả kỹ.

Code không sử dụng tới biến toàn cục sRow.

Khuya rồi nên tôi có thể nhầm lẫn. Bạn tự kiểm tra kỹ.

Mã:
Private Sub CAPNHAT_Click()
Dim curr_row As Long, j As Integer, Cont
    If LISTKH.ListIndex = -1 Then Exit Sub
    curr_row = LISTKH.List(LISTKH.ListIndex, 8)
    With UserForm1
        If .MKH = "" Or .TKH = "" Then Exit Sub
        For j = 1 To 25
            Cont = Choose(j, .MKH.Text, .TKH.Text, .TTDC.Text, .SDT.Text, .SN.Value, .EMAIL.Text, .CVCD.Text, .NLH.Text, .TKTT.Text, .TKV.Text, .STV.Text, .THV.Text, .SPV.Text, .SHDTD.Text, .NHDTD.Value, .SHDTC.Text, .NHDTC.Value, .MTSDB.Text, .GTTSDB.Text, .DT.Text, .DCTSDB.Text, .NGN.Value, .NTN.Value, .GIAYDIDUONG.Text, .GC.Text)
            Worksheets("THONGTINKH").Cells(curr_row, j + 1) = Cont
'            lam moi du lieu trong ListBox o dong duoc chon va chinh sua
            If j <= 8 Then LISTKH.List(LISTKH.ListIndex, j - 1) = Cont
        Next j
    End With
'    bo chon muc trong ListBox
    LISTKH.ListIndex = -1
'    For i = 3 To EnRow
'        Cells(i, 11).NumberFormat = "dd/mm/yyyy"
'    Next i
    
    MsgBox "CAP NHAT XONG"
    NHAPTHONGTINKHAC_Click
    CAPNHAT.Enabled = False
    NHAPDULIEU.Enabled = True
End Sub
 
Upvote 0
Code anh viết đã khắc phục được điều em muốn thực hiện rồi.
Dạ em chân thành xin lỗi và cám ơn anh nhiều ạ
 
Upvote 0
Web KT

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

Back
Top Bottom