Hỏi. Cách tạo một form tìm kiếm dữ liệu trong một bảng

Liên hệ QC

toantinhte87

Thành viên chính thức
Tham gia
2/3/14
Bài viết
62
Được thích
3
Mình có một bảng excel và một form. Trong form có 1 ô để nhập từ khóa tìm kiến. Kết quả tìm kiếm được hiện theo danh sách trong form. khi ra chọn vào dòng nào đó trong danh sách tìm kiếm được thì trả về kết quả tại 3 ô tương ứng. mình ó form kèm theo. Nhờ giúp đỡ ạ
 

File đính kèm

  • FORM TIM KIEM.xlsm
    21.4 KB · Đọc: 72
Bạn lập danh sách gì mà hơn 300 người toàn họ Nguyễn hết vậy?
Cũng định bỏ thời gian vì bạn, nhưng nhìn dữ liệu vậy thấy mà nản
 
Upvote 0
File này không dành cho chủ đã đăng bài
 

File đính kèm

  • Form.rar
    37.9 KB · Đọc: 132
Upvote 0
Còn đây là macro trợ giúp ta tìm theo 1 trong hai hướng: Khi biết họ (& đệm) hay tên của nhân viên trong danh sách
Ví dụ:
(1) Tìm theo tên: Bạn tự thử tìm với nhân viên (NV) có tên 'Đan' sẽ ra số TT của người này là 424
(2.1) Nếu tìm danh sách NV có họ 'Nguyễn' ta nhận được 6 kết quả
(2.2) Nếu nhập vô TextBox chuỗi "Nguyễn Đan', ta sẽ nhận được kết quả như ở (1)
PHP:
Private Sub CmdTim_Click()
 Dim StrC As String:                        Dim Arr()
 Dim Rws As Long, J As Long, W As Integer, Col As Byte, DD As Byte  '1'

 With Sheets("CSDL")
    Arr() = .[b2].CurrentRegion.Offset(1).Value
    ReDim dArr(1 To 99, 1 To 3)
    .[aa2].Resize(99, 3).Value = dArr()
 End With
 If Left(Me!cbHT.Text, 1) = "T" Then
    StrC = " " & Me!tbHT.Text
 ElseIf Left(Me!cbHT.Text, 1) = "H" Then
    StrC = Me!tbHT.Text & " "
 End If
 DD = Len(StrC)                              '5'
 For J = 1 To UBound(Arr())
9    If (Left(Me!cbHT.Text, 1) = "T" And Right(Arr(J, 2), DD) = StrC) Or _
        (Left(Me!cbHT.Text, 1) = "H" And Left(Arr(J, 2), DD) = StrC) Then
        W = W + 1
        For Col = 1 To 3
            dArr(W, Col) = Arr(J, Col)
        Next Col
    End If
 Next J
 If W Then
    Sheets("CSDL").[aa2].Resize(W, 3).Value = dArr()
 Else
    MsgBox "Nothing"
 End If
End Sub

(Câu lệnh đổi đã được ghi số trong macro)
 
Lần chỉnh sửa cuối:
Upvote 0
Còn đây là macro trợ giúp ta tìm theo 1 trong hai hướng: Khi biết họ (& đệm) hay tên của nhân viên trong danh sách
Ví dụ:
(1) Tìm theo tên: Bạn tự thử tìm với nhân viên (NV) có tên 'Đan' sẽ ra số TT của người này là 424
(2.1) Nếu tìm danh sách NV có họ 'Nguyễn' ta nhận được 6 kết quả
(2.2) Nếu nhập vô TextBox chuỗi "Nguyễn Đan', ta sẽ nhận được kết quả như ở (1)
PHP:
Private Sub CmdTim_Click()
 Dim StrC As String:                        Dim Arr()
 Dim Rws As Long, J As Long, W As Integer, Col As Byte, DD As Byte  '1'

 With Sheets("CSDL")
    Arr() = .[b2].CurrentRegion.Offset(1).Value
    ReDim dArr(1 To 99, 1 To 3)
    .[aa2].Resize(99, 3).Value = dArr()
 End With
 If Left(Me!cbHT.Text, 1) = "T" Then
    StrC = " " & Me!tbHT.Text
 ElseIf Left(Me!cbHT.Text, 1) = "H" Then
    StrC = Me!tbHT.Text & " "
 End If
 DD = Len(StrC)                              '5'
 For J = 1 To UBound(Arr())
