2017-10-14 42 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. -1表示 “休假”(据推测未付)
  3. 0或空白表示 “不工作”(据推测左)
  4. 任何其他正数表示工作时间(假定为工作)

请使用工作表,而不是你目前有文本上的这些数字。如果需要,可以编写代码来翻译它们。在代码中,这些数字用Enum Nst表示。在本周开始时使用NstNone。我认为你的系统在这一点上是有缺陷的,因为你不知道有多少人加入或离开而不知道以前的状态。 NstNone弥合了差距。

的最后一行代码确定该输出将被写在范围D20:在其上的数据被发现的相同片材的H23。现有数据将被覆盖。请务必在员工ID下面的A列中填写任何内容,因为宏使用列A来确定要评估的员工人数。

你有以上周的结果将有尽可能多的列。它将由Enum Nix确定的4行,这意味着员工在场,加入,离开和无薪休假。这个想法是,你可以将这个列表粘贴到一个你想要的字幕和格式的表格中。您可以通过修改Enum Nix来更改序列。请务必将值0123'分配给名字。 (并且不要洗牌Enum Nst!)

我的号码与结果中的号码不匹配。那是因为我不明白你的结果。但是,我认为数字在那里,如果您需要额外的数字,他们将很容易融入到既定的系统中。

相关问题