返回列表 上一主題 發帖

求每月最大與最小NO之計算

不管了, 做個檢測版+月報表+日報表:
XX20180822-1.rar (139.13 KB)

就做到這裡, 花太多時間了~~

TOP

謝謝版主,阿佐大大的幫忙.
希望支持!

TOP

本帖最後由 GBKEE 於 2018-8-31 08:35 編輯

回復 22# s7659109

適用  求每月最大與最小NO之計算0822進階版.xlsm
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim AR(), Rng As Range, i As Integer, ii As Integer, iii As Integer, xYear As String, AB As Variant
  4.     '**工作表1上有一些函數執行程式時會重新計算,影響執行速度.**
  5.     Application.Calculation = xlManual   '設定代表計算模式為手動
  6.     With 工作表1.Range("A1").CurrentRegion
  7.     '**Range.CurrentRegion 屬性 傳回 Range 物件,該物件代表目前的區域。目前區域是指以任意空白列及空白欄的組合為邊界的範圍。唯讀的
  8.         .Sort key1:=.Cells(1), key2:=.Cells(1, 2), key3:=.Cells(1, 3), Header:=xlYes
  9.         '** 資料排序
  10.     End With
  11.     With 工作表2
  12.         .UsedRange.Clear '不必作整個工作表的清除
  13.         '**Worksheet.UsedRange 屬性 會傳回 Range 物件,此物件代表指定工作表上的已用範圍。唯讀的。
  14.         
  15.         '**篩選出 工作表1.Range("Al:A")上不重複的ITEM到.Range("A1")下***
  16.         工作表1.Range("A1").CurrentRegion.Columns(1).AdvancedFilter xlFilterCopy, "", .Range("A1"), True
  17.         '**Range.AdvancedFilter 方法 根據準則範圍,從清單中篩選或複製資料。如果初始選擇為單一儲存格,則會使用儲存格的目前區域。
  18.         
  19.         .Range("C1").Resize(, 2) = Array(工作表1.[A1], 工作表1.[D1])
  20.         .Range("C3").Resize(, 3) = Array(工作表1.[A1], 工作表1.[B1], 工作表1.[D1])
  21.         Set Rng = .[a2]
  22.         xYear = Mid(工作表1.Range("D2"), 1, Len(工作表1.Range("D2")) - 4)  '年份
  23.         ReDim AR(1 To Rng.End(xlDown).Row, 1 To 49)  '**ReDim 陳述式 在程序層次中用來重新配置動態陣列變數的儲存空間。
  24.         Do
  25.             AR(Rng.Row, 1) = Rng  '導入ITEM  **.Range("A1")下不重複的ITEM**
  26.             For i = 1 To 12
  27.                 '***篩選準則****
  28.                 .Range("C2") = Rng  'ITEM
  29.                 .Range("D2") = xYear & Format(i, "00") & "*"  '年份&月份
  30.                 '** 進階篩選**
  31.                 工作表1.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("C1").Resize(2, 2), CopyToRange:=.Range("C3").Resize(, 3), Unique:=True
  32.              If .Range("d4") <> "" Then '篩選出資料
  33.                 AR(Rng.Row, ((i - 1) * 4) + 2) = .Range("d4")       '最小
  34.                 If .Range("d4").End(xlDown).Row = Rows.Count Then   '資料只有一筆
  35.                     AR(Rng.Row, ((i - 1) * 4) + 3) = .Range("d4")   '最大
  36.                     AR(Rng.Row, ((i - 1) * 4) + 5) = 1               '計數
  37.                 Else
  38.                     For iii = .Range("d4") + 1 To .Range("d4").End(xlDown) - 1  '第二最小值 TO  第二最大值的迴圈
  39.                         AB = Application.Match(Format(iii, "00000"), .Range(.Range("d4"), .Range("d4").End(xlDown)), 0)
  40.                         If IsError(AB) Then AR(Rng.Row, ((i - 1) * 4) + 4) = IIf(AR(Rng.Row, ((i - 1) * 4) + 4) <> "", AR(Rng.Row, ((i - 1) * 4) + 4) & ",", "'") & Format(iii, "00000")
  41.                         'AB是錯誤值->  iii為 "01中間漏掉號碼"
  42.                     Next
  43.                     AR(Rng.Row, ((i - 1) * 4) + 3) = .Range("d4").End(xlDown)           '最大
  44.                     AR(Rng.Row, ((i - 1) * 4) + 5) = .Range("d4").End(xlDown).Row - 3   '計數
  45.                  End If
  46.              End If
  47.             Next
  48.             '**檢查月份間的遺漏**
  49.             For ii = 3 To UBound(AR, 2) - 4 Step 4
  50.                 AB = AR(Rng.Row, ii)
  51.                 Do While AB + 1 < Val(AR(Rng.Row, ii + 3))
  52.                     AR(Rng.Row, ii + 1) = IIf(AR(Rng.Row, ii + 1) <> "", AR(Rng.Row, ii + 1) & ",", "'") & Format(AB + 1, "00000")
  53.                     AB = AB + 1
  54.                 Loop
  55.             Next
  56.             Set Rng = Rng.Offset(1)  '下一個 .Range("A1")下不重複的ITEM
  57.         Loop Until Rng = ""   'Until->結束迴圈的條件
  58.     .UsedRange.Clear
  59.     With .Range("A1")
  60.         .Value = "月份"
  61.         AR(1, 1) = "項目"
  62.         For i = 1 To 12
  63.              With .Cells(1, (i - 1) * 4 + 2).Resize(, 4)
  64.                  .Merge
  65.                  .NumberFormatLocal = "00"
  66.                  .HorizontalAlignment = xlCenter
  67.                  .Value = i
  68.                 End With
  69.             For ii = 0 To 3
  70.                 AR(1, ii + ((i - 1) * 4) + 2) = Array("最小", "最大", "01中間漏掉號碼", "計數")(ii)
  71.                 If ii <= 1 Then
  72.                     .Cells(3, ii + ((i - 1) * 4) + 2).Resize(Rng.Row - 2).NumberFormatLocal = "00000"
  73.                 End If
  74.             Next
  75.         Next
  76.         .Offset(1).Resize(UBound(AR), UBound(AR, 2)) = AR
  77.         End With
  78.     End With
  79.     Application.Calculation = xlCalculationAutomatic   '計算模式為自動
  80. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

各種思路,可學習不同的寫法,謝謝GBKEE大大,但上面程式碼,AAA 00012 在2月RENO 00013開始之前  ,歸在1月漏號,漏掉碼未計入,少計1個了。
希望支持!

TOP

回復 24# s7659109

#23程式碼, 補上了  '**檢查月份間的遺漏**
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

謝謝GBKEE大大。
同一問題,3種解法,獲益良多,謝謝3位大大的幫忙。
希望支持!

TOP

        靜思自在 : 不怕事多,只怕多事。
返回列表 上一主題