Board logo

標題: [發問] 計算個別員工於週六上班次數 [打印本頁]

作者: hkyan    時間: 2014-4-12 17:07     標題: 計算個別員工於週六上班次數

如果要計算個別員工於週六上班次數(非空格),公式如何設定,請指導

[attach]17995[/attach]
作者: aer    時間: 2014-4-13 09:07

回復 1# hkyan

O2=COUNTIFS($B$1:$N$1,"*週六*",$B2:$N2,">""")

向下拉
作者: hkyan    時間: 2014-4-13 13:48

我沒說清楚,列1是自訂格式日期顯示,並非文字輸入,故公式不可行

此外,要再新增一欄記錄上次週六上班日期距離今日有多久,有可能用公式設置嗎?
作者: hkyan    時間: 2014-4-13 15:51

[attach]18003[/attach]
請幫忙
作者: GBKEE    時間: 2014-4-13 20:22

回復 4# hkyan
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng As Range, i As Integer, ii As Integer, R As Range, d1 As Object, d2 As Object
  4.     Set d1 = CreateObject("SCRIPTING.DICTIONARY")        '字典物件
  5.     Set d2 = CreateObject("SCRIPTING.DICTIONARY")        '字典物件
  6.     i = 2               '從B2欄數 開始
  7.     With ActiveSheet    '指定工作表
  8.         Do While .Cells(1, i) <> ""             '執行迴圈的條件: i欄的第一列 <>""
  9.             If Weekday(.Cells(1, i), 2) = 6 Then '日期的星期="週六"
  10.                 If Not Rng Is Nothing Then      '設定"週六"的位置
  11.                     Set Rng = Union(Rng, .Cells(1, i))
  12.                 Else
  13.                     Set Rng = .Cells(1, i)
  14.                 End If
  15.             End If
  16.             i = i + 1                           '下一個欄數
  17.         Loop
  18.         i = 2                                   '從A2列數 開始
  19.         Do While .Cells(i, "A") <> ""           '執行迴圈的條件: A欄的i列 <>""
  20.             '字典物件(KEY)對應一個 Item
  21.             d1(.Cells(i, "A").Value) = ""       '字典物件(KEY)的ITEM =""
  22.             d2(.Cells(i, "A").Value) = ""
  23.             For Each R In Rng                   '每一個 R 的星期都是"週六"
  24.                 If R.Cells(i) <> "" Then        'R.Cells(i):  R下方第i個Cell
  25.                     d1(.Cells(i, "A").Value) = Val(d1(.Cells(i, "A").Value)) + 1
  26.                                                 '字典物件(KEY) =VAL(字典物件(KEY))+1 (對應的 Item)
  27.                     d2(.Cells(i, "A").Value) = Date - R
  28.                                                 '字典物件(KEY) =當日- R [天數](對應的 Item)
  29.                 End If
  30.             Next
  31.             i = i + 1
  32.         Loop
  33.         Range("R2").Resize(d1.Count).Value = Application.Transpose(d1.ITEMS)
  34.         Range("S2").Resize(d1.Count).Value = Application.Transpose(d2.ITEMS)
  35.         
  36.     End With
  37. End Sub
複製代碼

作者: yen956    時間: 2014-4-14 19:30

回復 4# hkyan
(注意:為了讓日期更具發展性, 刻意將你的樣本的統計欄位調到最左邊)
如下圖, 試試看:
  1. Option Explicit
  2. Private Sub CommandButton1_Click()
  3.     Dim i, j, lastRow, lastCol As Integer
  4.     Dim 距今 As Long
  5.     lastRow = [C65536].End(xlUp).Row
  6.     lastCol = [IV1].End(xlToLeft).Column
  7.     [A2].Resize(lastRow, 2) = ""
  8.     For i = 4 To lastCol
  9.         If Weekday(Cells(1, i), vbMonday) = 6 Then
  10.             距今 = Date - Cells(1, i)
  11.             For j = 2 To lastRow
  12.                 If Cells(j, i) <> "" Then
  13.                     Cells(j, 1) = Cells(j, 1) + 1   '週六加班日數+1
  14.                     Cells(j, 2) = 距今
  15.                 End If
  16.             Next
  17.         End If
  18.     Next
  19. End Sub
複製代碼

作者: Andy2483    時間: 2023-4-20 16:32

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教

執行前:
[attach]36198[/attach]

執行結果:
[attach]36199[/attach]


Option Explicit
Sub TEST()
Dim Brr, Y, i&, j&, xR As Range
Set Y = CreateObject("Scripting.Dictionary")
Set xR = Range([S1], Cells(Rows.Count, "A").End(3))
xR.Offset(1, 17).ClearContents: Brr = xR
For i = 2 To UBound(Brr)
   For j = 2 To UBound(Brr, 2) - 3
      If Format(Brr(1, j), "aaaa") = "星期六" And Trim(Brr(i, j)) <> "" Then
         Brr(i, UBound(Brr, 2) - 1) = Brr(i, UBound(Brr, 2) - 1) + 1
         If Brr(1, j) > Y(i) Then
            Brr(i, UBound(Brr, 2)) = Date - Brr(1, j)
            Y(i) = Brr(1, j)
         End If
      End If
   Next
Next
xR = Brr
Set Y = Nothing: Set xR = Nothing: Erase Brr
End Sub
作者: hcm19522    時間: 2023-4-21 11:45

R2=SUMPRODUCT((TEXT(B$1:P$1,"AAA")="週六")*(B2:P2<>""))




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