Lọc dữ liệu theo khoảng thời gian mình chọn

khibennhau

Thành viên mới
Tham gia ngày
7 Tháng một 2012
Bài viết
24
Được thích
1
Điểm
0
Chào các bác,

Giả sử mình có một sheet có tên "Data" dữ liệu nhập theo ngày tháng năm, ở sheet "report" mình muốn mọi dữ liệu trong khoảng thời gian mình chọn sẽ xuất hiện ở sheet này. Mình phải làm sao, mong mọi người giúp. Cảm ơn mọi người nhiều.
 

File đính kèm

gtri

Thành viên tích cực
Tham gia ngày
6 Tháng ba 2009
Bài viết
845
Được thích
583
Điểm
860
Chào các bác,

Giả sử mình có một sheet có tên "Data" dữ liệu nhập theo ngày tháng năm, ở sheet "report" mình muốn mọi dữ liệu trong khoảng thời gian mình chọn sẽ xuất hiện ở sheet này. Mình phải làm sao, mong mọi người giúp. Cảm ơn mọi người nhiều.
Dùng công thức thì thử cái này
sheet report
A5=IFERROR(INDIRECT("data!"&ADDRESS(SUMPRODUCT(LARGE((data!$A$3:$A$9>=$B$2)*(data!$A$3:$A$9<=$D$2)*ROW(data!$A$3:$A$9),ROWS($A$5:A5))),COLUMN())),"")
copy xuống dưới và sang ngang
 

hpkhuong

######
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,616
Được thích
4,054
Điểm
560
Nơi ở
Quận 2 - TP.HCM
Chào các bác,

Giả sử mình có một sheet có tên "Data" dữ liệu nhập theo ngày tháng năm, ở sheet "report" mình muốn mọi dữ liệu trong khoảng thời gian mình chọn sẽ xuất hiện ở sheet này. Mình phải làm sao, mong mọi người giúp. Cảm ơn mọi người nhiều.
Bạn có thể dùng công cụ Advanced Filter của Excel để trích lọc dữ liệu.
Nếu chưa biết sử dụng AF thì tham khảo link sau: http://www.giaiphapexcel.com/forum/showthread.php?91232-Tài-liệu-tìm-hiểu-trích-lọc-dữ-liệu-với-Advanced-Filter

Nếu muốn code thì thử đoạn này
Mã:
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long
    Dk1 = Sheet2.[B2].Value
    Dk2 = Sheet2.[D2].Value
    DL = Sheet1.Range("A2:D65000")
        For r = 2 To UBound(DL)
            If DL(r, 1) >= Dk1 And Dk1 <> Empty And DL(r, 1) <= Dk2 And Dk2 <> Empty Then
                i = i + 1
                    For j = 1 To 4
                        kq(i, j) = DL(r, j)
                    Next j
            End If
        Next r
    If i Then
        Sheet2.Range("A5:D65000").ClearContents
        Sheet2.Range("A5").Resize(i, 4) = kq
    Else
        Sheet2.Range("A5:D65000").ClearContents
    End If
Application.ScreenUpdating = True
End Sub
 

khibennhau

Thành viên mới
Tham gia ngày
7 Tháng một 2012
Bài viết
24
Được thích
1
Điểm
0
Dùng công thức thì thử cái này
sheet report
A5=IFERROR(INDIRECT("data!"&ADDRESS(SUMPRODUCT(LARGE((data!$A$3:$A$9>=$B$2)*(data!$A$3:$A$9<=$D$2)*ROW(data!$A$3:$A$9),ROWS($A$5:A5))),COLUMN())),"")
copy xuống dưới và sang ngang
Cảm ơn bạn, dữ liệu mình định làm hơn 20.000 dòng, kéo công thức chắc chết @$@!^%
 

khibennhau

Thành viên mới
Tham gia ngày
7 Tháng một 2012
Bài viết
24
Được thích
1
Điểm
0
Bạn có thể dùng công cụ Advanced Filter của Excel để trích lọc dữ liệu.
Nếu chưa biết sử dụng AF thì tham khảo link sau: http://www.giaiphapexcel.com/forum/showthread.php?91232-Tài-liệu-tìm-hiểu-trích-lọc-dữ-liệu-với-Advanced-Filter

Nếu muốn code thì thử đoạn này
Mã:
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long
    Dk1 = Sheet2.[B2].Value
    Dk2 = Sheet2.[D2].Value
    DL = Sheet1.Range("A2:D65000")
        For r = 2 To UBound(DL)
            If DL(r, 1) >= Dk1 And Dk1 <> Empty And DL(r, 1) <= Dk2 And Dk2 <> Empty Then
                i = i + 1
                    For j = 1 To 4
                        kq(i, j) = DL(r, j)
                    Next j
            End If
        Next r
    If i Then
        Sheet2.Range("A5:D65000").ClearContents
        Sheet2.Range("A5").Resize(i, 4) = kq
    Else
        Sheet2.Range("A5:D65000").ClearContents
    End If
