sirhoanglong
Thành viên mới

- Tham gia
- 4/4/14
- Bài viết
- 2
- Được thích
- 0
Mình có một bài toán tính số ngày làm việc liên tục. Nếu ngày hôm nay nghỉ thì ngày mai số ngày này lại đếm lại từ 1. Xin các bro chỉ giáo
Phải có file dữ liệu cụ thể chứ bạnMình có một bài toán tính số ngày làm việc liên tục. Nếu ngày hôm nay nghỉ thì ngày mai số ngày này lại đếm lại từ 1. Xin các bro chỉ giáo
Bro xem giúp mình nhéPhải có file dữ liệu cụ thể chứ bạn
For i = 1 to CotCuoi
Tong = Tong x giá trị cột tại (i) + giá trị cột tại (i)
' Giá trị trong ô được đánh dấu luôn là 0 hoặc 1'
Next i
Function NgayLV(Arr As Variant) As Integer
Dim i, Chck As Integer
For i = 1 To Arr.Columns.Count
Chck = Arr(i).Value
NgayLV = NgayLV * Chck + Chck
Next i
End Function
Sub NgayLVLT()
Dim arr
Dim Ngay As Long, i As Long, k As Long
Dim chk As Boolean
arr = Range("B2", Cells(Range("B65536").End(xlUp).Row, Range("ZZ1").End(xlToLeft).Column)).Value
For i = 1 To UBound(arr)
For k = UBound(arr, 2) - 1 To 2 Step -1
If arr(i, k) <> 0 Then
Ngay = Ngay + 1
Else
arr(i, UBound(arr, 2)) = Ngay
Ngay = 0
chk = True
Exit For
End If
Next
If chk = False Then
arr(i, UBound(arr, 2)) = UBound(arr, 2) - 2
Else
chk = False
End If
Next
Range("B2").Resize(UBound(arr), UBound(arr, 2)).Value = arr
End Sub
Không hiểu ý đồ bác Maika biến chk là để kiểm tra điều kiện nào, chứ em thấy làm như này đủ rồi mà:Bạn thử code, chỗ nào không biết thì hỏi nhé!
Rich (BB code):Sub NgayLVLT() Dim arr Dim Ngay As Long, i As Long, k As Long Dim chk As Boolean arr = Range("B2", Cells(Range("B65536").End(xlUp).Row, Range("ZZ1").End(xlToLeft).Column)).Value For i = 1 To UBound(arr) For k = UBound(arr, 2) - 1 To 2 Step -1 If arr(i, k) <> 0 Then Ngay = Ngay + 1 Else arr(i, UBound(arr, 2)) = Ngay Ngay = 0 chk = True Exit For End If Next If chk = False Then arr(i, UBound(arr, 2)) = UBound(arr, 2) - 2 Else chk = False End If Next Range("B2").Resize(UBound(arr), UBound(arr, 2)).Value = arr End Sub
For i = 1 To UBound(arr)
For k = UBound(arr, 2) - 1 To 2 Step -1
If arr(i, k) <> 0 Then
Ngay = Ngay + 1
Else
Exit For
End If
Next
arr(i, UBound(arr, 2)) = Ngay
Ngay = 0
Next
Vì kiểm từ cuối về đầu nếu <>0 thì đếm; nếu = 0 thì ghi lại ngày đã đếm, nhưng đến đầu mà vẫn không có giá trị = 0 (tức có người làm việc liên túc không nghỉ ngày nào) thì dữ liệu sẽ không ghi, cho nên tôi phải làm vậy. Không biết thế có thừa lệnh hay giải thuật không sáng không biết nữa?Không hiểu ý đồ bác Maika biến chk là để kiểm tra điều kiện nào, chứ em thấy làm như này đủ rồi mà:
Mã:For i = 1 To UBound(arr) For k = UBound(arr, 2) - 1 To 2 Step -1 If arr(i, k) <> 0 Then Ngay = Ngay + 1 Else Exit For End If Next arr(i, UBound(arr, 2)) = Ngay Ngay = 0 Next
Nếu làm việc liên tục (=1) tức là ngay=ngay+1 sẽ đếm đủ 13 rồi bác. Cuối vòng for nhỏ gán 1 lần là đủ rồiVì kiểm từ cuối về đầu nếu <>0 thì đếm; nếu = 0 thì ghi lại ngày đã đếm, nhưng đến đầu mà vẫn không có giá trị = 0 (tức có người làm việc liên túc không nghỉ ngày nào) thì dữ liệu sẽ không ghi, cho nên tôi phải làm vậy. Không biết thế có thừa lệnh hay giải thuật không sáng không biết nữa?
Ờ mình cũng lẩn thẩn rồiNếu làm việc liên tục (=1) tức là ngay=ngay+1 sẽ đếm đủ 13 rồi bác. Cuối vòng for nhỏ gán 1 lần là đủ rồi
Nếu O4 = 0 thì kết quả P4 = bao nhiêu?Bro xem giúp mình nhé
Bài đã được tự động gộp:
Bro xem giúp mình nhé