giúp mình về cách lọc phiếu nhập, số lượng, mã hàng trong bảng nhập liệu (1 người xem)

Liên hệ QC

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

thuanviet

Thành viên mới
Tham gia
12/11/10
Bài viết
34
Được thích
0
Hiện giờ mình đã lọc được theo ngày tháng nhưng mình làm hoài vẫn chưa lọc được số chứng từ, số lượng, và mã hàng. Khi lọc xong thì nó hiện ra listbox và khi click vào để nó nhảy tới dòng cần chọn thì báo lổi.Vì dữ liệu mình rất nhiều nên rất cần cài này nên nhờ các bạn xem giúp mình với. Mình xin cảm ơn trước nhé!
 
Lần chỉnh sửa cuối:
Hiện giờ mình đã lọc được theo ngày tháng nhưng mình làm hoài vẫn chưa lọc được số chứng từ, số lượng, và mã hàng. Khi lọc xong thì nó hiện ra listbox và khi click vào để nó nhảy tới dòng cần chọn thì báo lổi.Vì dữ liệu mình rất nhiều nên rất cần cài này nên nhờ các bạn xem giúp mình với. Mình xin cảm ơn trước nhé!
Bạn nói lọc ngày được (nên không làm cho nút này) thì làm các nút khác tương tự vậy thôi
 

File đính kèm

Upvote 0
Cảm ơn Việt Hoài nha! Tất cả đều ok rồi chỉ còn có khi Click vào ô listbox thì nó cứ báo lỗi hoài, nó không du chuyển tới ô cần chọn. Có gì bạn sửa dùng mình luôn nha! Còn hàm lọc phiếu xuất sao mình làm giống phiếu nhập không được vậy!
 
Upvote 0
khi Click vào ô listbox thì nó cứ báo lỗi hoài, nó không du chuyển tới ô cần chọn
[GPECODE=vb]Private Sub ListLoc_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MyID As String
Dim Rng As Range
With Me.ListLoc
MyID = .List(.ListIndex, 1)
End With
Set Rng = Range(Sheet4.[B11], Sheet4.[B65536].End(xlUp)) _
.Find(MyID, , LookAt:=xlWhole)
If Not Rng Is Nothing Then
Unload Me
Rng.Select
End If
End Sub[/GPECODE]
Còn hàm lọc phiếu xuất sao mình làm giống phiếu nhập không được vậy!
Câu lệnh: Arr = Filter2DArray(sArray, 4, Me.TextBox2.Value, False)
Sửa số 4 thánh số 5 là được mà
 
Upvote 0
sao ngày trong bảng listbox nó chạy ngược vậy anh Hoài. Trong list thì nó hiện tháng trước ngày sau sai với bảng nhập liệu! A chỉ giùm em với!
 
Upvote 0
sao ngày trong bảng listbox nó chạy ngược vậy anh Hoài. Trong list thì nó hiện tháng trước ngày sau sai với bảng nhập liệu! A chỉ giùm em với!
Máy mình có bị đâu, bạn chỉnh ngày trong hệ thống lại xem
Nếu lọc ngày sửa dụng hàm Filter2DArray thì mình mình làm như thế này
[GPECODE=vb]Private Sub THien_Click()
Dim MyArr(), Arr()
On Error Resume Next
ReDim Arr(1 To 11, 1 To 1)
MyArr = Filter2DArray(sArray, 1, ">=Date(" & Year(CDate(Me.Tu.Value)) & "," & Month(CDate(Me.Tu.Value)) & "," & Day(CDate(Me.Tu.Value)) & ")", False)
Arr = Filter2DArray(MyArr, 1, "<=Date(" & Year(CDate(Me.Den.Value)) & "," & Month(CDate(Me.Den.Value)) & "," & Day(CDate(Me.Den.Value)) & ")", False)
If Not IsArray(Arr) Then Me.ListLoc.Clear: Exit Sub
ListLoc.List() = IIf(Trim(Me.Tu.Text) = "" Or Trim(Me.Den.Text) = "", sArray, Arr)
End Sub


[/GPECODE]
 
