Tìm số ngày nghỉ liền nhau 2 ngày trở lên (1 người xem)

  • Thread starter Thread starter nvh611
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

Nhờ các bạn trên diễn đàn giúp đỡ như file đính kèm
Cảm ơn các bạn
Dùng hàm tự tạo nhé.
Mã:
Function solan(ByVal mang As Range) As Integer
         Dim arr, i As Long, j As Integer, tong As Integer, a As Integer
         arr = mang.Value
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To UBound(arr, 1) - 1
                 If UCase(arr(i, j)) = "X" And UCase(arr(i + 1, j)) = "X" Then
                    a = a + 1
                 Else
                    tong = tong + a
                    a = 0
                 End If
             Next i
             tong = tong + a
        Next j
       solan = tong
End Function
Mã:
=solan(C5:F27)
 

File đính kèm

Lần chỉnh sửa cuối:
Theo cách tính của các cột phụ
=COUNTIFS(C5:F26,"X",C6:F27,"X")
Cảm ơn bạn @HieuCD bạn sử dụng công thức hay quá.
Bài đã được tự động gộp:

Dùng hàm tự tạo nhé.
Mã:
Function solan(ByVal mang As Range) As Integer
         Dim arr, i As Long, j As Integer, tong As Integer, a As Integer
         arr = mang.Value
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To UBound(arr, 1) - 1
                 If UCase(arr(i, j)) = "X" And UCase(arr(i + 1, j)) = "X" Then
                    a = a + 1
                 Else
                    tong = tong + a
                    a = 0
                 End If
             Next i
             tong = tong + a
        Next j
       solan = tong
End Function
Mã:
=solan(C5:F27)
Cảm ơn bạn @snow25 hàm rất đúng trong trường hợp này
Bây giờ mình muốn tìm số ngày liên tiếp =3 hoặc bất kỳ bằng 4,5...... thì thay đổi hàm chỗ nào được nhỉ
 
Lần chỉnh sửa cuối:
Cảm ơn bạn @HieuCD bạn sử dụng công thức hay quá.
Bài đã được tự động gộp:


Cảm ơn bạn @snow25 hàm rất đúng trong trường hợp này
Bây giờ mình muốn tìm số ngày liên tiếp =3 hoặc bất kỳ bằng 4,5...... thì thay đổi hàm chỗ nào được nhỉ
Vậy bạn dùng cái này xem.Thích số mấy thì điền vào.
Mã:
Function solan(ByVal mang As Range, Optional ByVal so As Integer = 1) As Integer
         Dim arr, i As Long, j As Integer, tong As Integer, a As Integer
         arr = mang.Value
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To UBound(arr, 1) - 1
                 If UCase(arr(i, j)) = "X" And UCase(arr(i + 1, j)) = "X" Then
                    a = a + 1
                 Else
                    If a >= so Then tong = tong + a
                    a = 0
                 End If
             Next i
             If a >= so Then tong = tong + a
        Next j
       solan = tong
End Function
Mã:
=solan(C5:F27,3)
 
Vậy bạn dùng cái này xem.Thích số mấy thì điền vào.
Mã:
Function solan(ByVal mang As Range, Optional ByVal so As Integer = 1) As Integer
         Dim arr, i As Long, j As Integer, tong As Integer, a As Integer
         arr = mang.Value
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To UBound(arr, 1) - 1
                 If UCase(arr(i, j)) = "X" And UCase(arr(i + 1, j)) = "X" Then
                    a = a + 1
                 Else
                    If a >= so Then tong = tong + a
                    a = 0
                 End If
             Next i
             If a >= so Then tong = tong + a
        Next j
       solan = tong
End Function
Mã:
=solan(C5:F27,3)
Cảm ơn bạn, nhanh quá
Vẫn bị sai bạn à
Nếu trường hợp =3 thì đúng
Khi mình thay =4 thì kết quả =0
Bạn chỉnh giúp mình với nhé.
 
