일별, 직원별, 시간대별 근무현황을 구하는 매크로.
배열을 써 본 처음의 매크로다.
약간 이해가 가는지도.
월간 시트에서 A1 셀을 클릭하면 된다.
Option Explicit
Sub qWork()
Dim cntDay As Integer '일수
Dim cntTime As Integer '하루업무시간
Dim cntWorker As Integer '직원숫자
Dim var() As Integer '일자별 근무인원 넣을 배열
Dim tmWork As Range '월별 작업시간 10시
Dim tmOn As Range '직원별 출근시간
Dim i As Integer, j As Integer, k As Integer
'작업 속도 높이기
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Set tmOn = Range("B3") '직원별 출근시간
Set tmWork = Cells(Rows.Count, "A").End(xlUp).End(xlUp).Offset(1, 0) '작업시작셀
'한달 일수
With tmWork.Offset(-1, 1)
cntDay = Range(.Cells, .End(xlToRight)).Count
End With
'하루 작업시간
With tmWork
cntTime = Range(.Cells, .End(xlDown)).Count
End With
'직원 숫자
With tmOn.Offset(-1, 0)
cntWorker = Range(.Cells, .End(xlToRight)).Count / 5
End With
'기존 자료 삭제
tmWork.Offset(, 1).Resize(cntTime, cntDay).ClearContents
'배열 재설정
ReDim var(1 To cntTime, 1 To cntDay)
'일자별, 시간대별 근무인원 구하기
For i = 1 To cntWorker
For j = 1 To cntTime
For k = 1 To cntDay
With tmWork
If .Offset(j - 1, 0) >= tmOn.Offset(k - 1, (i - 1) * 5) And _
.Offset(j - 1, 0) <= tmOn.Offset(k - 1, (i - 1) * 5 + 1) Then
var(j, k) = .Offset(j - 1, k) + 1
.Offset(j - 1, k) = var(j, k)
End If
End With
Next k
Next j
Next i
'마무리
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
tmWork.Select
End Sub
'VB(A)' 카테고리의 다른 글
중복값 제외하고 수량 합산하기 (0) | 2015.02.16 |
---|---|
대량의 텍스트파일을 1열로 불러오기 (0) | 2015.02.16 |
사용자정의 함수 (0) | 2015.02.07 |
일정 간격으로 내용 복사 (0) | 2015.02.03 |
Private Sub Worksheet_Change(ByVal Target As Range) (0) | 2015.01.30 |