Board logo

標題: 求每月最大與最小NO之計算 [打印本頁]

作者: s7659109    時間: 2018-8-20 09:42     標題: 求每月最大與最小NO之計算

問題:求每月最小與最大NO,漏掉NO與計數?
作者: ML089    時間: 2018-8-20 15:12

H3:I3 {=QUARTILE(IF(($G3=$A$2:$A$2336)*(H$1=MID($D$2:$D$2336,4,2)),--$B$2:$B$2336),{0,4}) }
選擇H3:I3這2格,陣列公式輸入, CTRL、SHIFT先按不放,在按ENTER輸入
選擇H3:I3這2格下拉

J3 {=IF(I3-H3+1=K3,"",LOOKUP(1,0/(FREQUENCY(IF(($G3=$A$2:$A$2336)*(H$1=MID($D$2:$D$2336,4,2)),--$B$2:$B$2336),ROW(INDIRECT(H3&":"&I3-1)))=0),ROW(INDIRECT(H3&":"&I3)))) }
只能求出缺數最後一個
陣列公式輸入, CTRL、SHIFT先按不放,在按ENTER輸入
下拉

K3 {=COUNT(0/FREQUENCY(IF(($G3=$A$2:$A$2336)*(H$1=MID($D$2:$D$2336,4,2)),--$B$2:$B$2336),--$B$2:$B$2336)) }
陣列公式輸入, CTRL、SHIFT先按不放,在按ENTER輸入
下拉

[attach]29240[/attach]
作者: s7659109    時間: 2018-8-20 20:37

ML089大大,漏掉數,是要扣掉,没說清楚,但公式,若漏在當月最後一筆,無法顯示,那如果漏掉二筆以上,函數是否足以應付?
作者: s7659109    時間: 2018-8-21 07:54

本帖最後由 s7659109 於 2018-8-21 07:55 編輯

增加漏號多筆時,無法篩選出來,另若當月漏在最後一筆也無法顯示,另外計數要將漏號扣除
作者: ML089    時間: 2018-8-21 16:16

回復 4# s7659109


J3 陣列公式,下拉
=MID(SUBSTITUTE(TEXT(SUM(IFERROR(LARGE((COUNTIFS($A:$A,$G3,$D:$D,LEFT($D3,3)&H$1&"*",$B:$B,ROW(INDIRECT(MAX(1,--H3)&":"&MAX(I3+0,L3-1))))=0) * ROW(INDIRECT(MAX(1,--H3)&":"&MAX(I3+0,L3-1))), ROW($1:$5))*10^{0;3;6;9;12},0)),REPT("、!0!0000",5)),"、00000",""),2,30)

公式假設 RENO是 00nnn 的3位數,最大可以取5缺數。若是 RENO是 nnnnn 的5位數,最大可以取3缺數,需修改公式。


[attach]29246[/attach]
作者: ML089    時間: 2018-8-21 16:19

ML089大大,漏掉數,是要扣掉,没說清楚,但公式,若漏在當月最後一筆,無法顯示,那如果漏掉二筆以上,函數是 ...
s7659109 發表於 2018-8-20 20:37


漏號位於當月最大與下月最小之間?               

號碼檢查方式,本月最小號 至 MAX(本月最大,下月最小-1)。
作者: s7659109    時間: 2018-8-21 19:57

ML089大大,謝謝,ok
作者: s7659109    時間: 2018-8-21 19:57

若以vba,該如何寫?
作者: 准提部林    時間: 2018-8-22 10:23

一月最後一號 0012
二月第一號 0015

那0013.0014如何判定是漏在哪一月???
最後一月最後一號0334, 如何判定後面的0335~????是否漏號???
再則有無跨年問題???
作者: s7659109    時間: 2018-8-22 11:12

問題:
        1.漏號可能在當月之間,也可能在次月之前,若在次月之前歸在前月,以AAA 1月為例,00003、00005在1月間,但00012在2月RENO 00013開始之前                                                                               
        2.新增按日期起訖號編列                                                                               
        無跨年度問題(僅1-12月)
作者: 准提部林    時間: 2018-8-22 21:11

VBA,只能加簡單的註解,思路及邏輯自行去摸(講也講不清):
[attach]29255[/attach]
 
看檔案可能有幾個問題:
1.同一ITEM,不同月份用了相同NO
2.後面的月份,用了前面的NO,例如:1月00001-00005 2月00008-00012 3月00006-00007
這兩個,用MSGBOX提示,並停止程序,
其他可能的錯誤,要自行去人工檢查∼∼
 
 
作者: s7659109    時間: 2018-8-23 09:00

版主,另外問題2按日期起訖可否一併解惑!
作者: 准提部林    時間: 2018-8-23 11:20

想用VBA解決, 將帖子移到這裡,
沒空中, 請別人是否有空幫下忙???
作者: s7659109    時間: 2018-8-23 20:48

了解,並謝謝版主
作者: 准提部林    時間: 2018-8-23 21:37

本帖最後由 准提部林 於 2018-8-23 21:38 編輯

有幾個問題:
1) item  reno  date 有可能出現任一空白嗎?   或reno不是5位數字?    或日期不是7位數字?
2) reno 是 "00000" 算正常嗎?   
3) 不同日期用了同一個reno?
4) reno 是不照日期順序的: 例如
     1030101 是  00001,00002,00005,00006,
   1030102 是  00003,00004
作者: s7659109    時間: 2018-8-24 13:59

本帖最後由 s7659109 於 2018-8-24 14:01 編輯

1.不會,reno是5位數字,日期是7位數字(可否轉換為2014/01/01)
2.只有item 中的DDD才會有
3.item 分為4類,AAA,BBB,CCC,DDD,以AAA為例,以日期順編reno,其它比照.
4.先有item個別分類為AAA,BBB,CCC,DDD, 再按個別分類依3.按date欄順序,再reno順編下來
作者: 准提部林    時間: 2018-8-24 14:42

回復 16# s7659109

AAA        00027                1030213
AAA        00027                1030213
AAA        00028                1030214
AAA        00028                1030214
AAA        00028                1030214
AAA        00025                1030217
AAA        00025                1030217
AAA        00025                1030217

AAA        00025                1030217
AAA        00029                1030226
AAA        00029                1030226

00025未按順序, 又是怎回事?
作者: 准提部林    時間: 2018-8-24 14:47

回復 16# s7659109

AAA        00102        1030702
AAA        00102        1030702
AAA        00103        1030703
AAA        00103        1030703

AAA        00104        1030705
AAA        00104        1030705
AAA        00103        1030712
AAA        00103        1030712
AAA        00103        1030712
AAA        00103        1030712
AAA        00103        1030712

AAA        00105        1030712
AAA        00105        1030712

00103 又是怎回事???
作者: a5007185    時間: 2018-8-24 17:49

回復 16# s7659109


不考慮準提大大所說的問題,
檔案如附件。

[attach]29267[/attach]
作者: s7659109    時間: 2018-8-24 21:54

本帖最後由 s7659109 於 2018-8-24 21:55 編輯

AAA        00025                1030217  因留用造成的
另更正資料檔,以下fix 00107
AAA        00103        1030712
AAA        00103        1030712
AAA        00103        1030712
AAA        00103        1030712
AAA        00103        1030712
作者: 准提部林    時間: 2018-8-24 21:54

不管了, 做個檢測版+月報表+日報表:
[attach]29269[/attach]

就做到這裡, 花太多時間了~~
作者: s7659109    時間: 2018-8-24 22:50

謝謝版主,阿佐大大的幫忙.
作者: GBKEE    時間: 2018-8-27 10:05

本帖最後由 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
複製代碼

作者: s7659109    時間: 2018-8-27 14:02

各種思路,可學習不同的寫法,謝謝GBKEE大大,但上面程式碼,AAA 00012 在2月RENO 00013開始之前  ,歸在1月漏號,漏掉碼未計入,少計1個了。
作者: GBKEE    時間: 2018-8-31 08:36

回復 24# s7659109

#23程式碼, 補上了  '**檢查月份間的遺漏**
作者: s7659109    時間: 2018-8-31 10:35

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




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