Tìm ngày bắt đầu và kết thúc thỏa mãn các điều kiện

Liên hệ QC

lexuanhienkttv

Thành viên chính thức
Tham gia
15/8/11
Bài viết
80
Được thích
6
Xin chào các anh chị, em có bảng số liệu cần tìm ngày bắt đầu và kết thúc, em có mô tả trong bảng excel. Nhờ anh chị giúp xây dựng công thức hoặc code để tìm các ngày này được thuận tiện. Xin trân trọng cảm ơn!
 

File đính kèm

Mình có ý tưởng này để làm bài tập của bạn, tuy nhiên tìm ngày kết thúc theo điều kiện trên thì chưa thỏa mãn với dữ liệu chọn của bạn. Trong lúc chờ giải pháp khác thì bạn tham khảo file mình đính kèm xem sao.
 

File đính kèm

Lần chỉnh sửa cuối:
Đây có thể là 1 tham khảo cho chủ bài đăng:
PHP:
Sub BatDauMuaPQ()
 Dim WF As Object, Rng As Range, Cls As Range
 Dim J As Long, Rws As Long, ChucNgay As Double, SoNgay As Integer

 Set WF = Application.WorksheetFunction
 Rws = [B2].CurrentRegion.Rows.Count
 For J = 2 To Rws
    If Cells(J, "B").Value > 5 Then
        Set Rng = Cells(J, "B").Resize(10)
        ChucNgay = WF.Sum(Rng)
        SoNgay = WF.CountIf(Rng, ">0")
        If ChucNgay > 50 And SoNgay > 5 Then
            MsgBox Cells(J, "B").Address, , "Ngày BD Mua!"
            Exit For
        End If
    End If
 Next J
 Cells(J, "B").Resize(10).Select
End Sub
 
Cảm ơn anh. Code này chỉ sử dụng cho cột PQ phải không ạ? Muốn áp dụng cho cột RG hoặc thêm nhiều các cột khác có sử dụng được không ạ? Nhờ anh hướng dẫn giúp.
 
1 cách dùng hàm tự tạo (UDF)
Cấu trúc hàm:
=Rain(Vùng ngày tháng, Vùng lượng mưa, n)
với n=1: bắt đầu; n=2: kết thúc
Cụ thể:
M9:
=rain($A$2:$A$366,$B$2:$B$366,1)
N9:
=rain($A$2:$A$366,$B$2:$B$366,2)
Thay vùng B (trạm PQ) thành vùng C (trạm RG) hay vùng nào đó chưa lượng mưa

Cách dùng:
Chuột phải tên sheet, view code, insert module, sau đó dán code này vào. Lưu file dạng .xlsm

PHP:
Option Explicit
Function Rain(dat As Range, RainIndex As Range, loai As Integer) As Date
Dim rng As Range, count&, sum As Double, ce As Range, ce1 As Range
With WorksheetFunction
    Select Case loai
        Case 1
            For Each ce In RainIndex
                If ce.Value > 5 And ce.Row > 60 Then
                    Set rng = ce.Resize(10)
                    sum = .sum(rng): count = .CountIf(rng, ">0")
                    If sum > 50 And count >= 5 Then
                        Set rng = ce.Offset(10, 0).Resize(10): count = 0
                        For Each ce1 In rng
                            If ce1 <> 0 Then count = 0 Else count = count + 1
                        Next
                        If count < 5 Then
                            Rain = dat.Cells(ce.Row - 1, 1)
                            Exit Function
                        End If
                    End If
                End If
            Next
        Case 2
            For Each ce In RainIndex
                If ce.Value = 0 And ce.Row > 300 Then
                    Set rng = ce.Resize(10)
                    sum = .sum(rng): count = .CountIf(rng, 0)
                    If sum < 50 And count >= 5 Then
                        Set rng = ce.Offset(10, 0).Resize(10): count = 0
                        For Each ce1 In rng
                            If ce1 <> 0 Then count = 0 Else count = count + 1
                        Next
                        If count >= 5 Then
                            Rain = dat.Cells(ce.Row - 1, 1)
                            Exit Function
                        End If
                    End If
                End If
            Next
    End Select
End With
Rain = "Khong tim thay"
End Function
 

File đính kèm