Upvote 0
Function Filter2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean)
Dim TmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp, Chk As Boolean, TmpVal As Double
On Error Resume Next
Set Dic = CreateObject("Scripting.Dictionary")
TmpArr = sArray
ColIndex = ColIndex + LBound(TmpArr, 2) - 1
Chk = (InStr("><=", Left(FindStr, 1)) > 0)
For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
If Chk And FindStr <> "" Then
TmpVal = CDbl(TmpArr(i, ColIndex))
If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
Else
If Left(FindStr, 1) = "!" Then
If Not (UCase(TmpArr(i, ColIndex)) Like UCase(Mid(FindStr, 2, Len(FindStr)))) Then Dic.Add i, ""
Else
If UCase(TmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
End If
End If
Next
If Dic.Count > 0 Then
Tmp = Dic.Keys
ReDim Arr(LBound(TmpArr, 1) To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle, LBound(TmpArr, 2) To UBound(TmpArr, 2))
For i = LBound(TmpArr, 1) - HasTitle To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle
For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
Arr(i, j) = TmpArr(Tmp(i - LBound(TmpArr, 1) + HasTitle), j)
Next
Next
If HasTitle Then
For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
Arr(LBound(TmpArr, 1), j) = TmpArr(LBound(TmpArr, 1), j)
Next
End If
End If
Filter2DArray = Arr
End Function
 
Upvote 0
Function Filter2DArray(ByVal sArray, _
ByVal ColIndex As Long, _
ByVal FindStr1 As String, _
ByVal HasTitle As Boolean, _
Optional ByVal FindStr2, _
Optional ByVal arg_and As Boolean = True)

Dim TmpVal As Double
Dim currRow As Long, i As Long, j As Long
Dim Chk As Boolean, res As Boolean
Dim sArr As String, sFind As String
Dim Dic, Arr, Tmp, TmpArr, TmpStr

On Error Resume Next

Set Dic = CreateObject("Scripting.Dictionary")

TmpArr = sArray

ColIndex = ColIndex + LBound(TmpArr, 2) - 1

If FindStr1 <> "" Then
Chk = InStr("><=", Left(FindStr1, 1)) > 0
If Not IsMissing(FindStr2) And (FindStr2 <> "") Then
Chk = Chk And (InStr("><=", Left(FindStr1, 1)) > 0)
End If
End If

For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
If Chk Then
TmpVal = CDbl(TmpArr(i, ColIndex))
If Err.Number = 0 Then
res = Evaluate(TmpVal & FindStr1)
If Not IsMissing(FindStr2) And (FindStr2 <> "") Then
If arg_and Then
res = res And Evaluate(TmpVal & FindStr2)
Else
res = res Or Evaluate(TmpVal & FindStr2)
End If
End If
Else
Err.Clear
End If
Else
sArr = UCase(TmpArr(i, ColIndex))

If Left(FindStr1, 1) = "!" Then
res = Not (sArr Like UCase(Mid(FindStr1, 2, Len(FindStr1))))
Else
res = sArr Like UCase(FindStr1)
End If

If Not IsMissing(FindStr2) Then
If Left(FindStr2, 1) = "!" Then
If arg_and Then
res = res And Not (sArr Like UCase(Mid(FindStr2, 2, Len(FindStr2))))
Else
res = res Or Not (sArr Like UCase(Mid(FindStr2, 2, Len(FindStr2))))
End If
Else
If arg_and Then
res = res And (sArr Like UCase(FindStr2))
Else
res = res Or (sArr Like UCase(FindStr2))
End If
End If
End If
End If

If res Then Dic.Add i, ""
Next

If Dic.Count > 0 Then
Tmp = Dic.Keys

ReDim Arr(LBound(TmpArr, 1) To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle, LBound(TmpArr, 2) To UBound(TmpArr, 2))

For i = LBound(TmpArr, 1) - HasTitle To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle
currRow = i - LBound(TmpArr, 1) + HasTitle
For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
Arr(i, j) = TmpArr(Tmp(currRow), j)
Next
Next

If HasTitle Then
For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
Arr(LBound(TmpArr, 1), j) = TmpArr(LBound(TmpArr, 1), j)
Next
End If
End If

Filter2DArray = Arr

Set Dic = Nothing
Erase Arr, TmpArr
End Function
 
Upvote 0
Hiện mình có 2 hàm tìm kiếm nhưng khi copy vào thì nó báo lỗi, bạn có thể ghép 2 hàm này là 01 được không. Mình có 2 form tìm kiếm cho 2 sheet khác nhau nên mình không biết làm thế nào cả! Cảm ơn Hoài nhiều!
 
Upvote 0

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

Back
Top Bottom