Cảm ơn bạn, nhanh quá
Vẫn bị sai bạn à
Nếu trường hợp =3 thì đúng
Khi mình thay =4 thì kết quả =0
Bạn chỉnh giúp mình với nhé.
Tạm sửa lại thế này
Mã:
Function SolanX(ByVal mang As Range, Optional ByVal So As Long = 2) As Integer
         Dim arr, i As Long, j As Long, a As Long, n As Long, k As Long, Tim As Boolean
         arr = mang.Value
         a = 0
         n = UBound(arr, 1) - So + 1
         For j = 1 To UBound(arr, 2)
             For i = 1 To n
                 Tim = True
                 For k = i To i + So - 1
                    If Not UCase(arr(k, j)) = "X" Then Tim = False: Exit For
                 Next
                 If Tim Then a = a + 1
             Next i
        Next j
       SolanX = a
End Function

Công thức (ví dụ)
=SolanX(C5:F27,4)
 
Tạm sửa lại thế này
Mã:
Function SolanX(ByVal mang As Range, Optional ByVal So As Long = 2) As Integer
         Dim arr, i As Long, j As Long, a As Long, n As Long, k As Long, Tim As Boolean
         arr = mang.Value
         a = 0
         n = UBound(arr, 1) - So + 1
         For j = 1 To UBound(arr, 2)
             For i = 1 To n
                 Tim = True
                 For k = i To i + So - 1
                    If Not UCase(arr(k, j)) = "X" Then Tim = False: Exit For
                 Next
                 If Tim Then a = a + 1
             Next i
        Next j
       SolanX = a
End Function

Công thức (ví dụ)
=SolanX(C5:F27,4)
Bỏ bớt 1 vòng For theo dòng được không bạn, tốc độ tăng lên nhiều :p
 
Bỏ bớt 1 vòng For theo dòng được không bạn, tốc độ tăng lên nhiều :p
có đây, cũng vừa nghĩ nên bỏ bớt
Mã:
Function solan(ByVal mang As Range, Optional ByVal So As Long= 2) As Integer
         Dim arr, i As Long, j As Long, tong As Long, a As Long, n As Long
         arr = mang.Value
         tong = 0
         n=UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                 Else
                    If a >= So Then tong = tong + a - So + 1
                    a = 0
                 End If
             Next i
             If a >= So Then tong = tong + a - So + 1
        Next j
       solan = tong
End Function
 
Lần chỉnh sửa cuối:
có đây, cũng vừa nghĩ nên bỏ bớt
Mã:
Function solan(ByVal mang As Range, Optional ByVal So As Integer = 2) As Integer
         Dim arr, i As Long, j As Long, tong As Long, a As Integer, n As Long
         arr = mang.Value
         tong = 0
         n=UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                 Else
                    If a >= So Then tong = tong + a - So + 1
                    a = 0
                 End If
             Next i
             If a >= So Then tong = tong + a - So + 1
        Next j
       solan = tong
End Function
Hay quá :), code chạy rất nhanh, nếu rút ngắn thêm vài dòng lệnh là tuyệt vời :p
 
có đây, cũng vừa nghĩ nên bỏ bớt
Mã:
Function solan(ByVal mang As Range, Optional ByVal So As Long= 2) As Integer
         Dim arr, i As Long, j As Long, tong As Long, a As Long, n As Long
         arr = mang.Value
         tong = 0
         n=UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                 Else
                    If a >= So Then tong = tong + a - So + 1
                    a = 0
                 End If
             Next i
             If a >= So Then tong = tong + a - So + 1
        Next j
       solan = tong
End Function
cẢM ƠN BẠN @tam888 CÔNG THỨC ĐÃ ĐÚNG
 
Hay quá :), code chạy rất nhanh, nếu rút ngắn thêm vài dòng lệnh là tuyệt vời :p
Thôi, có mỗi hàm nhỏ, rút nữa cũng chắc chẳng được lợi bao nhiêu
Bài đã được tự động gộp:

Tôi thì quan tâm tính hiệu quả về thời gian, còn độ ngắn dòng lệnh thì ít để ý
Bài này có thể nhanh hơn chút nếu dùng Do While, ai đó thử sức xem sao. Tuy thế với số lượng dữ liệu ít thì hiệu quả này là không đáng kể
 