Application.ScreenUpdating = True
End Sub
Cảm ơn bạn nhiều, đúng là mình đang cần code để chạy }}}}}, mình chạy code được rồi /-*+/
 

khibennhau

Thành viên mới
Tham gia ngày
7 Tháng một 2012
Bài viết
24
Được thích
1
Điểm
0
Bạn có thể dùng công cụ Advanced Filter của Excel để trích lọc dữ liệu.
Nếu chưa biết sử dụng AF thì tham khảo link sau: http://www.giaiphapexcel.com/forum/showthread.php?91232-Tài-liệu-tìm-hiểu-trích-lọc-dữ-liệu-với-Advanced-Filter

Nếu muốn code thì thử đoạn này
Mã:
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long
    Dk1 = Sheet2.[B2].Value
    Dk2 = Sheet2.[D2].Value
    DL = Sheet1.Range("A2:D65000")
        For r = 2 To UBound(DL)
            If DL(r, 1) >= Dk1 And Dk1 <> Empty And DL(r, 1) <= Dk2 And Dk2 <> Empty Then
                i = i + 1
                    For j = 1 To 4
                        kq(i, j) = DL(r, j)
                    Next j
            End If
        Next r
    If i Then
        Sheet2.Range("A5:D65000").ClearContents
        Sheet2.Range("A5").Resize(i, 4) = kq
    Else
        Sheet2.Range("A5:D65000").ClearContents
    End If
Application.ScreenUpdating = True
End Sub
Bạn có thể giúp mình thêm xíu, cũng điều kiện lọc như trên, giờ mình muốn lọc thêm "venue" trong bảng đó thì phải sửa code như thế nào bạn. Cảm ơn bạn nhiều.
 

File đính kèm

hpkhuong

######
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,616
Được thích
4,054
Điểm
560
Nơi ở
Quận 2 - TP.HCM
Bạn có thể giúp mình thêm xíu, cũng điều kiện lọc như trên, giờ mình muốn lọc thêm "venue" trong bảng đó thì phải sửa code như thế nào bạn. Cảm ơn bạn nhiều.
[GPECODE=vb]
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long, Dk3 As String
Dk1 = Sheet2.[B2].Value
Dk2 = Sheet2.[D2].Value
Dk3 = Sheet2.[F2].Value
DL = Sheet1.Range("A2:D65000")
For r = 2 To UBound(DL)
If DL(r, 1) >= Dk1 And DL(r, 1) <= Dk2 And DL(r, 3) = Dk3 Then
i = i + 1
For j = 1 To 4
kq(i, j) = DL(r, j)
Next j
End If
Next r
If i Then
Sheet2.Range("A5:D65000").ClearContents
Sheet2.Range("A5").Resize(i, 4) = kq
Else
Sheet2.Range("A5:D65000").ClearContents
End If
Application.ScreenUpdating = True
End Sub
[/GPECODE]
 

khibennhau

Thành viên mới
Tham gia ngày
7 Tháng một 2012
Bài viết
24
Được thích
1
Điểm
0
[GPECODE=vb]
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long, Dk3 As String
Dk1 = Sheet2.[B2].Value
Dk2 = Sheet2.[D2].Value
Dk3 = Sheet2.[F2].Value
DL = Sheet1.Range("A2:D65000")
For r = 2 To UBound(DL)
If DL(r, 1) >= Dk1 And DL(r, 1) <= Dk2 And DL(r, 3) = Dk3 Then
i = i + 1
For j = 1 To 4
kq(i, j) = DL(r, j)
Next j
End If
Next r
If i Then
Sheet2.Range("A5:D65000").ClearContents
Sheet2.Range("A5").Resize(i, 4) = kq
Else
Sheet2.Range("A5:D65000").ClearContents
End If
Application.ScreenUpdating = True
End Sub
[/GPECODE]
Bạn ơi cho mình hỏi, dữ liệu cột "Date" có nhiều ngày giống nhau, mình gộp lại, khi chạy bên sheet "report" thì nó chỉ hiện thị ngày đầu tiên. Vậy mình không gộp lại được hay phải sử dụng cấu trúc hàm khác. Cảm ơn bạn.
 

hpkhuong

######
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,616
Được thích
4,054
Điểm
560
Nơi ở
Quận 2 - TP.HCM
Bạn ơi cho mình hỏi, dữ liệu cột "Date" có nhiều ngày giống nhau, mình gộp lại, khi chạy bên sheet "report" thì nó chỉ hiện thị ngày đầu tiên. Vậy mình không gộp lại được hay phải sử dụng cấu trúc hàm khác. Cảm ơn bạn.
Nói vậy tôi không hiểu. Làm vào file. Gửi lên kèm giải thích thì mới có thể hiểu và giúp cho bạn dc
 

