2017-10-14 43 views
0

직원 당 주간보기 시간을 계산하는 시간 기록표에서 작업하고 있습니다. 직원이 회사의 일부인지, 지불되지 않은 휴가 중인지, 회사를 떠나거나 이미 떠났는지 여부를 결정하는 코드를 구현했습니다.행에 포함 된 셀이 카운터에 추가되기 전에 동일한 지 확인하는 방법

내가하려고하는 것은 가입 자, 퇴사 자 및 무급 휴가 자의 수를 나에게 알리는 테이블을 만드는 것입니다.

내 데이터를 정렬하는 코드를 적용한 후에는 다음과 같습니다 좀 더 의미있는 설명과 함께하기 이전의 임의 값을 대체했습니다

Data table .

값이 '가입하지 않음'행에서 처음으로 결합 자 카운터에 추가하는 테이블을 만들고 싶습니다. 따라서 계산 수가 중복되지 않습니다. 예를 들어, ID 1, 나는 그 주인을 2 ~ 5 주에 2 주 만에 소집하고 싶지 않습니다.

이것은 지금까지 필자가 이동하기 전에 열 당 행을보고 있습니다. 다음 칼럼 :

Dim LastCol As Long 
Dim LastRow As Long 
Dim I As Long 
Dim Z As Long 
Dim Q As Long 
Dim Joined As Integer 
Dim ws As Worksheet 

'set worksheet to use 
Set ws = Sheets("Sheet1") 

With ws 
    'Find last col and row for range 
    LastCol = ws.Cells(3, Columns.Count).End(xlToLeft).Column 
    LastRow = ws.Cells(Rows.Count, D).End(xlUp).Row 

For I = 3 To LastCol 
    NotJoined = 0 
     For Z = 4 To LastRow 
      'check if cell is > 0 
      If ws.Cells(Z, I).Value > 0 Then 
       Joined = Joined + 1 
      End If 
     Next Z 
    'Find last row and add value to row below 
    Q = ws.Cells(Rows.Count, I).End(xlUp).Row 
    ws.Cells(Q + 1, I).Value = Joined 
Next I 
End With 

는 어떻게 추가 할 경우에만 (다른 값에 가입되지 않은에서 진행) 소목/졸업자를 계산하는 방법 주어진 행에 한 번 (X에 대한 값에서 진행)하지만 발견 이 값은 주당. 나는 다음과 같은 테이블을 가진 향해 노력하고 있습니다 :

Resulting table from data

사전에 감사!

답변

1

나는 반으로 일했습니다. 나머지는 해주세요. 이것은 내가 가진 것입니다. 코드를 표준 코드 모듈에 붙여넣고 워크 시트의 이름을 "Tony"에서 테스트 할 대상으로 변경하십시오.

Option Explicit 

Enum Nst       ' Status 
    ' 15 Oct 2017 
    NstNone = -3 
    NstNotJoined 
    NstOnLeave 
    NstLeft 
    NstPresent 
End Enum 

Enum Nix       ' Array index 
    ' 15 Oct 2017 
    NixPresent = 1 
    NixJoined 
    NixLeft 
    NixUnpaid 
End Enum 

Sub HeadCount() 
    ' 15 Oct 2017 

    Dim Arr() As Integer    ' Result 
    Dim Wk As Long, Ix As Nix   ' Arr() indices 
    Dim Ws As Worksheet 
    Dim LastCol As Long 
    Dim LastRow As Long 
    Dim StatusArr As Variant 
    Dim R As Long, C As Long   ' Row/Column 
    Dim Stat As Nst, NewStat As Nst  ' status 

    'set worksheet to use 
    Set Ws = Sheets("Tony") 
    StatusArr = Array(NstNotJoined, NstOnLeave, NstLeft, NstPresent) 

    With Ws 
     ' prefix a period to refer to object in With statement 
     LastCol = .Cells(3, .Columns.Count).End(xlToLeft).Column 
     LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
     ReDim Arr(1 To (LastCol - 3), 1 To NixUnpaid) 

     For R = 4 To LastRow 
      Stat = NstNone     ' unable to determine changes in Wk 1 
      For C = 4 To LastCol 
       Wk = C - 3 
       NewStat = StatusArr(Application.Match(Val(.Cells(R, C).Value), StatusArr, 1) - 1) 
       If NewStat <> Stat Then  ' count changes 
        ' Count joiners 
        If (Stat = NstNotJoined) And (NewStat = NstPresent) Then 
         Arr(Wk, NixJoined) = Arr(Wk, NixJoined) + 1 
        End If 
        ' count leavers 
        If (Stat <> NstLeft) And (NewStat = NstLeft) Then 
         Arr(Wk, NixLeft) = Arr(Wk, NixLeft) + 1 
        End If 
       End If 

       Stat = NewStat 
       If Stat = NstOnLeave Then Arr(Wk, NixUnpaid) = Arr(Wk, NixUnpaid) + 1 
       If Stat = NstPresent Then Arr(Wk, NixPresent) = Arr(Wk, NixPresent) + 1 
      Next C 
     Next R 

     .Cells(20, "D").Resize(UBound(Arr, 2), UBound(Arr, 1)).Value = Application.Transpose(Arr) 
    End With 
End Sub 

귀하의 기록에 다음과 같은 논리를 소개했습니다.

  1. -2 (아마도 왼쪽)
  2. 다른 양수
  3. 0 또는 공백 수단 "작동하지 않는"(아마도 무급)
  4. -1 수단 "휴가", "아직 합류"를 의미 근무 시간 (근무 예정)을 나타냅니다.

현재 사용중인 텍스트 대신 워크 시트에서이 번호를 사용하십시오. 필요하다면 코드를 번역하여 번역 할 수 있습니다. 코드에서이 숫자는 열거 형 Nst로 표시됩니다. NstNone이주의 시작 부분에 사용됩니다. 나는 당신의 시스템이 그 시점에서 결점이 있다고 생각한다. 왜냐하면 얼마나 많은 사람들이 이전 상태를 모른 채로 합류했거나 떠났는지 말할 수 없기 때문이다. NstNone은 갭을 연결합니다.

코드의 마지막 줄은 출력이 데이터가있는 동일한 시트의 범위 D20 : H23에 쓰여지는 것으로 결정합니다. 기존 데이터는 덮어 씁니다. 매크로는 열 A를 사용하여 평가할 직원 수를 결정하기 때문에 직원 ID 아래의 열 A에 아무 것도 쓰지 마십시오.

결과에 위의 주만큼 열이 있습니다. 그것은 Enum Nix에 의해 결정된 바와 같이 4 개의 행을 가지며, 이는 직원이 참석하고, 합류하고, 왼쪽과 왼쪽으로 지불되지 않은 휴가를 의미합니다.이 목록을 원하는 표제와 서식이있는 테이블에 붙여 넣는 것이 좋습니다. Enum Nix를 수정하여 시퀀스를 변경할 수 있습니다. 이름에 = 1 값을 지정하십시오. (그리고 열거 Nst을 셔플하지 마라.)

나의 숫자가 당신의 결과와 일치하지 않는다. 그것은 내가 당신의 결과를 이해하지 못했기 때문입니다. 그러나 숫자는 거기에 있다고 생각합니다. 추가 숫자가 필요하면 기존 시스템에 쉽게 통합 할 수 있습니다.