Lọc dữ liệu vào textbox

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

yeudoi

Thành viên gắn bó
Thành viên BQT
Moderator
Tham gia
12/6/06
Bài viết
3,184
Được thích
7,633
Lọc dữ liệu vào textbox - XD từ điển trên Excel

Mình định làm file từ điển bằng excel nhưng mình vấp phải sự cố thế này không biết thế nào. Khi lọc danh mục vào listbox khi click vào listbox thì chỉ hiện được số bên textbox nhưng khi click tên lại không được bị lỗi. Mong mọi người xem giúp.
 

File đính kèm

Bác thay đổi chút it trong sự kiện txtTimKiem_Change là được thôi:
Mã:
'Đay la code cua bac
Private Sub txtTimKiem_Change()
Dim t, Tam As String
Dim Tim As Boolean
Dim i As Integer
TextBox1.Text = txtTimKiem.Text
lstTimKiem.Clear
t = txtTimKiem.Text
i = 1
Do
    If TimKiem(t, Sheet1.Cells(i, 1).Value) Then
        Tam = Sheet1.Cells(i, 1).Value
        lstTimKiem.AddItem (Tam)
    End If
    i = i + 1
Loop Until Sheet1.Cells(i, 1).Value = ""
End Sub

Mã:
'Code moi
Private Sub txtTimKiem_Change()
'Dim t, Tam As String
'Dim Tim As Boolean
Dim i As Integer
TextBox1.Text = txtTimKiem.Text
lstTimKiem.Clear
't = txtTimKiem.Text
i = 1
Do
    'If TimKiem(t, Sheet1.Cells(i, 1).Value) Then
    '    Tam = Sheet1.Cells(i, 1).Value
    '    lstTimKiem.AddItem (Tam)
    'End If
    If UCase(Left(Sheet1.Cells(i, 1).Text, Len(txtTimKiem.Text))) = UCase(txtTimKiem.Text) Then
        lstTimKiem.AddItem (Sheet1.Cells(i, 1).Text)
    End If
    i = i + 1
Loop Until Sheet1.Cells(i, 1).Text = ""
End Sub
 
Upvote 0
Dear nvson !

Cảm ơn bác về đọan code của bác, câu lệnh trên đã thực hiện được tìm kiếm được theo tên nhưng trong ListBox Dictionary Entries khi mình click chuột vào tên của một người nào đó thì vẫn báo lỗi. Bác ráng giúp luôn.

Thân mến !
 
Lần chỉnh sửa cuối:
Upvote 0
oh, mình không để ý.
Bạn thay đổi sựu kiện lstTimKiem_Click nhé:
Code chỉ đơn giản như sau thôi:
Mã:
Private Sub lstTimKiem_Click()
'Dim st As Integer
'st = lstTimKiem.Text
'TextBox2.Text = Sheets("DataEnglish").Cells(st, 2).Value
[COLOR=red][B]TextBox2.Text = lstTimKiem.Text[/B][/COLOR]
End Sub
P/S:
Mình mới chỉ xem để giải quyết các y/c mà bạn nêu và thấy mới có 2 sự kiện mà các bác khai báo thêm nhiều biến quá, mà toàn "không cần thiết" thôi. Hãy biết tiết kiệm bộ nhớ của máy.....
 
Upvote 0
Cảm ơn bác nvson !

Mình đã thay đổi theo câu lệnh trên của bác & đã thành công. Cảm ơn bác rất nhiều.

Chúc bác luôn mạnh giỏi !
 
Upvote 0
Thật là tuyệt vời!
Nhưng Bác NVSON và Bac YEUDOI ơi sao sửa xong rồi click chuột lên một từ (tiếng anh bên này) bên này không thấy hiện từ (tiếng việt) tương ướng ở cửa sổ bên. Tôi đã thủ làm dữ liệu ở 2 cột việt và anh rồi. Nhân đây xin hai cao thủ tìm xem có cách nào tra được từ bất kỳ trong một câu (thay vì cách tra từ trái xang phải)
rất mong các bác giải quyết tiếp tục.
 
Upvote 0
Đây mới chỉ là bước khởi đầu thôi. Có lẽ bạn đợi "vài ngày" nữa anh Yeudoi sẽ hoàn thiện chương trình này...
 
Upvote 0
vungoc đã viết:
Cảm ơn bác nvson !

Mình đã thay đổi theo câu lệnh trên của bác & đã thành công. Cảm ơn bác rất nhiều.

Chúc bác luôn mạnh giỏi !
Anh Vũ Ngọc,
Chắc cũng đến lúc Anh cũng phải Post tác phẩm của anh lên chứ. Tôi thấy nó cũng hay lắm.

Lê Thanh Nhân
 