khibennhau

Thành viên mới
Tham gia ngày
7 Tháng một 2012
Bài viết
24
Được thích
1
Điểm
0
Nói vậy tôi không hiểu. Làm vào file. Gửi lên kèm giải thích thì mới có thể hiểu và giúp cho bạn dc
Ở sheet "data", cột "Date" có những ngày có nhiều sự kiện, mình "merge" những ngày đó lại. Khi chạy đoạn code thì nó chỉ hiện dữ liệu đầu tiên của ngày mà nó tìm thấy. Ví dụ: ngày 15/02/2015 có 4 sự kiện, khi chạy code thì nó chỉ hiện 1 sự kiện đầu tiên.

Mình muốn nó xuất dữ liệu giống như bên sheet "data" thì phải làm sao. Cảm ơn bạn.
 

File đính kèm

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,299
Được thích
16,114
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
Ở sheet "data", cột "Date" có những ngày có nhiều sự kiện, mình "merge" những ngày đó lại. Khi chạy đoạn code thì nó chỉ hiện dữ liệu đầu tiên của ngày mà nó tìm thấy. Ví dụ: ngày 15/02/2015 có 4 sự kiện, khi chạy code thì nó chỉ hiện 1 sự kiện đầu tiên.

Mình muốn nó xuất dữ liệu giống như bên sheet "data" thì phải làm sao. Cảm ơn bạn.
Tốt nhất cho bây giờ và cho sau này là đừng Merge Cells bên Data
 

hpkhuong

######
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,616
Được thích
4,054
Điểm
560
Nơi ở
Quận 2 - TP.HCM
Ở sheet "data", cột "Date" có những ngày có nhiều sự kiện, mình "merge" những ngày đó lại. Khi chạy đoạn code thì nó chỉ hiện dữ liệu đầu tiên của ngày mà nó tìm thấy. Ví dụ: ngày 15/02/2015 có 4 sự kiện, khi chạy code thì nó chỉ hiện 1 sự kiện đầu tiên.

Mình muốn nó xuất dữ liệu giống như bên sheet "data" thì phải làm sao. Cảm ơn bạn.
Code thì hãy nói không với chuyện merge cell đi nha...
 

Let'GâuGâu

Thành viên mới
Tham gia ngày
12 Tháng chín 2013
Bài viết
3,144
Được thích
2,740
Điểm
560
Tuổi
47
Ở sheet "data", cột "Date" có những ngày có nhiều sự kiện, mình "merge" những ngày đó lại. Khi chạy đoạn code thì nó chỉ hiện dữ liệu đầu tiên của ngày mà nó tìm thấy. Ví dụ: ngày 15/02/2015 có 4 sự kiện, khi chạy code thì nó chỉ hiện 1 sự kiện đầu tiên.

Mình muốn nó xuất dữ liệu giống như bên sheet "data" thì phải làm sao. Cảm ơn bạn.
ngồi buồi quá, nhiều chuyện chút
code trong file bạn, chỉnh lại chút
Mã:
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long
    Dk1 = Sheet2.[B2].Value
    Dk2 = Sheet2.[D2].Value
    With Sheet1
        DL = .Range(.[a3], .[d60000].End(3))
    End With
        For r = 2 To UBound(DL)
        If IsEmpty(DL(r, 1)) Then DL(r, 1) = DL(r - 1, 1)
            If DL(r, 1) >= Dk1 And DL(r, 1) <= Dk2 Then
                i = i + 1
                    For j = 1 To 4
                        kq(i, j) = DL(r, j)
                    Next j
            End If
        Next r
    If i Then
        Sheet2.Range("A5:D65000").ClearContents
        Sheet2.Range("A5").Resize(i, 4) = kq
    Else
        Sheet2.Range("A5:D65000").ClearContents
    End If
Application.ScreenUpdating = True
End Sub
 

doveandrose

hello
Tham gia ngày
3 Tháng bảy 2009
Bài viết
2,377
Được thích
2,253
Điểm
860
Tuổi
21
ngồi buồi quá, nhiều chuyện chút
code trong file bạn, chỉnh lại chút
Mã:
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long
    Dk1 = Sheet2.[B2].Value
    Dk2 = Sheet2.[D2].Value
    With Sheet1
        DL = .Range(.[a3], .[d60000].End(3))
    End With
        For r = 2 To UBound(DL)
        If IsEmpty(DL(r, 1)) Then DL(r, 1) = DL(r - 1, 1)
            If DL(r, 1) >= Dk1 And DL(r, 1) <= Dk2 Then
                i = i + 1
                    For j = 1 To 4
                        kq(i, j) = DL(r, j)
                    Next j
            End If
        Next r
    If i Then
        Sheet2.Range("A5:D65000").ClearContents
        Sheet2.Range("A5").Resize(i, 4) = kq
    Else
        Sheet2.Range("A5:D65000").ClearContents
    End If
