lọc trực tiếp trên form với nhiều điều kiện (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

vanhesing

Thành viên thường trực
Tham gia
12/8/10
Bài viết
223
Được thích
30
Chào cả nhà !
Hôm nay mình có 1 bài mong nhận được sự quan tâm của cả nhà .
Mình có 1 file lọc trực tiếp trên from như trong file đính kèm , mình học hỏi từ diễn đàn , tuy nhiên mình chỉ lọc được theo 1 điều kiện đó là tên thiết bị . Mình thêm 1 điều kiện nữa là mã thiết bị nhưng searrch trên diễn đàn hình như ko thấy bài nào đúng mục đích .
Mục đích của mình là những record thỏa mãn 2 trường hợp dưới đây sẽ hiển thị trên listbox .:
- trường hợp lọc 1 điều kiện (tên thiết bị or mã thiết bị )
- trường hợp lọc 1 lúc 2 điều kiện ( vừa tên thiết bị và mã thiết bị )
Thanks
 

File đính kèm

Vì đây là file demo để học hỏi , mình đã trích ra từ file của mình nên còn 1 số cái chưa delete . mọi người thông cảm
 
**~** không ai giúp mình hết .oa oa oa
 
Chào cả nhà !
Hôm nay mình có 1 bài mong nhận được sự quan tâm của cả nhà .
Mình có 1 file lọc trực tiếp trên from như trong file đính kèm , mình học hỏi từ diễn đàn , tuy nhiên mình chỉ lọc được theo 1 điều kiện đó là tên thiết bị . Mình thêm 1 điều kiện nữa là mã thiết bị nhưng searrch trên diễn đàn hình như ko thấy bài nào đúng mục đích .
Mục đích của mình là những record thỏa mãn 2 trường hợp dưới đây sẽ hiển thị trên listbox .:
- trường hợp lọc 1 điều kiện (tên thiết bị or mã thiết bị )
- trường hợp lọc 1 lúc 2 điều kiện ( vừa tên thiết bị và mã thiết bị )
Thanks
Thật ra chủ đề Filter đã có trên diễn đàn rồi... Xem cái này:
http://www.giaiphapexcel.com/forum/showthread.php?47929-Sort-mảng-2-chiều&
Với hàm Filter2DArray, bạn muốn Filter kiểu nào mà chẳng được
Tôi làm lại file cho bạn với sự trợ giúp của hàm này!
- Nếu Gõ gì đó vào từng TextBox thì ListBox sẽ filter theo điều kiện đã ghi trong từng TextBox (filter 1 điều kiện)
- Nếu bấm vào CommandButton thì sẽ filter theo 2 điều kiện (TextBox1 và TextBox2)
Code trong UserForm sẽ rất đơn giản:
PHP:
Private Sub UserForm_Initialize()
  sArray = Sheet6.Range(Sheet6.[C7], Sheet6.[K1000].End(xlUp)).Value
  ListBox1.List() = sArray
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  SetWindowLong hWnd, -16, &H84C00000
End Sub
PHP:
Private Sub CommandButton3_Click()
  Dim Arr
  ListBox1.Clear
  Arr = Filter2DArray(sArray, 2, TextBox1.Text & "*", False)
  Arr = Filter2DArray(Arr, 1, TextBox2.Text & "*", False)
  If IsArray(Arr) Then ListBox1.List() = Arr
End Sub
PHP:
Private Sub TextBox1_Change()
  Dim Arr
  Arr = Filter2DArray(sArray, 2, TextBox1.Text & "*", False)
  If IsArray(Arr) Then ListBox1.List() = Arr
End Sub
PHP:
Private Sub TextBox2_Change()
    Dim Arr
    Arr = Filter2DArray(sArray, 1, TextBox2.Text & "*", False)
    If IsArray(Arr) Then ListBox1.List() = Arr
End Sub
PHP:
Private Sub UserForm_Terminate()
  Application.Visible = True
End Sub
Lưu ý: Đã dùng Application.Visible = False khi form load thì phải nhớ trả về như cũ khi thoát form nhé
 

File đính kèm

Lần chỉnh sửa cuối:
Thanks Bác NDU, nếu mình không sử dụng nút buttton được ko ? chỉ cần gõ kí tự vào bất kỳ textbox nào , có thể 1 textbox tùy điều kiện có thể 2 textbox cùng lúc và giá trị được thỏa mãn sẽ hiện trên lisstbox không sử dụng nút button.
- 1 cái nữa em học được 1 hàm sFilter (hình như cũng của Bác )
Private Function sFilter(sRng As Range, Criteria, Optional Col As Long = 1)
Dim tmpArr, Arr, i As Long, j As Long, n As Long
On Error GoTo ExitFunc
If Criteria = "" Then
sFilter = sRng.Value
Exit Function
End If
tmpArr = sRng.Value
ReDim Arr(1 To UBound(tmpArr, 1), 1 To UBound(tmpArr, 2))
For i = 1 To UBound(tmpArr, 1)
If InStr(tmpArr(i, Col), Criteria) = 1 Then
n = n + 1
For j = 1 To UBound(tmpArr, 2)
Arr(n, j) = tmpArr(i, j)
Next j
End If
Next i
sFilter = Arr
ExitFunc:
End Function
- em thấy cái này ngắn hơn , tuy nhiên nó chỉ thỏa mãn 1textbox , vậy có cách nào sửa lại 2 tẽtbox không ? nếu có Bác vui lòng giải thích chổ đó giùm em .
Thanks Bác nhiều
 
Thanks Bác NDU, nếu mình không sử dụng nút buttton được ko ? chỉ cần gõ kí tự vào bất kỳ textbox nào , có thể 1 textbox tùy điều kiện có thể 2 textbox cùng lúc và giá trị được thỏa mãn sẽ hiện trên lisstbox không sử dụng nút button.
Đương nhiên được!
Sửa thành vầy:
PHP:
Private Sub TextBox1_Change()
  Dim Arr
  Arr = Filter2DArray(sArray, 2, TextBox1.Text & "*", False)
  Arr = Filter2DArray(Arr, 1, TextBox2.Text & "*", False)
  If IsArray(Arr) Then ListBox1.List() = Arr
End Sub
PHP:
Private Sub TextBox2_Change()
  Dim Arr
  Arr = Filter2DArray(sArray, 2, TextBox1.Text & "*", False)
  Arr = Filter2DArray(Arr, 1, TextBox2.Text & "*", False)
  If IsArray(Arr) Then ListBox1.List() = Arr
End Sub
Xóa code CommandButton3 đi...
Với code này thì:
- Gõ chuổi vào TextBox1 và bỏ trống TextBox2, sẽ lọc theo điều kiện TextBox1 (1 điều kiện)
- Gõ chuổi vào TextBox2 và bỏ trống TextBox1, sẽ lọc theo điều kiện TextBox2 (1 điều kiện)
- Gõ chuổi vào TextBox1 và TextBox2, sẽ lọc theo điều kiện 2 TextBox (2 điều kiện)
----------------------------------

- 1 cái nữa em học được 1 hàm sFilter (hình như cũng của Bác )
- em thấy cái này ngắn hơn , tuy nhiên nó chỉ thỏa mãn 1textbox
Hàm Filter2DArray tôi viết nó làm được nhiều việc hơn đấy:
- Thứ nhất: nó hoạt động trên cả Range và Array
- Thứ hai: Cho phép bạn tùy chọn lấy tiêu đề hay không
- Thứ ba: Cho phép dùng các toán tử so sánh =, >, <, <> ---> Thích hợp khi lọc từ ngày.. đến ngày...
- Thứ tư: Khi lọc Text, nó dùng toán tử Like nên có thể lọc theo những điều kiện phức tạp như: Lọc các giá trị = rổng, lọc các giá trị <> rổng hoặc lọc gần đúng
Nói chung, hàm của tôi có cách hoạt động giống như công cụ Filter của Excel, còn hàm mà bạn nói là "đơn giản" ấy đúng là do tôi viết nhưng từ thuở xa xưa lắm rồi, giớ mới thấy nó chẳng làm nên được cái tích sự gì
 
Lần chỉnh sửa cuối:
Chà ! Bác quả là thâm niên , em tự hỏi không biết có điều gì về excel mà bác ko biết !$@!!
hồi đó em mất cả tuần nghiên cứu hàm sfilter của bác giờ thì chắc mất gấp đôi để nghiên cứu Filter2DArray này . hihihihi
Chân thành cảm ơn Bác
 
Lần chỉnh sửa cuối:
Drear Bá NDU!
Cho em hỏi hàm Filter2DArray có áp dụng vào việc chỉnh sửa dữ liệu trực tiếp trên form luôn được ko ?
em dùng hàm này để lọc thì ok rồi ( có điều hơi chậm vì vùng data em tới mấy ngàn dòng ) , sau đó em mún biến tấu thêm chức năng chỉnh sửa trên form nữa .
Thanks Bác
 
Drear Bá NDU!
Cho em hỏi hàm Filter2DArray có áp dụng vào việc chỉnh sửa dữ liệu trực tiếp trên form luôn được ko ?
em dùng hàm này để lọc thì ok rồi ( có điều hơi chậm vì vùng data em tới mấy ngàn dòng ) , sau đó em mún biến tấu thêm chức năng chỉnh sửa trên form nữa .
Thanks Bác
Là sao? tôi không hiểu lắm! chỉnh sửa dữ liệu trực tiếp trên form là thế nào?
Nói chung là hàm Filter2DArray này hoạt động trên Array nên dù dữ liệu nằm trên Form hay trên sheet đều lọc được tất
 
Dear Bác !
Lọc thì ok rồi .
em có gửi kèm theo file , ở đây em xin nói thêm chút là ví dụ như em lọc 1 mã thiết bị . thì listbox sẽ hiện ra thỏa mãn yêu cầu của 2 textbox như bài #7 Bác làm cho em . Sau khi tìm được mã theo đúng yêu cầu giờ em mún sửa lại , vẫn là mã đó nhưng đổi tên khác rồi nhấn nút button nó sẽ cập nhật lại trên sheet .
Nếu được cho em thêm chức năng nữa là cập nhật mã mới .
PS : ở topic này http://www.giaiphapexcel.com/forum/showthread.php?45775-Listbox-b%E1%BB%8B-l%E1%BB%97i-khi-d%E1%BB%AF-li%E1%BB%87u-t%C4%83ng-l%C3%AAn-!!&
bài # 10 , hàm sFilter của Bác làm được 2 yêu cầu trên của em . nhưng vì Bác nói nó lâu rồi và ko hay bằng hàm Filter2DArray. mà em vẫn chưa thông được cái hàm Filter2DArray này +-+-+-+ nên nhờ Bác trợ giúp

Thanks Bác , chúc Bác buổi chiều vui vẻ
 

File đính kèm

Dear Bác !
Lọc thì ok rồi .
em có gửi kèm theo file , ở đây em xin nói thêm chút là ví dụ như em lọc 1 mã thiết bị . thì listbox sẽ hiện ra thỏa mãn yêu cầu của 2 textbox như bài #7 Bác làm cho em . Sau khi tìm được mã theo đúng yêu cầu giờ em mún sửa lại , vẫn là mã đó nhưng đổi tên khác rồi nhấn nút button nó sẽ cập nhật lại trên sheet .
Nếu được cho em thêm chức năng nữa là cập nhật mã mới .
PS : ở topic này http://www.giaiphapexcel.com/forum/showthread.php?45775-Listbox-bị-lỗi-khi-dữ-liệu-tăng-lên-!!&
bài # 10 , hàm sFilter của Bác làm được 2 yêu cầu trên của em . nhưng vì Bác nói nó lâu rồi và ko hay bằng hàm Filter2DArray. mà em vẫn chưa thông được cái hàm Filter2DArray này +-+-+-+ nên nhờ Bác trợ giúp

Thanks Bác , chúc Bác buổi chiều vui vẻ
Ôi... lại làm lại những thứ đã cũ (lười quá) ---> Bạn cứ nghiên cứu trước đi.. thấy cũng giống với file ở đường link trên thôi mà (chỉ khác có mỗi hàm Filter2DArray)
 
hic !
Em đã làm rồi , có lẻ do ko thông được hàm Filter2DArray nên em chỉ biết là thay thế chổ nòa có chữ sFilter thành Filter2DArray. (nghe có vẻ con vẹt quá !$@!!) , nếu em nghiên cứu tới lúc mà thông được chắc hàm Filter2DArray lúc đó nó lỗi thời như sFilter quá. hihihihi.
Chắc em sử dụng lại cái sFilter của bác . :(((((
Thanks Bác
 
hic !
Em đã làm rồi , có lẻ do ko thông được hàm Filter2DArray nên em chỉ biết là thay thế chổ nòa có chữ sFilter thành Filter2DArray. (nghe có vẻ con vẹt quá !$@!!) , nếu em nghiên cứu tới lúc mà thông được chắc hàm Filter2DArray lúc đó nó lỗi thời như sFilter quá. hihihihi.
Chắc em sử dụng lại cái sFilter của bác . :(((((
Thanks Bác
Bạn cứ tưởng tượng hàm Filter2DArray giống như chức năng Filter của Excel ấy
Cú pháp: Filter2DArray(Vùng dữ liệu, Chỉ số cột cần Filter, Từ khóa tìm kiếm, Có lấy tiêu đề hay không)
Áp vào như khi dùng hàm trên bảng tính thôi
 
Bạn cứ tưởng tượng hàm Filter2DArray giống như chức năng Filter của Excel ấy
Cú pháp: Filter2DArray(Vùng dữ liệu, Chỉ số cột cần Filter, Từ khóa tìm kiếm, Có lấy tiêu đề hay không)
Áp vào như khi dùng hàm trên bảng tính thôi

Vâng , em sẽ xem lại , thanks Bác nhiều -=.,,
 
Thanks bạn , nhưng cho mình hỏi trong file bạn sử dụng hàm sArray vậy ko biết có liên quan gì đến hàm Filter2DArray và hàm Filter2DArray có giá trị gì trong file ko ?
File đó bạn le tin cũng dùng hàm Filter2DArray đấy
Còn sArray mà bạn nói chính là biến mảng xác định vùng dữ liệu thôi, không phải hàm gì cả
(Phải xác định dữ liệu mình là cái gì rồi mới "ráp" vào hàm được chứ)
 
File đó bạn le tin cũng dùng hàm Filter2DArray đấy
Còn sArray mà bạn nói chính là biến mảng xác định vùng dữ liệu thôi, không phải hàm gì cả
(Phải xác định dữ liệu mình là cái gì rồi mới "ráp" vào hàm được chứ)
em vẫn chưa hiểu ? em ko thấy bạn ấy sử dụng hàm Filter2DArray trong các nút button?
Vậy có phải biến mảng sArray đó chính là dữ liệu trong cú pháp Bác cho em ?!(nếu đúng thì em ngầm hiểu được vấn đề rồi )
Còn biến "iR" em thấy khai báo nhưng ko sử dụng trong hàm ? nó có ý gì ? cái này em mù **~**
Thanks Bác
 
em vẫn chưa hiểu ? em ko thấy bạn ấy sử dụng hàm Filter2DArray trong các nút button?
Filter2DArray là để lọc dữ liệu khi bạn nhập từ khóa vào TextBox, đương nhiên code phải nằm trong TextBox chứ sao lại liên quan đến Button
Mã:
Private Sub TextBox1_Change()
  Dim Arr
  Arr = [B]Filter2DArray(sArray, 2, TextBox1.Text & "*", False)[/B]
  Arr = [B]Filter2DArray(Arr, 1, TextBox2.Text & "*", False)[/B]
  If IsArray(Arr) Then ListBox1.List() = Arr
End Sub
Mã:
Private Sub TextBox2_Change()
  Dim Arr
  Arr = [B]Filter2DArray(sArray, 2, TextBox1.Text & "*", False)[/B]
  Arr = [B]Filter2DArray(Arr, 1, TextBox2.Text & "*", False)[/B]
  If IsArray(Arr) Then ListBox1.List() = Arr
End Sub
-----------------------------
Vậy có phải biến mảng sArray đó chính là dữ liệu trong cú pháp Bác cho em ?!(nếu đúng thì em ngầm hiểu được vấn đề rồi )
Biến sArray chính là dữ liệu trên sheet của bạn... Nó được xác định ngay từ khi Form load:
Mã:
Private Sub UserForm_Initialize()
  Dim i As Long
  [B]sArray = Sheet6.Range(Sheet6.[C7], Sheet6.[K1000].End(xlUp)).Value[/B]
  For i = 1 To UBound(sArray)
    sArray(i, 4) = i + 6
  Next
  ListBox1.List() = sArray
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  SetWindowLong hWnd, -16, &H84C00000
  Me.TextBox3.Locked = True
  Me.TextBox4.Locked = True
  Me.TextBox5.Locked = True
End Sub
Chính là vùng dữ liệu tại sheet6, tính từ cell C7 đến cell cuối cùng có dữ liệu của cột K
-------------------------------------------
Còn biến "iR" em thấy khai báo nhưng ko sử dụng trong hàm ? nó có ý gì ? cái này em mù
Thanks Bác
Còn biến iR người ta lấy được khi ta chọn trên ListBox:
Mã:
Private Sub ListBox1_Click()
  Me.TextBox3 = Me.ListBox1.Column(0)
  Me.TextBox4 = Me.ListBox1.Column(1)
  Me.TextBox5 = Me.ListBox1.Column(2)
  [B]iR = Me.ListBox1.Column(3)[/B]
End Sub
sau đó dùng tại nút Ghi
Mã:
Private Sub CommandButton4_Click()
  [B]Cells(iR, 3) = Me.TextBox3
  Cells(iR, 4) = Me.TextBox4
  Cells(iR, 5) = Me.TextBox5[/B]
[B]  sArray(iR - 6, 1) = Me.TextBox3
  sArray(iR - 6, 2) = Me.TextBox4
  sArray(iR - 6, 3) = Me.TextBox5[/B]
  ListBox1.List() = sArray
End Sub
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom