Đây là bài tập của mình về tìm kiếm trong vba.
Mình viết xong rồi nhưng chức năng tìm kiếm trong code này chưa được hoàn chỉnh
1...Phải gõ đầy đủ tên họ đúng mới ra kết quả
2...Code Không xử lý được hai tên trùng nhau ví dụ : nguyễn văn A và nguyễn thị A
các bạn giúp mình giải quyết 2 vấn đề này nhé ?? Làm sao gõ 1 chữ trong ô tìm kiếm tên nó sổ ra những chữ có liên quan giống như thanh tìm kiếm trên google đó ạ ???
Viết giúp mình thêm chức năng sửa và xóa khi đã tìm kiếm xong ạ
Cảm ơn các bạn
1...Phải gõ đầy đủ tên họ đúng mới ra kết quả
2...Code Không xử lý được hai tên trùng nhau ví dụ : nguyễn văn A và nguyễn thị A
các bạn giúp mình giải quyết 2 vấn đề này nhé ?? Làm sao gõ 1 chữ trong ô tìm kiếm tên nó (3) sổ ra những chữ có liên quan giống như thanh tìm kiếm trên google đó ạ ???
(1) Trong phương thức nói trên có 2 hướng tìm, là tìm theo nguyên mẫu & tìm theo phần của nhóm từ (Whole & Part)
(2) Trong trường hợp xài vòng lặp như bạn thì phải có phương tiện nào đó lưu dần các kết quả quá trình tìm kiếm của bạn để cuối chu trình ta có thể ngắm nghía kết quả của công cuộc!
(3) 'sổ ra' theo ý bạn là như thế nào
Nếu 'sổ ra' bằng MsgBox thì ta phải khai báo 1 tham biến lưu (những) kết quả tìm thấy & 'sổ ra' ở cuối quá trình.
(4) Ai hướng bạn viết VBA theo kiểu cách đó vậy; Cách mà mình gọi là viết quá 'Hàn lâm' & vô bổ
Nói vô bổ ở chỗ:
(*) Bạn bỏ nhiều dòng trống (trắng) trong các macro 1 cách không cần thiết; Nếu là mình thì chỉ bỏ 1 (hay vài) dòng trống theo từng nhóm lệnh cách nhau để sau này tiện trong bảo trì hay sửa đổi mà thôi;
Sao bạn lại bỏ trống 4 dòng trong trường hợp này vậy & mục đích thực sự là gì:
Nếu là mình thì các dòng lệnh trong 1 Sub chí ít là nằm hết trên 1 màn hình vi tính để dễ quan sát toàn thể các dòng của đứa con tinh thần của mình; Mục tiêu là dễ bề xoay sở trong mọi tình huống từ nay về sau.
(*) Khai báo tham biến của bạn chưa thật sự tường minh về kiểu dữ liệu
Lợi vài giây gõ chữ nhưng macro lần nào được kêu làm việc là bỏ ra 1 khoảng thời gian & bộ nhớ tiêu tốn 1 cách vô bổ cho hành vi tác trách của bạn.
& cuối cùng là xin lỗi bạn trước vì những lời khó nghe của mình!
PHP:
Private Sub lbDS_Click()
ReDim ArrC(1 To 13, 1 To 6)
Dim Rng As Range, sRng As Range, Sh As Worksheet
Dim W As Integer, Rws As Long
Dim MyAdd As String
lbID = 1 + Me!lbDS.ListIndex
1 'Hiên Trên ListBox Các Nhân Viên Cùng Ho Mã '
Me!tbMaNV.Text = Arr(lbID, 1): Me!tbHT.Text = Arr(lbID, 2)
Me!tbNS.Value = Arr(lbID, 3): Me!cbFT.Text = Arr(lbID, 4)
Me!cbDT.Text = Arr(lbID, 5): Me!cbTG.Text = Arr(lbID, 6)
Me!tbQQ.Text = Arr(lbID, 7): Me!tbNCN.Text = Arr(lbID, 8)
Me!tbTF.Text = Arr(lbID, 9): Me!tbVH.Value = Arr(lbID, 10)
Me!tbCC.Value = Arr(lbID, 11)
2 'Hiên Danh Sách Chi Tiêt '
Set Sh = ThisWorkbook.Worksheets("QuanHe")
ArrC(1, 2) = "Nothing"
Rws = Sh.[b1].CurrentRegion.Rows.Count
Set Rng = Sh.[b1].Resize(Rws)
Set sRng = Rng.Find(Me!tbMaNV.Text, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
W = W + 1: ArrC(W, 1) = W
ArrC(W, 2) = sRng.Offset(, 1).Value
ArrC(W, 3) = sRng.Offset(, 2).Value
ArrC(W, 4) = sRng.Offset(, 3).Value
ArrC(W, 5) = sRng.Offset(, 4).Value
ArrC(W, 6) = sRng.Offset(, 5).Value
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
Me!lbCT.List = ArrC()
End Sub
mình vẫn không hiểu ?
ý mình là tìm tên rồi nó hiện lên đó ạ ??? dòng code của bạn mình không hiểu lắm
ví dụ: mình gõ chữ B bấm nút tìm nó sẽ hiện ra những bạn có tên B
(1) Trong phương thức nói trên có 2 hướng tìm, là tìm theo nguyên mẫu & tìm theo phần của nhóm từ (Whole & Part)
(2) Trong trường hợp xài vòng lặp như bạn thì phải có phương tiện nào đó lưu dần các kết quả quá trình tìm kiếm của bạn để cuối chu trình ta có thể ngắm nghía kết quả của công cuộc!
(3) 'sổ ra' theo ý bạn là như thế nào
Nếu 'sổ ra' bằng MsgBox thì ta phải khai báo 1 tham biến lưu (những) kết quả tìm thấy & 'sổ ra' ở cuối quá trình.
(4) Ai hướng bạn viết VBA theo kiểu cách đó vậy; Cách mà mình gọi là viết quá 'Hàn lâm' & vô bổ
Nói vô bổ ở chỗ:
(*) Bạn bỏ nhiều dòng trống (trắng) trong các macro 1 cách không cần thiết; Nếu là mình thì chỉ bỏ 1 (hay vài) dòng trống theo từng nhóm lệnh cách nhau để sau này tiện trong bảo trì hay sửa đổi mà thôi;
Sao bạn lại bỏ trống 4 dòng trong trường hợp này vậy & mục đích thực sự là gì:
Nếu là mình thì các dòng lệnh trong 1 Sub chí ít là nằm hết trên 1 màn hình vi tính để dễ quan sát toàn thể các dòng của đứa con tinh thần của mình; Mục tiêu là dễ bề xoay sở trong mọi tình huống từ nay về sau.
(*) Khai báo tham biến của bạn chưa thật sự tường minh về kiểu dữ liệu
Lợi vài giây gõ chữ nhưng macro lần nào được kêu làm việc là bỏ ra 1 khoảng thời gian & bộ nhớ tiêu tốn 1 cách vô bổ cho hành vi tác trách của bạn.
& cuối cùng là xin lỗi bạn trước vì những lời khó nghe của mình!
PHP:
Private Sub lbDS_Click()
ReDim ArrC(1 To 13, 1 To 6)
Dim Rng As Range, sRng As Range, Sh As Worksheet
Dim W As Integer, Rws As Long
Dim MyAdd As String
lbID = 1 + Me!lbDS.ListIndex
1 'Hiên Trên ListBox Các Nhân Viên Cùng Ho Mã '
Me!tbMaNV.Text = Arr(lbID, 1): Me!tbHT.Text = Arr(lbID, 2)
Me!tbNS.Value = Arr(lbID, 3): Me!cbFT.Text = Arr(lbID, 4)
Me!cbDT.Text = Arr(lbID, 5): Me!cbTG.Text = Arr(lbID, 6)
Me!tbQQ.Text = Arr(lbID, 7): Me!tbNCN.Text = Arr(lbID, 8)
Me!tbTF.Text = Arr(lbID, 9): Me!tbVH.Value = Arr(lbID, 10)
Me!tbCC.Value = Arr(lbID, 11)
2 'Hiên Danh Sách Chi Tiêt '
Set Sh = ThisWorkbook.Worksheets("QuanHe")
ArrC(1, 2) = "Nothing"
Rws = Sh.[b1].CurrentRegion.Rows.Count
Set Rng = Sh.[b1].Resize(Rws)
Set sRng = Rng.Find(Me!tbMaNV.Text, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
W = W + 1: ArrC(W, 1) = W
ArrC(W, 2) = sRng.Offset(, 1).Value
ArrC(W, 3) = sRng.Offset(, 2).Value
ArrC(W, 4) = sRng.Offset(, 3).Value
ArrC(W, 5) = sRng.Offset(, 4).Value
ArrC(W, 6) = sRng.Offset(, 5).Value
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
Me!lbCT.List = ArrC()
End Sub
Bạn thử gõ 'nvh' vô TextBox xem trên ListBox hiện ra những gì; sau đó ta bàn tiếp những chuyện khác nữa như chọn 1 trong các dòng có dữ liệu trên ListBox,. . . .
Bạn cho mình hỏi là lúc bấm chữ tìm kiếm xong dữ liệu hiển thị trong khung textbox! Mình dùng câu lệnh gì để không cho sửa khung textbox đó , chỉ cho xem dữ liệu vậy bạn !!
Bạn thử gõ 'nvh' vô TextBox xem trên ListBox hiện ra những gì; sau đó ta bàn tiếp những chuyện khác nữa như chọn 1 trong các dòng có dữ liệu trên ListBox,. . . .
Em có 2 file đính kèm. @ 200608_Baocao Hang ngay Và @ 200608_Don hang goc _ doi chieu
. Vì lượng hàng hóa phát sinh trong nhiều ngày mới kết thúc nên cần phải có thêm nghiệp vụ là đối chiếu với đơn hàng gốc.
. File @ 200608_Baocao Hang ngay . Tại cột đối chiếu sẽ báo là ok khi tham chiếu dữ liệu các thông số Đon hàng / mã hàng / màu sắc / size số. Tại file @ 200608_Don hang goc _ doi chieu . Đối với VBA
. Đối với việc dò tìm khi có thêm bảng Listbox . e cần nhờ sự hỗ trợ thiết kế 1 Listbox với các thông số Đơn hàng / mã hàng / màu sắc / size số . để kiểm tra . Dữ liệu sẽ được import từ file @ 200608_Don hang goc _ doi chieu vào . Tiếp thjeo chủ đề của @ongke0711 với bài viết Demo Form tìm kiếm nhiều cột trong Listbox View attachment 238919
EM XIN CẢM ƠN RẤT NHIỀU Ạ .
(1) Trong phương thức nói trên có 2 hướng tìm, là tìm theo nguyên mẫu & tìm theo phần của nhóm từ (Whole & Part)
(2) Trong trường hợp xài vòng lặp như bạn thì phải có phương tiện nào đó lưu dần các kết quả quá trình tìm kiếm của bạn để cuối chu trình ta có thể ngắm nghía kết quả của công cuộc!
(3) 'sổ ra' theo ý bạn là như thế nào
Nếu 'sổ ra' bằng MsgBox thì ta phải khai báo 1 tham biến lưu (những) kết quả tìm thấy & 'sổ ra' ở cuối quá trình.
(4) Ai hướng bạn viết VBA theo kiểu cách đó vậy; Cách mà mình gọi là viết quá 'Hàn lâm' & vô bổ
Nói vô bổ ở chỗ:
(*) Bạn bỏ nhiều dòng trống (trắng) trong các macro 1 cách không cần thiết; Nếu là mình thì chỉ bỏ 1 (hay vài) dòng trống theo từng nhóm lệnh cách nhau để sau này tiện trong bảo trì hay sửa đổi mà thôi;
Sao bạn lại bỏ trống 4 dòng trong trường hợp này vậy & mục đích thực sự là gì:
Nếu là mình thì các dòng lệnh trong 1 Sub chí ít là nằm hết trên 1 màn hình vi tính để dễ quan sát toàn thể các dòng của đứa con tinh thần của mình; Mục tiêu là dễ bề xoay sở trong mọi tình huống từ nay về sau.
(*) Khai báo tham biến của bạn chưa thật sự tường minh về kiểu dữ liệu
Lợi vài giây gõ chữ nhưng macro lần nào được kêu làm việc là bỏ ra 1 khoảng thời gian & bộ nhớ tiêu tốn 1 cách vô bổ cho hành vi tác trách của bạn.
& cuối cùng là xin lỗi bạn trước vì những lời khó nghe của mình!
PHP:
Private Sub lbDS_Click()
ReDim ArrC(1 To 13, 1 To 6)
Dim Rng As Range, sRng As Range, Sh As Worksheet
Dim W As Integer, Rws As Long
Dim MyAdd As String
lbID = 1 + Me!lbDS.ListIndex
1 'Hiên Trên ListBox Các Nhân Viên Cùng Ho Mã '
Me!tbMaNV.Text = Arr(lbID, 1): Me!tbHT.Text = Arr(lbID, 2)
Me!tbNS.Value = Arr(lbID, 3): Me!cbFT.Text = Arr(lbID, 4)
Me!cbDT.Text = Arr(lbID, 5): Me!cbTG.Text = Arr(lbID, 6)
Me!tbQQ.Text = Arr(lbID, 7): Me!tbNCN.Text = Arr(lbID, 8)
Me!tbTF.Text = Arr(lbID, 9): Me!tbVH.Value = Arr(lbID, 10)
Me!tbCC.Value = Arr(lbID, 11)
2 'Hiên Danh Sách Chi Tiêt '
Set Sh = ThisWorkbook.Worksheets("QuanHe")
ArrC(1, 2) = "Nothing"
Rws = Sh.[b1].CurrentRegion.Rows.Count
Set Rng = Sh.[b1].Resize(Rws)
Set sRng = Rng.Find(Me!tbMaNV.Text, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
W = W + 1: ArrC(W, 1) = W
ArrC(W, 2) = sRng.Offset(, 1).Value
ArrC(W, 3) = sRng.Offset(, 2).Value
ArrC(W, 4) = sRng.Offset(, 3).Value
ArrC(W, 5) = sRng.Offset(, 4).Value
ArrC(W, 6) = sRng.Offset(, 5).Value
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
Me!lbCT.List = ArrC()
End Sub
Thêm mới 1 nhân vật hay xóa đi 1 dòng dữ liệu của 1 con người cụ thể nào đó, ta đều phải thông qua mã NV (duy nhất) của người đó.
Trước tiên vấn đề mình muốn chia sẽ với bạn là qui luật tạo ra bộ mã (duy nhất) cho 1 danh sách họ tên người Việt như sau:
Mã NV
HỌ VÀ TÊN
NVH00
Ngô Thị Viết Hà
NVH01
Nguyễn Việt Hưng
NVH02
Nguyễn Thị Viết Hà
NVH03
Nhữ Vân Hải
NVH04
Nhâm Vũ Hân
NVH05
Nhâm Võ Hai
NVH06
Nhạn Vi Hân
DFA00
Dương Đông Anh
FJD00
Đỗ Dung
TAH00
Trần Ánh Hồng
TAH01
Tô Thị Anh Hà
FJD02
Đỗ Dủng
Với bộ mã này mình đã ứng dụng cho 1 trường phổ thông khoảng 5K HS cũng OK đó nha.
Như vậy với 1 nhân viên mới vô CQ của bạn, ta cần ấn định mã NV cho bạn ý
Ví dụ tiên người mới đó là Nguyễn Vũ Văn Hai, thì bạn sẽ phải ấn định cho người đó mang mã NVH07 (do NVH06 bạn đã gán cho người nhập trước đó)
(Nếu tên người mới vô là Đăng Dùng, thì mã sẽ phải là FJD01,. . . .)
& Quá trình xóa 1 người nào đó ra khỏi danh sách, t cũng phải tìm thông qua mã NV của người ý mà xóa.
Tạm thời là vậy, & rất vui được thảo luận tiếp với bạn.
Thêm mới 1 nhân vật hay xóa đi 1 dòng dữ liệu của 1 con người cụ thể nào đó, ta đều phải thông qua mã NV (duy nhất) của người đó.
Trước tiên vấn đề mình muốn chia sẽ với bạn là qui luật tạo ra bộ mã (duy nhất) cho 1 danh sách họ tên người Việt như sau:
Mã NV
HỌ VÀ TÊN
NVH00
Ngô Thị Viết Hà
NVH01
Nguyễn Việt Hưng
NVH02
Nguyễn Thị Viết Hà
NVH03
Nhữ Vân Hải
NVH04
Nhâm Vũ Hân
NVH05
Nhâm Võ Hai
NVH06
Nhạn Vi Hân
DFA00
Dương Đông Anh
FJD00
Đỗ Dung
TAH00
Trần Ánh Hồng
TAH01
Tô Thị Anh Hà
FJD02
Đỗ Dủng
Với bộ mã này mình đã ứng dụng cho 1 trường phổ thông khoảng 5K HS cũng OK đó nha.
Như vậy với 1 nhân viên mới vô CQ của bạn, ta cần ấn định mã NV cho bạn ý
Ví dụ tiên người mới đó là Nguyễn Vũ Văn Hai, thì bạn sẽ phải ấn định cho người đó mang mã NVH07 (do NVH06 bạn đã gán cho người nhập trước đó)
(Nếu tên người mới vô là Đăng Dùng, thì mã sẽ phải là FJD01,. . . .)
& Quá trình xóa 1 người nào đó ra khỏi danh sách, t cũng phải tìm thông qua mã NV của người ý mà xóa.
Tạm thời là vậy, & rất vui được thảo luận tiếp với bạn.
Trong file cuối của bạn đã có macro dùng để nhập mới rồi mà; Vấn đề còn lại là xóa thì bạn thử tư duy thêm vài chục giờ nữa xem sao.
Bạn lưu ý là bộ mã của mình đề xuất có 2 phần: đặt tính & định trị (tương ứng 3 chữ cái đầu & 2 kí số cuối của mã)
& trong quá trình nhập mới, xóa hay cập nhật (sửa chửa hay bổ sung mới dữ liệu) ta cần nhập vô TextBox tìm kiếm 3 chữ cái phần đặc tính của mã
Căn cứ kết quả hiện trên ListBox mà ta nhập mã cho nhân viên mới & kể từ thời điểm này mã duy nhất đó sẽ theo nhân viên đó mã mãi đến khi về hưu của CQ bạn.
Khi xóa 1 người ra khỏi danh sách ta cũng phải biết phần đặc tính của mã người đó & nhập vô TextBox tìm kiếm để tìm ra phần định tri nữa của NV đó & tiến hành xóa.
(Bạn có thể tham khảo thêm file này
Mình tìm được code Tạo Mã nhân viên cuả bạn trong diễn đàn, nhưng mình không sửa được lúc chạy chươnng trình tạo mã nhân viên là: Tên + Tên Lót + Họ
ví dụ :
NGUYỄN VĂN TÝ khi chạy chương trình sẽ là TVN000
Mình muốn sửa lại là Họ + Tên lót+ Tên thì mình sửa thế nào vậy bạn ? CẢM ƠN BẠN NHIỀU Ạ !!!
ví dụ :
NGUYỄN VĂN TÝ khi chạy chương trình sẽ là NVT000
Nguyễn Văn Tùng Khi chạy chương trình sẽ là NVT001
Trong file cuối của bạn đã có macro dùng để nhập mới rồi mà; Vấn đề còn lại là xóa thì bạn thử tư duy thêm vài chục giờ nữa xem sao.
Bạn lưu ý là bộ mã của mình đề xuất có 2 phần: đặt tính & định trị (tương ứng 3 chữ cái đầu & 2 kí số cuối của mã)
& trong quá trình nhập mới, xóa hay cập nhật (sửa chửa hay bổ sung mới dữ liệu) ta cần nhập vô TextBox tìm kiếm 3 chữ cái phần đặc tính của mã
Căn cứ kết quả hiện trên ListBox mà ta nhập mã cho nhân viên mới & kể từ thời điểm này mã duy nhất đó sẽ theo nhân viên đó mã mãi đến khi về hưu của CQ bạn.
Khi xóa 1 người ra khỏi danh sách ta cũng phải biết phần đặc tính của mã người đó & nhập vô TextBox tìm kiếm để tìm ra phần định tri nữa của NV đó & tiến hành xóa.
(Bạn có thể tham khảo thêm file này