2017-10-14 41 views
0

従業員一人あたりの週表示で時間を計算するタイムシートで作業しています。私は、従業員が会社の一部であるかどうか、未払いのまま残っているか、退職しているのか、またはすでに退職しているのかを判断するコードを実装しました。行の前のセルがカウンタに追加される前に同じであるかどうかを確認する方法

私がしようとしているのは、参加者、退去者、および無給休暇の人数を週ごとに示す表を作成することです。私はより意味のある説明をする前に存在していたランダムな値を交換しました

Data table :それはこのようになります私のデータをソートするコードを適用した後

最初にジョイナカウンタに値が「結合されていません」という行を追加するテーブルを作成したいので、カウントを複製しません。たとえば、ID 1の場合、週2〜5週間で参加者として数えたいとは思いません。

これまでのコードでは、移動する前に列ごとに調べています次の列に:

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に出力が書き込まれることを決定します。既存のデータは上書きされます。マクロは列Aを使用して評価する従業員の数を決定するため、従業員IDの下の列Aには何も書き込まないでください。

結果には、上記の週数と同じ数の列があります。これはEnum Nixによって決定された4行を持ちます。これは、従業員が存在し、参加し、未払いのまま残っていることを意味します。このアイデアは、キャプションと書式が必要なテーブルにこのリストを貼り付けることです。 Enum Nixを変更することでシーケンスを変更できます。ただ、最初の名前に値= 1を割り当ててください。 (そして、列挙型Nstとをシャッフルしないでください!)

私の数字は、あなたの結果のものと一致していません。それは私があなたの結果を理解しなかったからです。しかし、私は数字があると思うし、あなたは追加のものを必要とする場合、彼らは、確立されたシステムへの統合が容易になります。

関連する問題