Xin chào các anh chị, em có bảng số liệu cần tìm ngày bắt đầu và kết thúc, em có mô tả trong bảng excel. Nhờ anh chị giúp xây dựng công thức hoặc code để tìm các ngày này được thuận tiện. Xin trân trọng cảm ơn!
" sau thời kỳ này không có chuỗi ngày gián đoạn mưa liên tục quá 5 ngày"
Với ví dụ trạm "PQ" nói rỏ thời gian cụ thể từ ngày nào tới ngày nào?

1 cách dùng hàm tự tạo (UDF)
Cấu trúc hàm:
=Rain(Vùng ngày tháng, Vùng lượng mưa, n)
với n=1: bắt đầu; n=2: kết thúc
Cụ thể:
M9:
=rain($A$2:$A$366,$B$2:$B$366,1)
N9:
=rain($A$2:$A$366,$B$2:$B$366,2)
Thay vùng B (trạm PQ) thành vùng C (trạm RG) hay vùng nào đó chưa lượng mưa

Cách dùng:
Chuột phải tên sheet, view code, insert module, sau đó dán code này vào. Lưu file dạng .xlsm

PHP:
Option Explicit
Function Rain(dat As Range, RainIndex As Range, loai As Integer) As Date
Dim rng As Range, count&, sum As Double, ce As Range, ce1 As Range
With WorksheetFunction
    Select Case loai
        Case 1
            For Each ce In RainIndex
                If ce.Value > 5 And ce.Row > 60 Then
                    Set rng = ce.Resize(10)
                    sum = .sum(rng): count = .CountIf(rng, ">0")
                    If sum > 50 And count >= 5 Then
                        Set rng = ce.Offset(10, 0).Resize(10): count = 0
                        For Each ce1 In rng
                            If ce1 <> 0 Then count = 0 Else count = count + 1
                        Next
                        If count < 5 Then
                            Rain = dat.Cells(ce.Row - 1, 1)
                            Exit Function
                        End If
                    End If
                End If
            Next
        Case 2
            For Each ce In RainIndex
                If ce.Value = 0 And ce.Row > 300 Then
                    Set rng = ce.Resize(10)
                    sum = .sum(rng): count = .CountIf(rng, 0)
                    If sum < 50 And count >= 5 Then
                        Set rng = ce.Offset(10, 0).Resize(10): count = 0
                        For Each ce1 In rng
                            If ce1 <> 0 Then count = 0 Else count = count + 1
                        Next
                        If count >= 5 Then
                            Rain = dat.Cells(ce.Row - 1, 1)
                            Exit Function
                        End If
                    End If
                End If
            Next
    End Select
End With
Rain = "Khong tim thay"
End Function
"If ce.Value > 5 And ce.Row > 60 Then
....
If ce.Value = 0 And ce.Row > 300 Then"

Con số 60 và 300 có thể làm kết quả sai lệch trong năm nhuần và trên file thực tế có thứ tự dòng khác file bài #1
 
Lần chỉnh sửa cuối:
" sau thời kỳ này không có chuỗi ngày gián đoạn mưa liên tục quá 5 ngày"
Với ví dụ trạm "PQ" nói rỏ thời gian cụ thể từ ngày nào tới ngày nào?


"If ce.Value > 5 And ce.Row > 60 Then
....
If ce.Value = 0 And ce.Row > 300 Then"

Con số 60 và 300 có thể làm kết quả sai lệch trong năm nhuần và trên file thực tế có thứ tự dòng khác file bài #1
Cảm ơn góp ý của anh. Chỗ "sau thời kỳ này không có chuỗi ngày gián đoạn mưa liên tục quá 5 ngày" có nghĩa là sau 10 ngày thỏa mãn các điều kiện về lượng mưa ngày bắt đầu và tổng lượng mưa của 10 ngày đó. Ở đây đầy đủ phải là "không có quá 5 ngày liên tiếp không mưa, trong chuỗi 30 ngày tiếp theo kể từ ngày bắt đầu mùa mưa". Liên quan đến năm nhuần thì em loại bỏ, vì ngày 29/2 cơ bản là rất ít mưa. Con số >60 là vì tìm ngày bắt đầu mưa từ tháng 3 (theo số liệu thống kê khu vực không thể mùa mưa đến sớm hơn được), còn số >300 có thể anh bebo021999 nhầm (từ tháng 10 tương ứng >274). Còn phần kết thúc mùa mưa ngoài phần ngày bắt đầu và tổng lượng mưa 10 ngày <50, thì 5 ngày không mưa liên tục phải nối tiếp chuỗi tổng 10 ngày có lượng mưa <50. Nhờ các anh chị sửa lại cho phù hợp giúp.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom