Tìm tên công việc đưa vào list box (Nhờ anh chị tối ưu giúp)

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

vba_gpe

Thành viên thường trực
Tham gia
15/12/10
Bài viết
296
Được thích
44
Nghề nghiệp
Thất nghiệp
Gửi anh chị GPE.
Kính nhờ anh chị tối ưu giúp em vấn đề này.
Em có lập ra cái bảng tra đơn giá theo tên công việc để đưa ra 1 list box mới.
Thử ít công việc thì không có gì.
Khi đưa vào file đơn giá khoảng 8.000 cviec thì tìm nó bị đơ ra.

Nhờ anh chị góp ý giúp
Em có gửi kèm file.

Mong nhận được góp ý của mọi người.
Cảm ơn anh chị.
 

File đính kèm

Gửi anh chị GPE.
Kính nhờ anh chị tối ưu giúp em vấn đề này.
Em có lập ra cái bảng tra đơn giá theo tên công việc để đưa ra 1 list box mới.
Thử ít công việc thì không có gì.
Khi đưa vào file đơn giá khoảng 8.000 cviec thì tìm nó bị đơ ra.

Nhờ anh chị góp ý giúp
Em có gửi kèm file.

Mong nhận được góp ý của mọi người.
Cảm ơn anh chị.

Không hiểu bạn dùng 2 ListBox để làm gì, 1 cái 2 cột cũng được vậy

Capture.JPG























Tôi sửa lại theo hướng này, dùng thêm hàm Filter2DArray, bảo đảm tốc độ nhanh
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Gửi anh chị GPE.
Kính nhờ anh chị tối ưu giúp em vấn đề này.
Em có lập ra cái bảng tra đơn giá theo tên công việc để đưa ra 1 list box mới.
Thử ít công việc thì không có gì.
Khi đưa vào file đơn giá khoảng 8.000 cviec thì tìm nó bị đơ ra.

Nhờ anh chị góp ý giúp
Em có gửi kèm file.

Mong nhận được góp ý của mọi người.
Cảm ơn anh chị.
Bạn chuyển qua cách làm Mãng đi đảm bảo bạn siêu nhanh, trước đây mình cũng làm như bạn đấy, sau khi được các anh chị giúp đỡ chuyển qua mãng chạy hết cở ngon. Trong đó bạn nên áp dụng các hàm có sẵn của Thầy ndu96081631 để làm. Bạn có thể tham khảo qua Link nàyLink này
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh ndu96081631
Em dùng 2 cái list boxt vì em không biết cách nào AddItem mà có 2 cột trong list boxt cả. Cảm ơn anh. Code anh nhanh quá.
Cho em tham khảo anh thêm cái nữa:
Nếu bây chừ để khi click vào bất kỳ một công việc nào trong list công việc thì nó hiện tra đơn giá vật liệu hay đơn giá nhân công, hay thông tin của một cột nào đó tương ứng với công việc trong sheet dữ liệu theo ý muốn của mình được không anh?
Em chỉ biết thêm hiện ra có 2 cột mã hiệu hoặc đơn giá thôi à.
Mã:
Private Sub ListBox1_Click()
Dim i As Long
For i = 1 To ListBox1.ListCount
    If Me.ListBox1.Selected(i) = True Then
        MsgBox Me.ListBox1.List(i, 1)
    End If
Next
End Sub

Cảm ơn anh.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh NDU
Em dùng 2 cái list boxt vì em không biết cách nào AddItem mà có 2 cột trong list boxt cả. Cảm ơn anh. Code anh nhanh quá.
Cho em tham khảo anh thêm cái nữa:
Nếu bây chừ để khi click vào bất kỳ một công việc nào trong list công việc thì nó hiện tra đơn giá vật liệu hay đơn giá nhân công, hay thông tin của một cột nào đó tương ứng với công việc trong sheet dữ liệu theo ý muốn của mình được không anh?
Em chỉ biết thêm hiện ra có 2 cột mã hiệu hoặc đơn giá thôi à.
Mã:
Private Sub ListBox1_Click()
Dim i As Long
For i = 1 To ListBox1.ListCount
    If Me.ListBox1.Selected(i) = True Then
        MsgBox Me.ListBox1.List(i, 1)
    End If
Next
End Sub

Cảm ơn anh.
Bạn muốn tra đơn giá vật liệu hay nhân công ở đâu, bạn thiết kế Form theo ý bạn rồi mọi người sẽ giúp tiếp cho bạn
 
Upvote 0
Bạn muốn tra đơn giá vật liệu hay nhân công ở đâu, bạn thiết kế Form theo ý bạn rồi mọi người sẽ giúp tiếp cho bạn
Cảm ơn anh VietHoai
Có câu này của anh em yên tâm rồi. Sẽ còn tham khảo đóng góp của mọi người.
Bạn chuyển qua cách làm Mãng đi đảm bảo bạn siêu nhanh, trước đây mình cũng làm như bạn đấy, sau khi được các anh chị giúp đỡ chuyển qua mãng chạy hết cở ngon. Trong đó bạn nên áp dụng các hàm có sẵn của Thầy ndu96081631 để làm. Bạn có thể tham khảo qua Link nàyLink này
Các link của thầy ndu96081631 quá hay. Em sẽ cố gắng nghiên cứu phần mảng.

Trân trọng.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh VietHoai
Có câu này của anh em yên tâm rồi. Sẽ còn tham khảo đóng góp của mọi người.

Các link của thầy NDU quá hay. Em sẽ cố gắng nghiên cứu phần mảng.

Trân trọng.
Form là tùy theo ý bạn nhưng đại khái bạn tham khảo thêm thế này là bạn có thể làm tiếp được
 

File đính kèm

Upvote 0
Cảm ơn anh VietHoai
Bài này e gửi là chưa tham khảo code của anh cho cái Listbox1. Vì vậy chắc còn chậm.
Em có thiết kế thêm cái form mới và có đưa thêm cái code để nó tự load đơn giá và các thứ khác theo tên công việc tại sheet Dutoan(Nhờ mọi người góp ý thêm).
Với lại nhờ mọi người chỉ giáo thêm:
Trong code của thầy ndu96081631 em vẫn chưa hiễu rõ lắm nên muốn nhờ mọi người chỉ giúp để khi chọn 1 trong 2 cái tùy chọn tìm theo mã hiệu hoặc tên công việc thì nó sẽ tự động tìm kiếm tương ứng với 2 nội dung là mã hiệu hoặc tên công việc trong sheet Table1.

Cảm ơn anh chị.
Mong nhận được hồi đáp
Thân mến
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh VietHoai
Bài này e gửi là chưa tham khảo code của anh cho cái Listbox1. Vì vậy chắc còn chậm.
Em có thiết kế thêm cái form mới và có đưa thêm cái code để nó tự load đơn giá và các thứ khác theo tên công việc tại sheet Dutoan(Nhờ mọi người góp ý thêm).
Với lại nhờ mọi người chỉ giáo thêm:
Trong code của thầy ndu96081631 em vẫn chưa hiễu rõ lắm nên muốn nhờ mọi người chỉ giúp để khi chọn 1 trong 2 cái tùy chọn tìm theo mã hiệu hoặc tên công việc thì nó sẽ tự động tìm kiếm tương ứng với 2 nội dung là mã hiệu hoặc tên công việc trong sheet Table1.

Cảm ơn anh chị.
Mong nhận được hồi đáp
Thân mến
Bạn xem file đúng ý bạn chưa nhé
 

File đính kèm

Upvote 0
Trong code của thầy ndu96081631 em vẫn chưa hiễu rõ lắm nên muốn nhờ mọi người chỉ giúp để khi chọn 1 trong 2 cái tùy chọn tìm theo mã hiệu hoặc tên công việc thì nó sẽ tự động tìm kiếm tương ứng với 2 nội dung là mã hiệu hoặc tên công việc trong sheet Table1.
Thân mến
Thật ra bạn cũng không cần phải hiểu, chỉ cần biết cách áp dụng là được rồi (có thời gian sẽ tìm hiểu sau)
Hàm Filter2DArray có chưc năng giống như AutoFilter ấy... Nó lọc mảng nguồn theo điều kiện nào đó, tại cột chỉ định và cho ra kết quả là 1 mảng khác ---> Lọc xong, lấy được mảng kết quả, làm gì tiếp theo là việc của ta
Cú pháp hàm Filter2DArray là
Filter2DArray(sArray, ColIndex, FindStr, HasTitle)
Diển giải:
Filter2DArray(mảng nguồn, Cột cần lọc, Chuổi tìm kiếm, mảng nguồn có chưa tiêu đề hay không)
Vậy thôi!
--------------------------
Trở lại câu hỏi của bạn:
khi chọn 1 trong 2 cái tùy chọn tìm theo mã hiệu hoặc tên công việc thì nó sẽ tự động tìm kiếm tương ứng với 2 nội dung là mã hiệu hoặc tên công việc trong sheet
Cái này chỉ là thay đổi cột cần lọc: Tìm theo mã thi ColIndex = 1, tìm theo tên thì ColIndex = 2
 