9    If (Left(Me!cbHT.Text, 1) = "T" And Right(Arr(J, 2), DD) = StrC) Or _
        (Left(Me!cbHT.Text, 1) = "H" And Left(Arr(J, 2), DD) = StrC) Then
        W = W + 1
        For Col = 1 To 3
            dArr(W, Col) = Arr(J, Col)
        Next Col
    End If
 Next J
 If W Then
    Sheets("CSDL").[aa2].Resize(W, 3).Value = dArr()
 Else
    MsgBox "Nothing"
 End If
End Sub

(Câu lệnh đổi đã được ghi số trong macro)
Anh cho em hỏi, với form của anh nếu sau khi tìm kiếm rùi, biết vị trí của họ rùi, thấy sai ( sai chính tả, ...không muốn sửa trực tiếp trên dữ liệu nguồn), thì sửa lại họ, tên người đó thì làm ntn?
 
Upvote 0
Thì làm như thế này:
Khi nhấn vô dòng nào đó trên ListBox; dòng dữ liệu đó sẽ nhảy đến 3 TextBox tương ứng fía dưới
Ta tiến hành sửa trên 2 TextBox (trừ TextBox ID về nguyên tắc không sửa)
Vẻ thêm 1 nút lệnh & viết 1 macro kèm theo nó để thực hiện việc lưu sửa chữa vừa qua.

Tất nhiên trường 'ID' đó là do của tác giả bài đăng thực hiện; Nếu là mình thì 'ID' sẽ fải khác, có tính tương tác cao hơn.

Rất vui nếu đã, đang & sẽ giúp bạn được xíu nào đó!
 
Upvote 0
Thì làm như thế này:
Khi nhấn vô dòng nào đó trên ListBox; dòng dữ liệu đó sẽ nhảy đến 3 TextBox tương ứng fía dưới
Ta tiến hành sửa trên 2 TextBox (trừ TextBox ID về nguyên tắc không sửa)
Vẻ thêm 1 nút lệnh & viết 1 macro kèm theo nó để thực hiện việc lưu sửa chữa vừa qua.

Tất nhiên trường 'ID' đó là do của tác giả bài đăng thực hiện; Nếu là mình thì 'ID' sẽ fải khác, có tính tương tác cao hơn.

