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

Liên hệ QC

khibennhau

Thành viên mới
Tham gia
7/1/12
Bài viết
24
Được thích
1
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

  • event.xlsx
    9.8 KB · Đọc: 329
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
 
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/...ì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
 
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 @$@!^%
 
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/...ì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 /-*+/
 
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/...ì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

  • event.xlsx
    10 KB · Đọc: 173
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]
 
[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.
 
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
 
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

  • event.xlsm
    18 KB · Đọc: 103
Ở 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
 
Ở 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...
 
Ở 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
 
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
 
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" đó.
 
ủ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:
Mọi người sửa code hộ mình theo yêu cầu trong file.tks all
 

File đính kèm

  • Vi du ve loc du lieu.xlsm
    22.3 KB · Đọc: 67
[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

  • event.xlsx
    10.6 KB · Đọc: 54
Web KT
Back
Top Bottom