Upvote 0
Bạn xem file đúng ý bạn chưa nhé
Cảm ơn VietHoai
Nhờ bạn VietHoai giai thích giúp mình chổ:
Mã:
Col = -(OptionButton1.Value + 2 * OptionButton2.Value)
Mình debug thấy: Để cho giá trị Col = 2 thì tương ứng option1.value = False và Option2.value = True
<=> Col = (-False+2*True) = 2 (Mình Vẫn chưa hiểu).
Gửi thầy ndu96081631:
- Hàm trim dùng để cắt các khoảng trắng bênh phải và bênh trái của chuổi, nó cũng cắt được luôn cả ký tự "*" luôn sao? (Thầy giải thích giúp em).
- Trong cái mãng lọc ra, có cách nào mình giúp nó phân biệt được chử hoa và chữ thường không thầy:
Ví dụ:
Đánh vào : "Bê tông" <=> Tìm ra các công tác có từ Bê tông trong đó chữ "Bê" viết hoa chữ "B" thay vì nó sẽ tìm hết cả chữ "bê tông" luôn?

Mong nhận được góp ý của mọi người.
Trân trọng .
 
Upvote 0
- Hàm trim dùng để cắt các khoảng trắng bênh phải và bênh trái của chuổi, nó cũng cắt được luôn cả ký tự "*" luôn sao? (Thầy giải thích giúp em).
Làm gì có chuyện đó chứ... Nhưng tại sao bạn lại hỏi vậy?
- Trong cái mãng lọc ra, có cách nào mình giúp nó phân biệt được chử hoa và chữ thường không thầy:
Ví dụ:
Đánh vào : "Bê tông" <=> Tìm ra các công tác có từ Bê tông trong đó chữ "Bê" viết hoa chữ "B" thay vì nó sẽ tìm hết cả chữ "bê tông" luôn?
Nếu muốn thế thì phải sửa lại code ---> Chổ nào có UCase, hãy xóa bỏ hết. Ví dụ:
Đoạn code cũ:
If UCase(TmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
Hãy sửa thành
If TmpArr(i, ColIndex) Like FindStr Then Dic.Add i, ""
 
Upvote 0
Cảm ơn VietHoai
Nhờ bạn VietHoai giai thích giúp mình chổ:
Mã:
Col = -(OptionButton1.Value + 2 * OptionButton2.Value)
Mình debug thấy: Để cho giá trị Col = 2 thì tương ứng option1.value = False và Option2.value = True
<=> Col = (-False+2*True) = 2 (Mình Vẫn chưa hiểu).
Gửi thầy ndu96081631:
- Hàm trim dùng để cắt các khoảng trắng bênh phải và bênh trái của chuổi, nó cũng cắt được luôn cả ký tự "*" luôn sao? (Thầy giải thích giúp em).
- Trong cái mãng lọc ra, có cách nào mình giúp nó phân biệt được chử hoa và chữ thường không thầy:
Ví dụ:
Đánh vào : "Bê tông" <=> Tìm ra các công tác có từ Bê tông trong đó chữ "Bê" viết hoa chữ "B" thay vì nó sẽ tìm hết cả chữ "bê tông" luôn?

Mong nhận được góp ý của mọi người.
Trân trọng .
1. Bạn cứ test là biết thôi mà: 2 trường hợp trên: -(1*(0)+2*(-1))=2 hoặc -(1*(-1)+2*0)=1
2. Hàm trim chỉ cắt khoảng trắng 2 đầu thôi
3. Người ta thường muốn tìm kiếm linh động như vậy sao bạn lại muốn ngược lại?
 
Upvote 0
1. Bạn cứ test là biết thôi mà: 2 trường hợp trên: -(1*(0)+2*(-1))=2 hoặc -(1*(-1)+2*0)=1
Thấy thì có vẽ rất Pro, nhưng thực chất dùng IIF vẫn hay hơn
Col = IIf(OptionButton1.Value, 1, 2)
Dễ hiểu và xử lý nhanh hơn ---> Lý nào có mỗi 1 việc CHỌN 1 TRONG 2 PHƯƠNG ÁN mà lại bắt VBA đi tính toán cộng trừ nhân chia?
 
Upvote 0
Thấy thì có vẽ rất Pro, nhưng thực chất dùng IIF vẫn hay hơn
Col = IIf(OptionButton1.Value, 1, 2)
Dễ hiểu và xử lý nhanh hơn
Dạ, em cảm ơn cái này em cũng học Sư Phụ mà, nhở bạn ấy có nhiều OptionButton thì cách này tổng quát, cái gì chưa biết thì cần phải biết thôi
 
Upvote 0
@ VietHoai:
1. Bạn cứ test là biết thôi mà: 2 trường hợp trên: -(1*(0)+2*(-1))=2 hoặc -(1*(-1)+2*0)=1
Cảm ơn VietHoa Bây giờ mình mới biết được giá trị của True và False.
3. Người ta thường muốn tìm kiếm linh động như vậy sao bạn lại muốn ngược lại?
Ý của VietHoa mình chấp nhận vì nó sẽ cho ra kết quả nhiều hơn đối với việc tìm kiếm của mình. Ý mình mong muốn là sẽ giúp cho người tìm công việc có thể chia ra những công tác nào chuyên về Bê tông (Bê tông móng ...Sẽ bắt đầu bằng chữ Bê tông) và những công tác mà Bê tông đóng vai trò phụ (Ví dụ phá dỡ kết cấu bê tông).

@ ndu96081631:

[U đã viết:
ndu96081631[/U];380911]Làm gì có chuyện đó chứ... Nhưng tại sao bạn lại hỏi vậy?
Dạ thưa thầy, cái này do em nhầm giữa "FindStr" và "txt_FindDG.Text".
Nhờ thầy giải thích giúp em cái nữa: Tại sao trong biến FindStr mình lại cho 2 dấu "*" ở hai đầu ạ? Em thử bỏ dấu "*" thì nó tìm không ra.

Thưa thầy, có cách nào mình bỏ qua 2 cái tùy chọn (Tìm theo tên công việc, tìm theo mã hiệu) luôn không?
(Ý em: Nếu mình nhập mã hiệu thì nó sẽ tự tìm mã hiệu, nhập tên công việc thì sẽ tự tìm tên công việc)
Em nghĩ:
Mình cho thứ tự ưu tiên. Tìm Mã hiệu trước, nếu mã hiệu không có thì nhảy qua tìm theo tên công việc.

Thầy thông cảm cho em nha, em đọc code nhưng chưa biết xử lý như thế nào để code hoạt động theo ý mình cả nên nhờ thầy và mọi người góp ý!

Cảm ơn thầy và mọi người.

Mong nhận được hồi đáp
Trân trọng


 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn VietHoai
Bây giờ mình mới biết được giá trị của True và False. Hihi.
2.
Dạ thưa, cái này do em nhầm giữa "FindStr" và "txt_FindDG.Text". Nhờ thầy giải thích giúp em cái nữa: Tại sao trong biến FindStr mình lại cho 2 dấu "*" ở hai đầu ạ? Em thử bỏ dấu "*" thì nó tìm không ra.


Ý của VietHoa mình chấp nhận vì nó sẽ cho ra kết quả nhiều hơn đối với việc tìm kiếm của mình. Ý mình mong muốn là sẽ giúp cho người tìm công việc có thể chia ra những công tác nào chuyên về Bê tông (Bê tông móng ...Sẽ bắt đầu bằng chữ Bê tông) và những công tác mà Bê tông đóng vai trò phụ (Ví dụ phá dỡ kết cấu bê tông).

Thưa thầy, có cách nào mình bỏ qua 2 cái tùy chọn (Tìm theo tên công việc, tìm theo mã hiệu) luôn không?
(Ý em: Nếu mình nhập mã hiệu thì nó sẽ tự tìm mã hiệu, nhập tên công việc thì sẽ tự tìm tên công việc)
Em nghĩ:
Mình cho thứ tự ưu tiên. Tìm Mã hiệu trước, nếu mã hiệu không có thì nhảy qua tìm theo tên công việc.

Thầy thông cảm cho em nha, em đọc code nhưng chưa biết xử lý như thế nào để code hoạt động theo ý mình cả nên nhờ thầy và mọi người góp ý. Hihi.

Cảm ơn thầy và mọi người.

Mong nhận được hồi đáp
Trân trọng

Cảm ơn thầy
1. "*" & "FindStr" & "*" là có có thể tìm kí tự ở bất kỳ vị trí nào. Nếu bạn muốn thích nó nằm đầu, giữa, cuối thì thiết kế thêm tùy chọn (lời khuyên: không nên phân biệt hữ hoa, chữ thường vì đôi lúc trong dữ liệu nguồn nhập không theo ý mình)
2. Nếu bạn muốn ưu tiên tìm mã trước, nếu không tồn tại, thì tìm theo công việc cũng được
Mình gợi ý đoạn code:
PHP:
Arr = Filter2DArray(sArray, Col, FindStr, False)
  If Not IsArray(Arr) Then ListBox1.Clear: Exit Sub
Sử thành
PHP:
Arr = Filter2DArray(sArray,1, FindStr, False)
  If Not IsArray(Arr) Then
     Arr = Filter2DArray(sArray,2, FindStr, False)
     ......
  End if

Bạn tự làm mới nhớ lâu chứ

Ý bạn muốn thế nào?
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn muốn ưu tiên tìm mã trước, nếu không tồn tại, thì tìm theo công việc cũng được
Ý bạn muốn thế nào?
@ VietHoa:
Ok bạn. Tại sao mình lại không để ý đến code của thầy ndu96081631Viethoagợi ý nhỉ.
Mình làm được rồi.
Cảm ơn bạn.
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom