Board logo

標題: 如何利用VBA觸發儲存格產生日期.時間 [打印本頁]

作者: man65boy    時間: 2016-1-8 10:41     標題: 如何利用VBA觸發儲存格產生日期.時間

請教老師們如何在工作表觸發儲存格後,對應的欄位產生日期.時間
1.B欄輸入文字後,d欄對應欄位就顯現日期.時間,B欄沒輸入,
   D欄對應欄位就反白。
2.C欄輸入文字後,E欄對應欄位就顯現日期.時間,C欄沒輸入,
   E欄對應欄位就反白。
3.F欄為合計計算時間欄位。

謝謝老師們幫忙!
附檔:[attach]23063[/attach]
作者: ML089    時間: 2016-1-8 14:54

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Dim r%, xD As Range, xE As Range, xF As Range
  3. With Target
  4.       If .Count > 1 Then Exit Sub
  5.       If Intersect(Union([B:B], [C:C]), .Cells) Is Nothing Then Exit Sub
  6.       Application.EnableEvents = False
  7.       .Offset(0, 2).Value = Now()
  8.       r = .Row() - 1: Set xD = [D1].Offset(r, 0): Set xE = [E1].Offset(r, 0): Set xF = [F1].Offset(r, 0)
  9.       If Application.Count(xD, xE) = 2 Then xF = Int((xE - xD) * 24 * 60)
  10.       Application.EnableEvents = True
  11. End With
  12. End Sub
複製代碼

作者: man65boy    時間: 2016-1-8 15:29

回復 2# ML089

真多謝ML089老師的回答,如果輸入日期.時間後,我在手動更改起始時間或結束時間,可否讓統計的"分",也同時同步變更加總,麻煩老師了^^
作者: yen956    時間: 2016-1-8 15:39

回復 2# ML089
感謝 ML089超版的VBA的
作者: yen956    時間: 2016-1-8 15:42

本帖最後由 yen956 於 2016-1-8 15:55 編輯

試試看!!
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim Lst As Integer, r As Integer
  3.     Lst = [A65536].End(xlUp).Row
  4.     If Target.Count > 2 Then Exit Sub  '如果一次改變多格則沒作用
  5.     r = Target.Row
  6.     If r > Lst Then Exit Sub  '如果最下面的部門為空白則沒作用
  7.    
  8.     '如果改變的儲存格不在 B欄 或 C欄 則沒作用
  9.     If Target.Column <> 2 And Target.Column <> 3 Then Exit Sub
  10.    
  11.     '如果 Target 為空白, 則隔兩欄反白, 並清除[Fxx]
  12.     If Target = "" Then
  13.         Target.Offset(0, 2) = ""
  14.         Target.Offset(0, 2).Interior.ColorIndex = 35
  15.         Cells(r, 6) = ""
  16.     Else
  17.         Target.Offset(0, 2) = Now    '否則隔兩欄取消反白, 填入現在時間
  18.         Target.Offset(0, 2).Interior.ColorIndex = xlNone
  19.     End If
  20.         
  21.     '如果 [Dxx] 及 [Exx] 不是空白, 在 [Fxx] 計算時差(以分鐘為單位)
  22.     If Cells(r, 4) <> "" And Cells(r, 5) <> "" Then
  23.         Cells(r, 6) = Int((Cells(r, 5) - Cells(r, 4)) * 24 * 60)
  24.     End If
  25. End Sub
複製代碼
[attach]23068[/attach]
作者: ML089    時間: 2016-1-9 00:21

本帖最後由 ML089 於 2016-1-9 07:38 編輯

回復 3# man65boy

F欄直接用公式帶入

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
      If .Count > 1 Then Exit Sub
      If Intersect(Union([B:B], [C:C]), .Cells) Is Nothing Then Exit Sub
      Application.EnableEvents = False
      .Offset(0, 2).Value = Now()
      Range("F" & .Row) = "=IF(COUNT(RC4:RC5)=2,INT((RC5-RC4)*24*60),"""")"
      Application.EnableEvents = True
End With
End Sub

補充:
這是 相對位置公式
Range("F" & .Row) = "=IF(COUNT(RC[-2]:RC[-1])=2,INT((RC[-1]-RC[-2])*24*60),"""")"