Rất vui nếu đã, đang & sẽ giúp bạn được xíu nào đó!
Giả sử em tìm họ "Bùi" list box hiện ra đó, em trượt xuống người cần sửa đó, em sửa thì làm thế nào để điền lại người đó đúng "STT" trong dữ liệu nguồn ( số thứ tự của em tương đương với ID trong bài viết của bác, nên STT em không sửa mà sửa họ tên và ID được
Bác tạo nút lưu giúp em nhé
 
Upvote 0
Nguyên tắc là không thể sửa ID; Iêu cầu nhập ID fải đúng ngay từ đầu. [STT] là cái quái gì cơ chứ, . . .

Với mình trong trường [ID] fải luôn có độ dài là như nhau từ đầu đến cuối dữ liệu;
Nếu [ID] fải xài số thì bắt đầu không là con 1 hay con 0, mà fải là 10000 (cho ngàn người hay ngàn dòng vật tư, nguyên, nhiên vật liệu,. . . .)

Trong CSDL đó có mã này
PHP:
Lê Thị Mộng Thùy      LMT00
Lã Thị Như Ý          LNY31
Lê Thị Tâm Giang      LTG00
Lại Thị Tâm Như        LTN32
Lê Thị Thanh Ngân     LTN33
Lê Thị Thanh Nhã      LTN34
Lê Thị Thảo Nguyên     LTN35
Lữ Ngọc Quỳnh Anh     LQA00
Lương Ngô Quỳnh Anh   LQA15
Lương Hoài Phương Vy  LPV00
Lương Phát Tài        LPT00
Lâm Đức               LJF00
Lý Đình Đa            LFF00
. . ..      . . . .
 
Lần chỉnh sửa cuối:
Upvote 0
Xin các bạn tham khảo file này
 

File đính kèm

  • Form.rar
    43.2 KB · Đọc: 159
Upvote 0
PHP:
Private Sub CmdLuuSC_Click()
 Dim Rng As Range, sRng As Range

1  Set Rng = Range([C1], [C1].End(xlDown))
 Set sRng = Rng.Find(Me!tbMa.Value, , xlFormulas, xlWhole)
3 If sRng Is Nothing Then
    MsgBox "Nothing", , "GPE.COM Xin Thông Báo!"
5 Else
    sRng.Offset(, -2).Value = Me!tbSTT.Value
7   sRng.Offset(, -1).Value = Me!tbTen.Text
    sRng.Offset(, 1).Value = TxtToDate(Me!tbNS.Text)
 9   Me!tbSTT.Value = 0:                     Me!tbTen.Text = ""
    Me!tbNS.Text = "0":                     MsgBox "Luu Xong", , "GPE.COM Xin Chào!"
11    [AB2].CurrentRegion.Offset(1).ClearContents
 End If
End Sub
Dòng lệnh trước D1: Khai báo 2 biến đối tượng cần xài trong chương trình;
D1: (Vì Form đang mở trên trang tính chứa CSDL) nên ta gán vùng cột [C:c] có dữ liệu vô 1 biến đối tượng;
D2: Áp dụng fương thức 'tìm kiếm', dữ liệu cần tìm là ở TextBox có tên là tbMa
D3: Nếu không tìm thấy thì thực hiện lệnh kế tiếp
D4: Hiện thông báo không tìm thấy dữ liệu cần thiết;
D5: Bằng ngược lại;
D6: Thực hiện việc gán lại số thứ tự
D7: Gán lại họ & tên
D8: Gán lại ngày sinh thông qua hàm chuyển 1 chuỗi ngày-tháng sang số liệu ngày-tháng
D9: Mệnh đề trước: Xóa số liệu trong TextBox có tên là tbSTT;
Mệnh đề sau cũng là là trống dữ liệu trong TextBox có tên là tbTen
D10: Gán vô TextBox có tên là tbNS chuỗi '0'
Mệnh đề sau: Hiện hộp thoại thông báo đã thực hiện xong công việc (lưu S/C);
D11: Xóa dữ liệu nguồn của ListBox; Chuẩn bỉ cho đợt hoạt động (sắp tới) của bạn.
D12: Kết thúc điều kiện (Xem lại D3)

Những mong hữi ích với bạn ít nhiều!
 
Upvote 0
Bác sửa nút lưu cho em giống như file của bác với,
nó đang bị khi dùng text box tìm kiếm rùi mới mở khóa sửa rùi lưu lại, nó lưu sai vị trí của mã
 

File đính kèm

  • Sua nut luu khi dung text box tim kiem.xls
    261 KB · Đọc: 55
Upvote 0
Đây là cách bạn nên viết:
PHP:
Private Sub cmdSua_Click()
 Dim MSG As String
 Dim iRow As Long, i As Long, MyCtrls()

 MSG = " Ban Có Chác Chán Sua Chúng Tù Không?" & Chr(13) & "Yes De Sua, No De Huy Bo"
 If MsgBox(MSG, vbYesNo, "Thong bao!") = vbNo Then Exit Sub
    If OptionButton1.Value Then
        MyCtrls = Array(TBMaVV, TBTenVV)
    Else
        MyCtrls = Array(TBMaVV, TBTenVV, TBMST)
    End If
    Range("DM_VT1").Offset(LB.ListIndex, 6).Resize(1).Value = MyCtrls
    MsgBox "SUA XONG DL", vbExclamation, "THEO DOI DIEM", , Range("DM_VT1").Offset(LB.ListIndex, 6).Row
End Sub

Chạy macro & xem vì sao nó nạp vô chỗ chưa mong muốn; Bạn tự ên đi, mình sẽ không giúp chuyện này đâu!
 
Upvote 0
Đây là cách bạn nên viết:
PHP:
Private Sub cmdSua_Click()
 Dim MSG As String
 Dim iRow As Long, i As Long, MyCtrls()

 MSG = " Ban Có Chác Chán Sua Chúng Tù Không?" & Chr(13) & "Yes De Sua, No De Huy Bo"
 If MsgBox(MSG, vbYesNo, "Thong bao!") = vbNo Then Exit Sub
    If OptionButton1.Value Then
        MyCtrls = Array(TBMaVV, TBTenVV)
    Else
        MyCtrls = Array(TBMaVV, TBTenVV, TBMST)
    End If
    Range("DM_VT1").Offset(LB.ListIndex, 6).Resize(1).Value = MyCtrls
    MsgBox "SUA XONG DL", vbExclamation, "THEO DOI DIEM", , Range("DM_VT1").Offset(LB.ListIndex, 6).Row
End Sub

Chạy macro & xem vì sao nó nạp vô chỗ chưa mong muốn; Bạn tự ên đi, mình sẽ không giúp chuyện này đâu!
Nó bị báo vàng ở dòng cuối, anh xem giúp em với
MsgBox "SUA XONG DL", vbExclamation, "THEO DOI DIEM", , Range("DM_VT1").Offset(LB.ListIndex, 6).Row
 
Upvote 0
Còn đây là macro trợ giúp ta tìm theo 1 trong hai hướng: Khi biết họ (& đệm) hay tên của nhân viên trong danh sách
Ví dụ:
(1) Tìm theo tên: Bạn tự thử tìm với nhân viên (NV) có tên 'Đan' sẽ ra số TT của người này là 424
(2.1) Nếu tìm danh sách NV có họ 'Nguyễn' ta nhận được 6 kết quả
(2.2) Nếu nhập vô TextBox chuỗi "Nguyễn Đan', ta sẽ nhận được kết quả như ở (1)
PHP:
Private Sub CmdTim_Click()
Dim StrC As String:                        Dim Arr()
Dim Rws As Long, J As Long, W As Integer, Col As Byte, DD As Byte  '1'

With Sheets("CSDL")
    Arr() = .[b2].CurrentRegion.Offset(1).Value
    ReDim dArr(1 To 99, 1 To 3)
    .[aa2].Resize(99, 3).Value = dArr()
End With
If Left(Me!cbHT.Text, 1) = "T" Then
    StrC = " " & Me!tbHT.Text
ElseIf Left(Me!cbHT.Text, 1) = "H" Then
    StrC = Me!tbHT.Text & " "
End If
DD = Len(StrC)                              '5'
For J = 1 To UBound(Arr())
9    If (Left(Me!cbHT.Text, 1) = "T" And Right(Arr(J, 2), DD) = StrC) Or _
        (Left(Me!cbHT.Text, 1) = "H" And Left(Arr(J, 2), DD) = StrC) Then
        W = W + 1
        For Col = 1 To 3
            dArr(W, Col) = Arr(J, Col)
        Next Col
    End If
Next J
If W Then
    Sheets("CSDL").[aa2].Resize(W, 3).Value = dArr()
Else
    MsgBox "Nothing"
End If
End Sub

(Câu lệnh đổi đã được ghi số trong macro)
Bạn có thể giải thích rõ tên của các biến StrC, J, W, Rws, T, H. mình ko hiểu
 
Upvote 0
Tham biến StrC là biến sẽ mang kiểu dữ liệu chuỗi (String)
Để gán trị vô tham biến này trong macro có dòng lệnh
StrC = Me!tbHT.Text & " "
(Có nghĩa là lấy nội dung trong TextBox (có tên là) tbHT đem gán vô
Tham biến Rws là tham biến sẽ chứa số liệu kiều Long; Tham biến J dùng để đếm số dòng dữ liệu (chứa trong mảng Arr())
. . . . . . [Tạm thời là vậy, nếu vẫn chưa hiểu ra bạn cần cố thêm 1 cách tự thân]
 
Upvote 0
Web KT

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

Back
Top Bottom