2017-04-18 58 views
1

我想創建一個共享的Excel時間表,供大約30名員工用於他們的日常計時。Excel VBA每月計時

這計時錶將記錄員工的日常時間戳他們:

Start of Pre-shift OverTime, End of Pre-shift Overtime, 
Time-In, Time-Out, 
Start of 1st break, End of 1st break, 
Start of Lunch, End of Lunch, 
Start of 2nd break, End of 2nd break, 
Start of Post-shift OverTime, End of Post-shift Overtime, Etc. 

我創建的窗體界面,特定員工可以勾選一個CheckBox記錄他/她的時間戳:

時間 - 中,超時,第一次休息開始,第一次休息結束等。時間戳然後被轉發到Sheet2中的表格,該表格捕獲該員工當天的所有時間戳。

我的問題是:當員工第二天回來工作時,前一天的所有時間戳會被當前時間的時間戳覆蓋。

一位專家給了我一個示例代碼,但「時間存儲」工作表中的數據似乎並不出現在一行中。相反,它出現在一個向下的對角線模式。

如果你能以任何方式幫助我,我將非常感激。

下面是示例代碼:

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim rngC As Range 
    Dim lngR As Long 
    Dim shtS As Worksheet 

    Set shtS = Worksheets("Time Storage") 

    If Intersect(Target, Range("B4:B12")) Is Nothing Then Exit Sub 

    lngR = shtS.Cells(shtS.Rows.Count, "A").End(xlUp).Row 

    If shtS.Cells(lngR, "A").End(xlUp).Value <> Date Then 
     lngR = shtS.Cells(shtS.Rows.Count, "A").End(xlUp).Row + 1 
     shtS.Cells(lngR, "A").Value = Date 
    End If 

    For Each rngC In Intersect(Target, Range("B4:B12")) 
     If rngC.Value <> "" Then 
      shtS.Cells(lngR, rngC.Row - 2).Value = Target.Value 
     End If 
    Next rngC 

End Sub 

(I輸入時間戳到細胞:名爲「時間輸入」片材的「B4 B12」,我至M它們存儲到B柱名爲片的「時間存儲」

問題是:。片似乎在「時間存儲」中的數據並沒有在一個單列水平出現相反,它會出現在一個向下的對角線圖案)

。編輯:分享截圖:

"Time Entry" Sheet

"Time Storage" Sheet

+0

你應該添加你的牀單的數據樣本「時代進入」和「時間存儲「 - 期望的結果(甚至讓他們手動) –

+0

對於你想要達到的目標,我不會使用'Worksheet_Change'事件,而是一個被Button或其他東西調用的Sub。 –

+0

我明白你在說什麼。我猜這裏使用Worksheet_Change事件的原因是因爲我們試圖自動執行此操作(以便每次創建時間戳時不再需要單擊任何按鈕)。但我絕對明白你的觀點。非常感謝您的反饋。 – studentlearner

回答

0

,如果你提供的截圖這將是比較容易診斷。我假設Time Storage中的每一行在列A中都有一個日期,而其餘的列則是對角填充的。

代碼在Worksheet_Change事件上運行,這意味着它每次更改任何單元時都會運行。每個被更改的單元格都會導致所有的代碼都運行,每次只添加一個值,只有一個值。

您應該只希望代碼在最後一個單元格更新結束時運行一次。假設您按順序填充單元格,則代碼應該只在目標範圍與B12相交時運行一次。所以此項檢查:

If Intersect(Target, Range("B4:B12")) Is Nothing Then Exit Sub 

應該是:

If Intersect(Target, Range("B12")) Is Nothing Then Exit Sub 

,然後循環應該通過所有單元運行。所以rngC應被聲明爲一個單元,而不是一個範圍和循環:

​​

實際上應該是:

For Each rngC In Range("B4:B12") 
+0

感謝您的快速響應先生。我編輯了我的帖子,並且包含了我的牀單的屏幕截圖。每次更改單元格時需要運行的原因是因爲我們需要實時的時間戳數據。儘管如此,你的帖子會以某種方式指出我正確的方向,雖然我還沒有弄明白,但我會看看我能做些什麼。再次感謝。非常感謝你的幫助。 – studentlearner

+0

預期結果屏幕截圖:http://imgur.com/a/oSKjT – studentlearner