在添加到计数器之前,如何检查行之前的单元格是否相同

我正在制定一个时间表,每个员工每周查看一个小时。 我已经实施了一些代码,确定员工是否属于公司,无薪假,离开公司,或已经离开。

我想要做的是创build一个表格,告诉我join者,离职者和那些无薪假期的人数。

应用代码sorting我的数据后,它看起来像这样:

数据表 在哪里我已经用更有意义的描述取代了之前存在的随机值。

我想创build一个表,这是第一次添加到木匠计数器的值是未join'所以我不重复计数。 例如,身份证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)一次在任何给定的行,但每周查找这些值。 我正在努力争取像下面这样的桌子:

从数据中得到表

提前致谢!

我做了一半的工作。 请rest一下。 这是我得到的。 将代码粘贴到标准代码模块中,并将工作表的名称从“Tony”更改为正在testing的任何内容。

 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 

我向你的logging介绍了下面的逻辑。

  1. -2表示“尚未join”
  2. -1表示“请假”(大概无薪)
  3. 0或空白表示“不工作”(大概是左边)
  4. 任何其他正数表示工作时间(假定正在工作)

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

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

结果将有上面几周的列数。 它将由Enum Nix确定的4行,即员工在场,join,离开和无薪休假。 这个想法是,你可以将这个列表粘贴到一个你想要的字幕和格式的表格中。 您可以通过修改Enum Nix来改变序列。 只要确保将值= 1分配给名字。 (不要洗牌Enum Nst!)

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