Tập viết code VBA

Liên hệ QC

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
 
Chưa biết cách nhập dữ liệu của bạn như thế nào, và cuối tháng mới tổng kết, hay tổng kết từng ngày.
Vì bạn mới học nên mình nói phần giải thuật, còn viết như nào thì do bạn nhé.
Quét dữ liệu đánh dấu ngày đi làm (1) và ngày nghỉ (0). Khi đụng vào số 0 thì tổng nhân với 0 biến thành 0, đụng 1 thì nhân với 1 nên kg đổi giá trị, sau thì cứ cộng tiếp vào.
PHP:
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
----------
Dù không biết kiểm tra cái này để làm gì :D

PHP:
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
 
Lần chỉnh sửa cuối:
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
 
Lần chỉnh sửa cuối:
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
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
 
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
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?
 
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?
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ồi
 
Web KT
Back
Top Bottom