vietlehoang
Thành viên mới
- Tham gia
- 15/7/21
- Bài viết
- 5
- Được thích
- 2
Bạn thử code dưới xem:Mình có fille dữ liệu cần lọc ngày theo thời gian nhập vào 2 ô G19, I19 trong Sheets menu mà không được nhờ cao thủ giúp
Option Explicit
'// Ham kiem tra xem ten sheet con ton tai trong file hay la khong
Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean
If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook
Dim obj As Object
On Error GoTo HandleError
Set obj = wbWorkbook.Sheets(strSheetName)
SheetExists = True
Exit Function
HandleError:
SheetExists = False
End Function
Sub locNgay()
'// Khai bao cac bien
Dim book As Workbook, shNhapVH As Worksheet, shLoc As Worksheet, shName As String
Dim rng As Range, rU As Range, fDate As Date, eDate As Date, r As Long
Set book = ThisWorkbook '// Voi chinh file chay code
Set shNhapVH = book.Worksheets("nhap_vh") '// Gan sheet "nhap_vh" = shNhapVH
'// Xac dinh dong cuoi trong sheet shNhapVH (sheet "nhap_vh")
r = shNhapVH.Cells(shNhapVH.Rows.Count, "A").End(xlUp).Row
If r < 7 Then '// Neu dong cuoi cung < 7
'// Thong bao du lieu ban dau khong co
MsgBox "Khong co du lieu", vbInformation + vbOKOnly
Exit Sub '// Thoat thu tuc
End If
fDate = book.Worksheets("Menu").Range("G19") '// Tu ngay
eDate = book.Worksheets("Menu").Range("I19") '// Den ngay
'// Neu khong nhap ngay thang loc hoac ngay sau > ngay truoc
If (fDate = 0) Or (eDate = 0) Or (fDate > eDate) Then
'// Thong bao ngay thang nam co van de
MsgBox "Kiem tra lai ngay thang", vbCritical + vbOKOnly
Exit Sub '// Thoat thu tuc
End If
shName = "loc_ngay" '// gan chuoi "loc_ngay" vao bien shName
'// kiem tra sheet co ten "loc_ngay" co ton tai trong file hay khong
If SheetExists(shName, book) Then
'// Neu dung la no ton tai thi gan sheet "loc_ngay" = shLoc
Set shLoc = book.Worksheets(shName)
Application.DisplayAlerts = False '// tat thong bao hoi xoa sheet
shLoc.Delete '// xoa sheet sheet "loc_ngay"
Application.DisplayAlerts = True '// bat lai thong bao (tra lai ban dau)
End If
'// copy sheet shNhapVH (sheet "nhap_vh") sang mot sheet moi thu tu cuoi cung tronf file
shNhapVH.Copy after:=book.Worksheets(book.Worksheets.Count)
'// gan sheet voi copy nay = shLoc va dat cho mot cai ten shName (="loc_ngay" da gan o tren)
Set shLoc = ActiveSheet: shLoc.Name = shName
For Each rng In shLoc.Range("E7:E" & r) '// duye trong cot ngay tu dong 6 den dong cuoi cung
'// neu gia tri tim duoc < ngay bat dau hoac > ngay sau thi ..
If (rng.Value < fDate) Or (rng.Value) > eDate Then
'// gan dong tim duoc vao biet rU, cu tim duoc gia tri thoa man la gan het vao rU
If rU Is Nothing Then Set rU = rng Else Set rU = Union(rU, rng)
End If
Next rng
'// Kiem tra xem rU co ton tai (co gia tri khong thoa man dieu kien khong)
If Not rU Is Nothing Then rU.EntireRow.Delete '// Neu thoa man thi xoa
'// Thong bao ket thuc
MsgBox "Da loc xong.", vbInformation + vbOKOnly
End Sub
Code kinh khủng quá. Cả 3 loại lọc chỉ cần 1 sub ngắn gọn như vầy:Bạn thử code dưới xem:
Sub AdvFilter()
Sheet2.Range("A6:R378").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheet0.Range("I1:J2"), CopyToRange:=Sheet5.Range("A1:R1") _
, Unique:=False
Sheet5.Name = Sheet0.[I1].value
Sheet5.Activate
End Sub
Sub Loc()
Sheets("nhap_vh").[A6:R10000].AdvancedFilter 2, Sheets("nhap_vh").[B2:B3], Sheets("Data").[A1:I1]
Sheets("Data").Select
End Sub
Mới có 1 điều kiện lọc. Ngoài ra tiêu đề chỉ cần đúng, không cần giống thứ tựChỉ cần thay các tiêu đề ở Sheet Data giống tiêu đề ở sheet nhap_vh, với code Advanced Filter, thì mọi thứ trở nên rất đơn giản.
Code kinh khủng quá. Cả 3 loại lọc chỉ cần 1 sub ngắn gọn như vầy:
PHP:Sub AdvFilter() Sheet2.Range("A6:R378").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheet0.Range("I1:J2"), CopyToRange:=Sheet5.Range("A1:R1") _ , Unique:=False Sheet5.Name = Sheet0.[I1].value Sheet5.Activate End Sub
Sheet Menu chỉ cần như vầy:
View attachment 264340
Option Explicit
'// Ham kiem tra xem ten sheet con ton tai trong file hay la khong
Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean
If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook
Dim obj As Object
On Error GoTo HandleError
Set obj = wbWorkbook.Sheets(strSheetName)
SheetExists = True
Exit Function
HandleError:
SheetExists = False
End Function
Public Sub locNgay()
'// Khai bao cac bien
Dim book As Workbook, shNhapVH As Worksheet, shLoc As Worksheet, rng As Range, rU As Range
Dim fDate As Date, eDate As Date, r As Long, shName As String, sNgayLoc As String, iCol As Integer
Set book = ThisWorkbook '// Voi chinh file chay code
Set shNhapVH = book.Worksheets("nhap_vh") '// Gan sheet "nhap_vh" = shNhapVH
'// Xac dinh dong cuoi trong sheet shNhapVH (sheet "nhap_vh")
r = shNhapVH.Cells(shNhapVH.Rows.Count, "A").End(xlUp).Row
If r < 7 Then '// Neu dong cuoi cung < 7
'// Thong bao du lieu ban dau khong co
MsgBox "Khong co du lieu", vbInformation + vbOKOnly
Exit Sub '// Thoat thu tuc
End If
'// Gan cac gia tri trong shete Menu vao cac bien
fDate = book.Worksheets("Menu").Range("G19") '// Tu ngay
eDate = book.Worksheets("Menu").Range("I19") '// Den ngay
sNgayLoc = book.Worksheets("Menu").Range("G21") '// Cot ngay can loc
On Error Resume Next '// Bat loi neu khong tim thay ngay can loc
'// Kiem cot vi tri cot ngay can loc xem la cot dung tu may
iCol = Application.Match(sNgayLoc, shNhapVH.Range("A6:R6"), 0)
On Error GoTo 0 '// xoa bat loi
If iCol = 0 Then '// Neu khong tim thay vi tri ngay can loc
'// Thong bao khong thay ngay loc
MsgBox "Khong tim thay ngay loc", vbInformation + vbOKOnly
Exit Sub '// Thoat thu tuc
End If
'// Neu khong nhap ngay thang loc hoac ngay sau > ngay truoc
If (fDate = 0) Or (eDate = 0) Or (fDate > eDate) Then
'// Thong bao ngay thang nam co van de
MsgBox "Kiem tra lai ngay thang", vbCritical + vbOKOnly
Exit Sub '// Thoat thu tuc
End If
shName = "loc_ngay" '// gan chuoi "loc_ngay" vao bien shName
'// kiem tra sheet co ten "loc_ngay" co ton tai trong file hay khong
If SheetExists(shName, book) Then
'// Neu dung la no ton tai thi gan sheet "loc_ngay" = shLoc
Set shLoc = book.Worksheets(shName)
Application.DisplayAlerts = False '// tat thong bao hoi xoa sheet
shLoc.Delete '// xoa sheet sheet "loc_ngay"
Application.DisplayAlerts = True '// bat lai thong bao (tra lai ban dau)
End If
'// copy sheet shNhapVH (sheet "nhap_vh") sang mot sheet moi thu tu cuoi cung tronf file
shNhapVH.Copy after:=book.Worksheets(book.Worksheets.Count)
'// gan sheet voi copy nay = shLoc va dat cho mot cai ten shName (="loc_ngay" da gan o tren)
Set shLoc = ActiveSheet: shLoc.Name = shName
'// duyet trong cot ngay tu dong 6 den dong cuoi cung
For Each rng In shLoc.Range("A7:A" & r).Offset(, iCol - 1)
'// neu gia tri tim duoc < ngay bat dau hoac > ngay sau thi ..
If (rng.Value < fDate) Or (rng.Value > eDate) Then
'// gan dong tim duoc vao biet rU, cu tim duoc gia tri thoa man la gan het vao rU
If rU Is Nothing Then Set rU = rng Else Set rU = Union(rU, rng)
End If
Next rng
'// Kiem tra xem rU co ton tai (co gia tri khong thoa man dieu kien khong)
If Not rU Is Nothing Then rU.EntireRow.Delete '// Neu thoa man thi xoa
'// Thong bao ket thuc
MsgBox "Da loc xong ", vbInformation + vbOKOnly
End Sub
File bài 1 có 3 nút nhấn, chạy 3 sub khủng để lọc 3 kiểu.Ồ thì ra là lọc 1 trong 3 loại ngày , con nhìn code của bạn ấy ở bài 1 con thấy mỗi cột 5 con tưởng chỉ lọc cột ngày này.
Nếu 3 loại ngày thì thiết kế thêm một ô G21 trong sheet Menu như ảnh bên dưới, ô này để chọn ngày cần lọc:
File bài 1 có 3 nút nhấn, chạy 3 sub khủng để lọc 3 kiểu.
Combobox hay option button hay gì cũng được, chỉ cần 1 vài câu lệnh trong đó có advanced filter là xong như bài #5, sao cứ phải code khủng như vậy chứ. Lại còn xoá sheet tạo sheet cho mất công kiểm tra sự tồn tại.
20 câu lệnh so với 2 câu lệnh là khủng. Với vấn đề phức tạp cần làm cho đơn giản bớt đi, tư duy thoáng đi, cộng với tư duy đập đi xây lại cho nhanh.Chắc tại code nhiều ghi chú quá trời trông như viết văn nên chú Mỹ không quen chứ khủng khiếp đến đâu ạ
Thank mọi người20 câu lệnh so với 2 câu lệnh là khủng. Với vấn đề phức tạp cần làm cho đơn giản bớt đi, tư duy thoáng đi, cộng với tư duy đập đi xây lại cho nhanh.
Ồ thì ra là lọc 1 trong 3 loại ngày , con nhìn code của bạn ấy ở bài 1 con thấy mỗi cột 5 con tưởng chỉ lọc cột ngày này.
Nếu 3 loại ngày thì thiết kế thêm một ô G21 trong sheet Menu như ảnh bên dưới, ô này để chọn ngày cần lọc:
View attachment 264356
Code lọc theo ngày lựa chọn trong ô G21:
Mã:Option Explicit '// Ham kiem tra xem ten sheet con ton tai trong file hay la khong Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook Dim obj As Object On Error GoTo HandleError Set obj = wbWorkbook.Sheets(strSheetName) SheetExists = True Exit Function HandleError: SheetExists = False End Function Public Sub locNgay() '// Khai bao cac bien Dim book As Workbook, shNhapVH As Worksheet, shLoc As Worksheet, rng As Range, rU As Range Dim fDate As Date, eDate As Date, r As Long, shName As String, sNgayLoc As String, iCol As Integer Set book = ThisWorkbook '// Voi chinh file chay code Set shNhapVH = book.Worksheets("nhap_vh") '// Gan sheet "nhap_vh" = shNhapVH '// Xac dinh dong cuoi trong sheet shNhapVH (sheet "nhap_vh") r = shNhapVH.Cells(shNhapVH.Rows.Count, "A").End(xlUp).Row If r < 7 Then '// Neu dong cuoi cung < 7 '// Thong bao du lieu ban dau khong co MsgBox "Khong co du lieu", vbInformation + vbOKOnly Exit Sub '// Thoat thu tuc End If '// Gan cac gia tri trong shete Menu vao cac bien fDate = book.Worksheets("Menu").Range("G19") '// Tu ngay eDate = book.Worksheets("Menu").Range("I19") '// Den ngay sNgayLoc = book.Worksheets("Menu").Range("G21") '// Cot ngay can loc On Error Resume Next '// Bat loi neu khong tim thay ngay can loc '// Kiem cot vi tri cot ngay can loc xem la cot dung tu may iCol = Application.Match(sNgayLoc, shNhapVH.Range("A6:R6"), 0) On Error GoTo 0 '// xoa bat loi If iCol = 0 Then '// Neu khong tim thay vi tri ngay can loc '// Thong bao khong thay ngay loc MsgBox "Khong tim thay ngay loc", vbInformation + vbOKOnly Exit Sub '// Thoat thu tuc End If '// Neu khong nhap ngay thang loc hoac ngay sau > ngay truoc If (fDate = 0) Or (eDate = 0) Or (fDate > eDate) Then '// Thong bao ngay thang nam co van de MsgBox "Kiem tra lai ngay thang", vbCritical + vbOKOnly Exit Sub '// Thoat thu tuc End If shName = "loc_ngay" '// gan chuoi "loc_ngay" vao bien shName '// kiem tra sheet co ten "loc_ngay" co ton tai trong file hay khong If SheetExists(shName, book) Then '// Neu dung la no ton tai thi gan sheet "loc_ngay" = shLoc Set shLoc = book.Worksheets(shName) Application.DisplayAlerts = False '// tat thong bao hoi xoa sheet shLoc.Delete '// xoa sheet sheet "loc_ngay" Application.DisplayAlerts = True '// bat lai thong bao (tra lai ban dau) End If '// copy sheet shNhapVH (sheet "nhap_vh") sang mot sheet moi thu tu cuoi cung tronf file shNhapVH.Copy after:=book.Worksheets(book.Worksheets.Count) '// gan sheet voi copy nay = shLoc va dat cho mot cai ten shName (="loc_ngay" da gan o tren) Set shLoc = ActiveSheet: shLoc.Name = shName '// duyet trong cot ngay tu dong 6 den dong cuoi cung For Each rng In shLoc.Range("A7:A" & r).Offset(, iCol - 1) '// neu gia tri tim duoc < ngay bat dau hoac > ngay sau thi .. If (rng.Value < fDate) Or (rng.Value > eDate) Then '// gan dong tim duoc vao biet rU, cu tim duoc gia tri thoa man la gan het vao rU If rU Is Nothing Then Set rU = rng Else Set rU = Union(rU, rng) End If Next rng '// Kiem tra xem rU co ton tai (co gia tri khong thoa man dieu kien khong) If Not rU Is Nothing Then rU.EntireRow.Delete '// Neu thoa man thi xoa '// Thong bao ket thuc MsgBox "Da loc xong ", vbInformation + vbOKOnly End Sub
Thank ban, đã giải quyết được vấn đềƠ con đâu có biết đâu ạ.
Con thấy Bạn ấy có nói là chương trình chạy tốt và copy sang sheet mới như ở đây nên con mới viết theo ý tưởng của Bạn ấy,
View attachment 264372
Chắc tại code nhiều ghi chú quá trời trông như viết văn nên chú Mỹ không quen chứ khủng khiếp đến đâu ạ
Công thức vùng điều kiện khủng quáThay đổi vùng điều kiện chút, với các option chọn,
Khác về vùng điều kiện so với sư phụ @ptm0412 , còn bản chất thì giống nhau.
Vâng, vùng điều kiện của sư phụ chuẩn quá rồi.Công thức vùng điều kiện khủng quá
=IF($N$3=1,AND(nhap_vh!$E7>=Menu!$G$19,nhap_vh!$E7<=Menu!$I$19),IF(Menu!$N$3=2,AND(nhap_vh!$J7>=Menu!$G$19,nhap_vh!$J7<=Menu!$I$19),IF(Menu!$N$3=3,AND(nhap_vh!$O7>=Menu!$G$19,nhap_vh!$O7<=Menu!$I$19))))
"Bản chất giống nhau", nhưng tư duy khác nhau, Khác ở chỗ phức tạp hoá hay đơn giản hoá.