tuyettrang186
Thành viên mới

- Tham gia
- 11/12/10
- Bài viết
- 30
- Được thích
- 4
Nhờ anh chị viết dùm em code lọc trong ví dụ dưới đây.
Nhờ anh chị viết dùm em code lọc trong ví dụ dưới đây.
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
On Error Resume Next
If Target.Address = "$C$1" Then
Range("A5:F65000").ClearContents
With S1.Range(S1.[A6], S1.[A65000].End(3)).Resize(, 6)
.AutoFilter 2, Range("C1")
Union(.Resize(, 1).Offset(1, 0), .Offset(1, 2).Resize(, 4)).SpecialCells(12).Copy Range("A5")
.AutoFilter
End With
End If
End Sub
Thấy bạn có msg hỏi về array, vậy bây giờ tôi làm lại theo hướng range, nghiên cứu đi và chuyển sang array.Bạn dùng sự kiện Change nhé:
PHP:Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False On Error Resume Next If Target.Address = "$C$1" Then Range("A5:F65000").ClearContents With S1.Range(S1.[A6], S1.[A65000].End(3)).Resize(, 6) .AutoFilter 2, Range("C1") Union(.Resize(, 1).Offset(1, 0), .Offset(1, 2).Resize(, 4)).SpecialCells(12).Copy Range("A5") .AutoFilter End With End If End Sub
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Address = "$C$1" Then
Range("A5:F65000").ClearContents
LocRng
End If
End Sub
Sub LocRng()
Dim myRng As Range, sMa As String
Dim iR As Long, iC As Long, fR As Long
With Application
.ScreenUpdating = False: .EnableEvents = False
End With
sMa = S2.[C1]: fR = 4
With S1
Set myRng = .Range(.[A7], .[A65000].End(3)).Resize(, 6)
With myRng
For iR = 1 To myRng.Rows.Count
If myRng(iR, 2) = sMa Then
fR = fR + 1
S2.Cells(fR, 1) = myRng(iR, 1) 'ngay
For iC = 3 To 5 'chi tiet
S2.Cells(fR, iC - 1) = myRng(iR, iC)
Next iC
End If
Next iR
End With
End With
Set myRng = Nothing
With Application
.ScreenUpdating = True: .EnableEvents = True
End With
End Sub
Vầy được khôngHiểu sẽ hướng dẫn thay myRng = myArr.
Chúc thành công.
Sub sFilter(sRng As Range, Criteria, Col As Long, Target As Range)
Dim tmpArr, Arr, i As Long, j As Long, n As Long
On Error GoTo ExitSub
tmpArr = sRng.Value
ReDim Arr(1 To UBound(tmpArr, 1), 1 To UBound(tmpArr, 2))
For i = 1 To UBound(tmpArr, 1)
If tmpArr(i, Col) = Criteria Then
n = n + 1
For j = 1 To UBound(tmpArr, 2)
Arr(n, j) = tmpArr(i, j)
Next j
End If
Next i
Target.Resize(n, j - 1).Value = Arr
ExitSub:
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sRng As Range, Criteria, Col As Long
If Target.Address = "$C$1" Then
Range("A5:F60000").Clear
Set sRng = Sheet1.Range(Sheet1.[A7], Sheet1.[A65536].End(xlUp)).Resize(, 6)
Col = 2
sFilter sRng, Target.Value, Col, Range("A5")
End If
End Sub
Thấy bạn có msg hỏi về array, vậy bây giờ tôi làm lại theo hướng range, nghiên cứu đi và chuyển sang array.
Hiểu sẽ hướng dẫn thay myRng = myArr.PHP:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Address = "$C$1" Then Range("A5:F65000").ClearContents LocRng End If End Sub Sub LocRng() Dim myRng As Range, sMa As String Dim iR As Long, iC As Long, fR As Long With Application .ScreenUpdating = False: .EnableEvents = False End With sMa = S2.[C1]: fR = 4 With S1 Set myRng = .Range(.[A7], .[A65000].End(3)).Resize(, 6) With myRng For iR = 1 To myRng.Rows.Count If myRng(iR, 2) = sMa Then fR = fR + 1 S2.Cells(fR, 1) = myRng(iR, 1) 'ngay For iC = 3 To 5 'chi tiet S2.Cells(fR, iC - 1) = myRng(iR, iC) Next iC End If Next iR End With End With Set myRng = Nothing With Application .ScreenUpdating = True: .EnableEvents = True End With End Sub
Chúc thành công.
For iC = 3 To 5 'chi tiet
For iC = 3 To 6 'chi tiet
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Address = "$D$3" Then
Range("A7:G65000").ClearContents
LocArr
End If
End Sub
Sub LocArr()
Dim rngV As Range, sCode As String
Dim iR As Long, iC As Long, fR As Long
With Application
.ScreenUpdating = False: .EnableEvents = False
End With
sCode = S2.[D3]: fR = 6
With S1
Set rngV = .Range(.[A1], .[A65000].End(3)).Offset(1).Resize(, 8)
With rngV
For iR = 1 To .Rows.Count
If rngV(iR, 4) = sCode Then
fR = fR + 1
S2.Cells(fR, 1).Resize(, 3) = rngV(iR, 1)
Union(S2.Cells(fR, 1), S2.Cells(fR, 3)).NumberFormat = "dd/MM/yy"
For iC = 5 To 8
S2.Cells(fR, iC - 1) = rngV(iR, iC)
Next iC
End If
Next iR
End With
End With
Set rngV = Nothing
With Application
.ScreenUpdating = True: .EnableEvents = True
End With
End Sub
Code này và code của ThuNghi cùng lắm chỉ chạy được trên file này mà thôiDự vào ví dụ của anh ThuNghi em cũng là 1 ví dụ này, anh ThuNghi và các AC xem nhé!
Vầy được không
1> Trong Module
2> Trong sheet2PHP:Sub sFilter(sRng As Range, Criteria, Col As Long, Target As Range) Dim tmpArr, Arr, i As Long, j As Long, n As Long On Error GoTo ExitSub tmpArr = sRng.Value ReDim Arr(1 To UBound(tmpArr, 1), 1 To UBound(tmpArr, 2)) For i = 1 To UBound(tmpArr, 1) If tmpArr(i, Col) = Criteria Then n = n + 1 For j = 1 To UBound(tmpArr, 2) Arr(n, j) = tmpArr(i, j) Next j End If Next i Target.Resize(n, j - 1).Value = Arr ExitSub: End Sub
PHP:Private Sub Worksheet_Change(ByVal Target As Range) Dim sRng As Range, Criteria, Col As Long If Target.Address = "$C$1" Then Range("A5:F60000").Clear Set sRng = Sheet1.Range(Sheet1.[A7], Sheet1.[A65536].End(xlUp)).Resize(, 6) Col = 2 sFilter sRng, Target.Value, Col, Range("A5") End If End Sub
Tạm sửa thành vầy điAnh ndu ơi, bên sheet2 em chi muốn có dữ liệu ở các cột này: Ngay, Ten, sl, dg, t_tien thì phải sửa code của anh như thế nào?
Em đã tìm nhưng vẫn cho cho kết quả đúng!
Anh ndu sửa dùm em nha!
Sub sFilter(sRng As Range, Criteria, Col As Long, InCol As Boolean, Target As Range)
Dim tmpArr, Arr, i As Long, j As Long, n As Long, iC As Long
On Error GoTo ExitSub
tmpArr = sRng.Value
ReDim Arr(1 To UBound(tmpArr, 1), 1 To IIf(InCol, UBound(tmpArr, 2), UBound(tmpArr, 2) - 1))
For i = 1 To UBound(tmpArr, 1)
iC = 1
If tmpArr(i, Col) = Criteria Then
n = n + 1
For j = 1 To UBound(tmpArr, 2)
If InCol Then
Arr(n, iC) = tmpArr(i, j)
iC = iC + 1
Else
If j <> Col Then
Arr(n, iC) = tmpArr(i, j)
iC = iC + 1
End If
End If
Next j
End If
Next i
Target.Resize(n, j - IIf(InCol, 1, 2)).Value = Arr
ExitSub:
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sRng As Range, Criteria, Col As Long
If Target.Address = "$C$1" Then
Range("A5:F60000").Clear
Set sRng = Sheet1.Range(Sheet1.[A7], Sheet1.[A65536].End(xlUp)).Resize(, 6)
Col = 2
[B][COLOR=red]sFilter sRng, Target.Value, Col, False, Range("A5")[/COLOR][/B]
End If
End Sub
Bạn đã tìm ra như vậy thì vận dụngAnh ơi, dòng này:
thành:PHP:For iC = 3 To 5 'chi tiet
PHP:For iC = 3 To 6 'chi tiet
Arr(n, 1) = tmpArr(n, 1)
For j = 3 To UBound(tmpArr, 2)
Arr(n, j - 1) = tmpArr(i, j)
Next j