Application.ScreenUpdating = True
End Sub
ủa code trong file là của ai làm vậy Let' Gâu Gâu ? --=0--=0
 

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,299
Được thích
16,114
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
ngồi buồi quá, nhiều chuyện chút
code trong file bạn, chỉnh lại chút
Mã:
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long
    Dk1 = Sheet2.[B2].Value
    Dk2 = Sheet2.[D2].Value
    With Sheet1
        DL = .Range(.[a3], .[d60000].End(3))
    End With
        For r = 2 To UBound(DL)
        If IsEmpty(DL(r, 1)) Then DL(r, 1) = DL(r - 1, 1)
            If DL(r, 1) >= Dk1 And DL(r, 1) <= Dk2 Then
                i = i + 1
                    For j = 1 To 4
                        kq(i, j) = DL(r, j)
                    Next j
            End If
        Next r
    If i Then
        Sheet2.Range("A5:D65000").ClearContents
        Sheet2.Range("A5").Resize(i, 4) = kq
    Else
        Sheet2.Range("A5:D65000").ClearContents
    End If
Application.ScreenUpdating = True
End Sub
Có "buồn quá" thì làm theo yêu cầu này luôn đi cho "trót"
Mình muốn nó xuất dữ liệu giống như bên sheet "data" thì phải làm sao. Cảm ơn bạn.
Người ta khoái cái "mẹc" đó.
 

Let'GâuGâu

Thành viên mới
Tham gia ngày
12 Tháng chín 2013
Bài viết
3,144
Được thích
2,740
Điểm
560
Tuổi
47
ủa code trong file là của ai làm vậy Let' Gâu Gâu ? --=0--=0
không có coi tập đâu, coi tập cuối à, nên hỏng có biết có cao thủ võ lâm nào..........chắc của GPE.........hehehheheheh
===================
Có "buồn quá" thì làm theo yêu cầu này luôn đi cho "trót"

Người ta khoái cái "mẹc" đó.
em xin cho nó chút mắm muối bọt ngọt nữa
Mã:
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1, nextrow As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long
    Dk1 = Sheet2.[B2].Value
    Dk2 = Sheet2.[D2].Value
    With Sheet1
        DL = .Range(.[a3], .[d60000].End(3))
    End With
        For r = 1 To UBound(DL)
        If IsEmpty(DL(r, 1)) Then DL(r, 1) = DL(r - 1, 1)
            If DL(r, 1) >= Dk1 And DL(r, 1) <= Dk2 Then
                i = i + 1
               If DL(r, 1) <> nextrow Then kq(i, 1) = DL(r, 1)
                    For j = 2 To 4
                        kq(i, j) = DL(r, j)
                    Next j
            End If
            nextrow = DL(r, 1)
        Next r
    If i Then
        Sheet2.Range("A5:D65000").ClearContents
        Sheet2.Range("A5").Resize(i, 4) = kq
    Else
        Sheet2.Range("A5:D65000").ClearContents
    End If
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:

khibennhau

Thành viên mới
Tham gia ngày
7 Tháng một 2012
Bài viết
24
Được thích
1
Điểm
0
[GPECODE=vb]
Option Explicit
Sub Loc()
Application.ScreenUpdating = False
Dim DL, kq(1 To 65000, 1 To 4), Dk1 As Date, Dk2 As Date
Dim r As Long, i As Long, j As Long, Dk3 As String
Dk1 = Sheet2.[B2].Value
Dk2 = Sheet2.[D2].Value
Dk3 = Sheet2.[F2].Value
DL = Sheet1.Range("A2:D65000")
For r = 2 To UBound(DL)
If DL(r, 1) >= Dk1 And DL(r, 1) <= Dk2 And DL(r, 3) = Dk3 Then
i = i + 1
For j = 1 To 4
kq(i, j) = DL(r, j)
Next j
End If
Next r
If i Then
Sheet2.Range("A5:D65000").ClearContents
Sheet2.Range("A5").Resize(i, 4) = kq
Else
Sheet2.Range("A5:D65000").ClearContents
End If
Application.ScreenUpdating = True
End Sub
[/GPECODE]
Xin lỗi bạn, cho mình phiền thêm xíu, ở #7, bạn có giúp mình đoạn code lọc cho "venue" trong khoảng thời gian mình chọn. Giờ mình muốn thêm điều kiện là khi ô lọc theo "venue" trống thì nó vẫn lọc những sự kiện diễn ra trong khoảng thời gian mình chọn thì phải thêm hay sửa code thế nào. Cảm ơn bạn.
 

File đính kèm

Top Bottom