Upvote 0
Private Sub lstTimKiem_Click()
'Dim st As Integer
'st = lstTimKiem.Text
'TextBox2.Text = Sheets("DataEnglish").Cells(st, 2).Value
TextBox2.Text = lstTimKiem.Text
End Sub
Anh nvson xem lại giúp không phải TextBox2.Text = lstTimKiem.Textmà là bằng cột 2 của sheets("DataEnglish"). Vậy nhờ anh xem giúp nha.
 
Upvote 0
lethanhnhan đã viết:
Anh Vũ Ngọc,
Chắc cũng đến lúc Anh cũng phải Post tác phẩm của anh lên chứ. Tôi thấy nó cũng hay lắm.

Lê Thanh Nhân

Cảm ơn bác nhiều !

Nhưng bác ơi, file của em nhận thấy còn một số vấn đề đang luộm thuộm lắm bác ạ, Hôm nào bác cho em gặp - nhờ bác giúp hòan thiện nốt để up lên cho nó chu đáo tí chứ, bác nhỉ - hì hì.

Bác sẵn sàng giúp em chứ, chờ tin của bác !
 
Upvote 0
Mình đưa ra 02 cách giải quyết như thế này, tuỳ bác sử dụng:
* Cách 1:
Bác định dạng lại các cột A, B,... trong sheet DataEnglish là Text, sau đó đánh lại toàn bộ dữ liệu (chủ yếu là những số thôi ừ A1 đến B1510) --> điều này cũng không khó gì phải không?
Vào VBA thêm dòng lệnh sau vào sự kiện lstTimKiem_Click
Mã:
Private Sub lstTimKiem_Click()
TextBox2.Text = Sheets("DataEnglish").Cells(WorksheetFunction. _
Match(lstTimKiem.Text, Sheets("DataEnglish").Range("A:A"), 0), "B")
End Sub

* Cách 2:
Vào VBA, nhấn vào form Tudien, Insert thêm 1 ListBox có Name là lstTam, đặt thuộc tính Visible = False
Mã:
Private Sub lstTimKiem_Click()
TextBox2.Text = lstTam.List(lstTimKiem.ListIndex)
End Sub
'
Private Sub txtTimKiem_Change()
Dim i As Integer
TextBox1.Text = txtTimKiem.Text
lstTimKiem.Clear
lstTam.Clear
i = 1
Do
    If UCase(Left(Sheet1.Cells(i, 1).Text, Len(txtTimKiem.Text))) = UCase(txtTimKiem.Text) Then
        lstTimKiem.AddItem (Sheet1.Cells(i, 1).Text)
        lstTam.AddItem (Sheet1.Cells(i, 2).Text)
    End If
    i = i + 1
Loop Until Sheet1.Cells(i, 1).Text = ""
End Sub
Chắc là còn nhiều cách nữa....
Tuỳ bác sử dụng thôi!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào Bác NVSON
Thật là tuyệt vời!
bác chỉ cho cách 2 cụ thể hơn chút nào?
Và cao thủ như bác bác làm luôn để tra được từng từ không phải theo từ trái xang phải (từ chữ đầu tiên) và cho phép copy ở cột 2 (không phải dùng CTRL+C)
Mà bác có file rồi thì bác up lên cho anh em học với.
Tôi là người rất thích VBA trong excel nhưng lần đầu tiên thấy một cao thủ giải quyết vấn đề nêu ra nhanh như điện.
Rất mong hồi âm của Bác
 
Upvote 0
Mã:
Private Sub txtTimKiem_Change()
Dim strFindText As String, lngFindTextLength&
Dim strCellText1 As String, strCellText2 As String
Dim i& '// Chuyen sang kieu Long de tranh loi runtime khi vuot gia tri cua Integer. 
'// Hon nua, Compiler bao gio cung chuyen kieu Integer thanh kieu Long
'//nen toc do Long nhanh hon cho du ton them it bo nho 
'// (Comment nen viet tieng Viet khong dau, ko viet tieng Viet co dau)
 
strFindText = txtTimKiem.Text '// Khong nen lay gia tri thuoc tinh control lap lai nhieu trong vong lap 
'//va tren cung 1 dong lenh.
lngFindTextLength = Len(strFindText) '// Khong nen de ham trong vong lap qua nhieu
TextBox1.Text = strFindText
lstTimKiem.Clear
lstTam.Clear
i = 1
Do
    strCellText1 = Sheet1.Cells(i, 1).Text
    If UCase$(Left$(strCellText1, lngFindTextLength)) = UCase$(strFindText) Then
        strCellText2 = Sheet1.Cells(i, 2).Text
        lstTimKiem.AddItem strCellText1
        lstTam.AddItem strCellText2
    End If
    i = i + 1
    DoEvents
Loop Until strCellText1 = ""
End Sub