Lần chỉnh sửa cuối:
Cho em ké với: :p
Mã:
Function solan(ByVal mang As Range, Optional ByVal So As Long = 2) As Integer
         Dim arr, i As Long, j As Long, a As Long, n As Long
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                    If a >= So Then solan = solan + 1
                Else
                    a = 0
                 End If
             Next i
        Next j
End Function
 
Cho em ké với: :p
Mã:
Function solan(ByVal mang As Range, Optional ByVal So As Long = 2) As Integer
         Dim arr, i As Long, j As Long, a As Long, n As Long
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                    If a >= So Then solan = solan + 1
                Else
                    a = 0
                 End If
             Next i
        Next j
End Function
Quá tuyệt vời :)
Chúc các bạn buổi tối vui :)
 
có đây, cũng vừa nghĩ nên bỏ bớt
Mã:
Function solan(ByVal mang As Range, Optional ByVal So As Long= 2) As Integer
         Dim arr, i As Long, j As Long, tong As Long, a As Long, n As Long
         arr = mang.Value
         tong = 0
         n=UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                 Else
                    If a >= So Then tong = tong + a - So + 1
                    a = 0
                 End If
             Next i
             If a >= So Then tong = tong + a - So + 1
        Next j
       solan = tong
End Function
Phiền bạn @tam888 và bạn @HieuCD cho thêm dòng tìm số ngày nghỉ liên tiếp lớn nhất
Cảm ơn các bạn bạn
 
tìm số ngày nghỉ liên tiếp lớn nhất
Mã:
Function MaxX(ByVal mang As Range) As Integer
         Dim arr, i As Long, j As Long, a As Long, n As Long
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                    If a > MaxX Then MaxX = a
                Else
                    a = 0
                 End If
             Next i
        Next j
End Function
 
Mã:
Function MaxX(ByVal mang As Range) As Integer
         Dim arr, i As Long, j As Long, a As Long, n As Long
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                    If a > MaxX Then MaxX = a
                Else
                    a = 0
                 End If
             Next i
        Next j
End Function
Cảm ơn bạn @phuocam liệu 2 hàm này ghép với nhau được không bạn?
 
Cảm ơn bạn @phuocam liệu 2 hàm này ghép với nhau được không bạn?
Bạn xem code đúng không nhé.
Mã:
Function solan(ByVal mang As Range, Optional ByVal so As Integer = 2) As String
         Dim arr, i As Long, j As Long, a As Long, n As Long, tong As Integer, max As Integer
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                    If a >= so Then tong = tong + 1
                Else
                    If a >= max Then max = a
                    a = 0
                 End If
             Next i
        Next j
       solan = tong & ";" & max
End Function
Mã:
=solan(C5:F27,3)
 
Nhờ các bạn trên diễn đàn giúp đỡ như file đính kèm
Cảm ơn các bạn
Dùng công thức cho trường hợp n ngày liên tiếp:
=SUM(IFERROR(SQRT(FREQUENCY(ROW(C5:F28)+(COLUMN(C5:F28)-1)*ROWS(C5:C28),IF(C5:F28<>"x",ROW(C5:F28)+(COLUMN(C5:F28)-1)*ROWS(C5:C28)))-2)^2,""))
Bấm Ctrl+Shift+Enter!
Muốn thay đổi số ngày liên tiếp khác thì sửa số -2 thành -3 hoặc-4... Muốn tìm ngày liên tiếp lớn nhất thì sửa Sum thành Max là được.
 
Dùng công thức cho trường hợp n ngày liên tiếp:
=SUM(IFERROR(SQRT(FREQUENCY(ROW(C5:F28)+(COLUMN(C5:F28)-1)*ROWS(C5:C28),IF(C5:F28<>"x",ROW(C5:F28)+(COLUMN(C5:F28)-1)*ROWS(C5:C28)))-2)^2,""))
Bấm Ctrl+Shift+Enter!
Muốn thay đổi số ngày liên tiếp khác thì sửa số -2 thành -3 hoặc-4... Muốn tìm ngày liên tiếp lớn nhất thì sửa Sum thành Max là được.
Cảm ơn bạn công thức
Siêu đẳng
Bài đã được tự động gộp:

Bạn xem code đúng không nhé.
Mã:
Function solan(ByVal mang As Range, Optional ByVal so As Integer = 2) As String
         Dim arr, i As Long, j As Long, a As Long, n As Long, tong As Integer, max As Integer
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                    If a >= so Then tong = tong + 1
                Else
                    If a >= max Then max = a
                    a = 0
                 End If
             Next i
        Next j
       solan = tong & ";" & max
End Function
Mã:
=solan(C5:F27,3)
Cảm ơn bạn @snow25 công thức quá hay và quá tuyệt vời
Ý tưởng của mình là khác
(Nhưng bạn làm như này thì hay hơn tuyệt vời hơn vì nó luôn luôn báo trước cho số ngày nghỉ liên tiếp lớn nhất)
Cảm ơn rất nhiều.
 
Lần chỉnh sửa cuối:
Bạn xem code đúng không nhé.
Mã:
Function solan(ByVal mang As Range, Optional ByVal so As Integer = 2) As String
         Dim arr, i As Long, j As Long, a As Long, n As Long, tong As Integer, max As Integer
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = "X" Then
                    a = a + 1
                    If a >= so Then tong = tong + 1
                Else
                    If a >= max Then max = a
                    a = 0
                 End If
             Next i
        Next j
       solan = tong & ";" & max
End Function
Mã:
=solan(C5:F27,3)
Chào bạn @snow25 để công thức tiện xử dụng bạn có thể sửa giúp mình thêm 1 hằng số được không
=solan(C5:F27,3) tức là khi tìm bất kỳ hằng số nào đó không phải là X
If UCase(arr(i, j)) = "X" Then
Thì bạn thêm =solan("Y";C5:F27,3) thì bạn thêm hằng số "Y' vào biểu thức
Cảm ơn bạn!
 
Chào bạn @snow25 để công thức tiện xử dụng bạn có thể sửa giúp mình thêm 1 hằng số được không
=solan(C5:F27,3) tức là khi tìm bất kỳ hằng số nào đó không phải là X
If UCase(arr(i, j)) = "X" Then
Thì bạn thêm =solan("Y";C5:F27,3) thì bạn thêm hằng số "Y' vào biểu thức
Cảm ơn bạn!
Đây bạn xem.Mặc định của nó là "X" nếu bạn không chọn gì.
Mã:
=solan(B4:B8,2,"x")
Mã:
Function solan(ByVal mang As Range, Optional ByVal so As Integer = 2, Optional ByVal dk As String = "X") As String
         Dim arr, i As Long, j As Long, a As Long, n As Long, tong As Integer, max As Integer
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = UCase(dk) Then
                    a = a + 1
                    If a >= so Then tong = tong + 1
                Else
                    If a >= max Then max = a
                    a = 0
                 End If
             Next i
        Next j
       solan = tong & ";" & max
End Function
 
Đây bạn xem.Mặc định của nó là "X" nếu bạn không chọn gì.
Mã:
=solan(B4:B8,2,"x")
Mã:
Function solan(ByVal mang As Range, Optional ByVal so As Integer = 2, Optional ByVal dk As String = "X") As String
         Dim arr, i As Long, j As Long, a As Long, n As Long, tong As Integer, max As Integer
         arr = mang.Value
          n = UBound(arr, 1)
         For j = 1 To UBound(arr, 2)
             a = 0
             For i = 1 To n
                 If UCase(arr(i, j)) = UCase(dk) Then
                    a = a + 1
                    If a >= so Then tong = tong + 1
                Else
                    If a >= max Then max = a
                    a = 0
                 End If
             Next i
        Next j
       solan = tong & ";" & max
End Function
Cảm ơn bạn @snow25
 

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

Back
Top Bottom