這是 絕對位置公式
Range("F" & .Row) = "=IF(COUNT(RC4:RC5)=2,INT((RC5-RC4)*24*60),"""")"
作者: man65boy    時間: 2016-1-9 00:56

回復 5# yen956

謝謝yen956大大的回答,但如果手動更改時間的話,共計"分"可否同時更改數據,謝謝你!
作者: man65boy    時間: 2016-1-9 00:58

回復 6# ML089


    謝謝ML089大大的回答,給小弟多了一項解題的答案!真感謝^^
作者: ML089    時間: 2016-1-9 07:37

回復 8# man65boy

這是 相對位置公式
Range("F" & .Row) = "=IF(COUNT(RC[-2]:RC[-1])=2,INT((RC[-1]-RC[-2])*24*60),"""")"

這是 絕對位置公式
Range("F" & .Row) = "=IF(COUNT(RC4:RC5)=2,INT((RC5-RC4)*24*60),"""")"
作者: yen956    時間: 2016-1-9 12:19

回復 6# ML089
謝謝大大的指導!!
尤其是用
Range("F" & .Row) = "=IF(COUNT(RC4:RC5)=2,INT((RC5-RC4)*24*60),"""")"
的使用, 可以簡化不少 If A and B then ... 的寫法, 非常實用, 收下, 謝謝
作者: yen956    時間: 2016-1-9 14:15

回復 7# man65boy
"但如果手動更改時間的話,共計"分"可否同時更改數據"
看不懂你的需求是什麼?
作者: man65boy    時間: 2016-1-11 10:25

回復 11# yen956

   拍事,小弟沒寫明白!
    假設B5輸入人員後,D5跑出"起始時間",C5輸入人員後,E5跑出結束時間,之後VBA語法已經把F5做統計了,我在隨意更改起始時間D5,F5的統計時間就不會再更改了,是這個意思。
作者: yen956    時間: 2016-1-11 12:30

回復 12# man65boy
試試看:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Lst As Integer, r As Integer, Rng As Range
    Lst = [A65536].End(xlUp).Row    '取得 欄A 最下面非空白格的列號
    Set Rng = [B2].Resize(Lst - 1, 4)   '設定Worksheet_Change觸動範圍為[B2:Dxx], xx=Lst(列號)
    If Target.Count > 2 Then Exit Sub   '如果一次改變多格則沒作用
    If Intersect(Target, Rng) Is Nothing Then Exit Sub   '如果改變的儲存格不在預計範圍內則沒作用
    r = Target.Row
    '如果改變的儲存格是 B欄 或 C欄, 則
    If Target.Column = 2 Or Target.Column = 3 Then
        '★如果 Target 為空白, 則
        If Target = "" Then
            Target.Offset(0, 2) = ""                      '清除同列右邊兩欄的Cell
            Target.Offset(0, 2).Interior.ColorIndex = 35  '並反白
            Target.Cells(r, 6) = ""              '並清除同列的[Fxx]
        '★否則
        Else
            '如果同列右邊兩欄的Cell為空白, 則填入現在時間, 不是空白, 則不填
            If Target.Offset(0, 2) = "" Then
                Target.Offset(0, 2) = Now                         '填入現在時間
                Target.Offset(0, 2).Interior.ColorIndex = xlNone  '且取消反白
            End If
        End If
    End If
        
    '如果 起始時間 及 結束時間 不是空白, 則在 [Fxx] 計算時差(以分鐘為單位)
    If Application.Count(Cells(r, 4), Cells(r, 5)) = 2 Then
        Cells(r, 6) = Int((Cells(r, 5) - Cells(r, 4)) * 24 * 60)
    End If
End Sub
作者: man65boy    時間: 2016-1-11 18:26

回復 13# yen956


  謝謝yen956大大的幫忙,真的很好用,也謝謝ML089大大,感謝^^




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)