- Mình chưa để ý đến mục đích của code nên giữ nguyên cách làm của tác giả. Chỉ thay đổi 1 chút để lấy ví dụ về optimized code.
- Hạn chế dùng thuộc tính của Control nhiều lần trên cùng 1 dòng lệnh vì khi lấy giá trị của 1 thuộc tính của control thì lâu hơn rất nhiều lấy từ biến nhớ, nhất là trong vòng lặp.
- Nên dùng DoEvents (tốt nhất là viết lại DoEvents = API DoEvents mới) trong vòng lặp
- Các hàm liên quan đến String nên kèm theo chữ $ để tăng tốc độ (M$ khuyến cáo như vậy khi làm việc với Visual Basic Compiler, đã có test comparison chứng minh về việc đó rất nhiều)
- lstTam: :), thực sự chả hiểu Tam là Tắm, Tam, hay Tạm. Nhưng nếu viết là lstTemp thì cực kỳ dễ hiểu. Sorry vì mình quen viết code dùng tiếng anh :), bỏ quá cho nhé ko lại kêu tớ là chảnh.
- Tại sao lại dùng hẳn 1 control lstTam chỉ để giải quyết cái tạm thời. Sao không dùng Collection? Trên Form chỉ dùng những control nào dùng đến mà thôi, cố gắng hạn chế đến tối thiểu mọi control trên form.

Hope that helps!

Cheers
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bác NVSON nhiều nhiều đã gửi cho tôi File
Tôi đã dùng và muốn nhờ bác giúp cho:
khi tìm được từ tiếng anh (cột trái) thì đồng thời từ đó hiện lên ở text tìm kiếm (như các từ điển thông thường) để có thể dùng nó để tra các từ khác trong câu đó (vì dữ liệu bên cột trái là câu tiếng anh và bên cột phải là câu tiếng việt tương ướng); khi mỗi lần tra (dùng ENTER) thì dữ liệu đó xóa đi khỏi box tìm kiếm;
hoặc trong một câu có thể tra lần lượt hoạc ngẫu nhiên các từ của cột bên trái để ra câu tiếng việt có từ tương ứng ở bên phải (tất nhiên dữ liệu phải có sẵn như vậy rồi)
Một lần nữa cảm ơn Bác.
rất mong Bác giúp
 
Upvote 0
Mình làm được rồi nhưng mình thấy khi textbox timkiem thay đổi thì dữ liệu được lọc vào lsttimkiem rất lâu nếu dự liệu có khoản 60000 từ chắc là lâu quá có cách nào cho nó chạy nhanh được không nhỉ. Mình định làm chương trình này chào mừng sinh nhật GPE đó.Mong được giúp đỡ
 
Upvote 0
yeudoi đã viết:
Mình làm được rồi nhưng mình thấy khi textbox timkiem thay đổi thì dữ liệu được lọc vào lsttimkiem rất lâu nếu dự liệu có khoản 60000 từ chắc là lâu quá có cách nào cho nó chạy nhanh được không nhỉ. Mình định làm chương trình này chào mừng sinh nhật GPE đó.Mong được giúp đỡ

Vậy thì không dùng cách sử dụng vòng lặp được đây yêu đời ơi. Làm từ điển thì có rất nhiều người làm rất tốt và chia sẻ nhiều source code như thế trên mạng. Yêu đời thử tìm kiếm xem nhé. Cố gắng chuyển sang CSDL (Access cũng được).
 
Upvote 0
Bởi mình muốn hoàn toàn là excel chứ phải thêm ông Access nữa thì nói làm gì. Cảm ơn anh hai nha. Mình sẽ tìm xem
 
Upvote 0
Ve viec lay gia tri tu cot 2 khi click vao lstTimKiem, toi thu thay doi 1 chut o bien co lstTimKiem_Click nhu duoi day. Ban yeudoi tham khao thu xem nhe.

Chuc Ban thanh cong.



Private Sub lstTimKiem_Click()
Dim i As Integer
i = 1
Do
If Sheet1.Cells(i, 1).Text = lstTimKiem.Text Then
TextBox2.Text = Sheet1.Cells(i, 2).Text
Exit Sub
End If
i = i + 1
Loop Until Sheet1.Cells(i, 1).Value = ""
End Sub
 
Upvote 0
Yeudoi đã viết:
Bởi mình muốn hoàn toàn là excel chứ phải thêm ông Access nữa thì nói làm gì.
Bác Yeudoi thu tham khảo file sau, mình viết hoàn toàn bằng Excel thôi (dĩ nhiên là code có tham khảo và chỉnh sửa lại).
Thời gian Load dữ liệu với 65536 dòng mất khoảng <10s (đã Test với máy của mình).
Bác xem và hoàn chỉnh nốt nhé!
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom