Board logo

標題: [發問] 依照報表投線量與UPH<每小時產能>計算開機數 -- 發問 [打印本頁]

作者: v03586    時間: 2015-10-18 12:13     標題: 依照報表投線量與UPH<每小時產能>計算開機數 -- 發問

這個邏輯好複雜........
想問這邊的高手這種邏輯能不能寫成一個程式
執行結果如圖下圖
假設今日是10/4  (報表是10/4帶回家開始想邏輯.....)
計算報表中當天的投線量加總,去計算這樣的產能,需要開幾台機台
計算公式是   投線量/(UPH*21.5)  UPH是每小時產能    21.5是工作時間
[attach]22208[/attach]

再來是我的邏及串連方式跟我設計的UPH表格
檔案分成報表檔案All Card UPH檔案 UPH檔案又分資料表Layer 層別;執行結果檔案
首先判斷 如果報表上的PKG 跟 All Card UPH資料表的 PKG欄位一樣
報表上的Device取All Card UPH檔案 Layer資料表 關鍵字  如果一樣
如報表 Device P-MS030NV-P8039DA1-CTHE16GGD4-SKSC   Layer資料欄  16GGD4 = 16G*4
STG代表站點,後面M-UPH代表每個站點的UPH產能  STG所帶出來的就是要列入產能計算開機數
報表上的DateTime計算出當天10/4的總投線量加總   報表上CUSTNAME 欄位如果有ENG / CSP /則不列入計算
[attach]22207[/attach]


最後結果就如下圖
例如
PKG   MICRO SD B 8L 11*15  Device判斷出  16G*4   10月4日 投線量 47363   STG帶出CA0  DA0  DA1  DA2  所以這三個站點 就依照UPH計算公式算出開機數
投線量/(UPH*21.5)  UPH是每小時產能    21.5是工作時間
[attach]22208[/attach]


不知道這個邏輯有沒有BUG...能不能串出一個程式....

[attach]22209[/attach]
作者: v03586    時間: 2015-10-18 21:15

還有...針對特別的產品PKG

只要Device 找不到層別的 如TFBGA 168L 12*12MM   、 GAME CARD 15.2*12MM 等等...種類過多不及繁載
因為UPH的檔案還沒建立完全....有些PKG還沒建立

只要判斷PKG一樣   直接帶站點  計算UPH 開機數
如下圖的UPH檔案中這個PKG 是沒有層別的  所以只要報表的PKG一樣 就計算當日投線量  帶出UPH計算方式算開機數量
(報表中的範例我刪掉了....補上)
[attach]22211[/attach]


[attach]22212[/attach]
作者: v03586    時間: 2015-11-21 10:31

這問題還是卡了久...真的無解
不知道高手們有沒有什麼辦法呢...

Q1: 請問EXCEL 可以判斷欄位中的字串關鍵字嗎?
Q2: 此程式的呈現方法是我自己想的不知道可否完成
   2-1.點取按鈕後 先判斷報表中 當天投線日期 加總
[attach]22524[/attach]
        2-1-1. 如報表中C欄位字串有以下關鍵字則不列入加總計算 : HQ-5F   HQ5F   HQ-2F  HQ2F   AT7F   AT6F   CSP  ENG
[attach]22521[/attach]
   2-2.再去判斷Device 欄位(D欄位) 中的關鍵字 去判斷層別
如:P-MS030NV-P8039DA1-CTHE16GGD4-SKSC   =16G*4
如:A-MS064BZ-A766200T-CTHD08GD1-T   =8G*1
Device 中命名一定會有  數字G_數字 or  數字G_ _數字
G的後面可能會有1~3個英文字母 但字母後面一定會有數字  不知道能不能判斷出來....
如果不能 我在Layer 分頁中 有建立一個Device 跟Den(F)的表格  主要是從這邊去抓Device對應的層別
[attach]22522[/attach]
Q3:判斷完層別接下來就是依照PKG帶入對應的層別,只要UPH這個資料表所列出的STG(站點)
[attach]22523[/attach]
就帶入計算公式  投線量/(UPH*21.5)。 執行結果如圖
[attach]22525[/attach]
[attach]22526[/attach]
作者: v03586    時間: 2015-11-24 07:40

想詢問一下這邊高手!!以上我敘述的方法
是否真能將這個程程式呈現呢????
還是有哪邊邏輯上的BUG ???
想了一個多月了@@
作者: v03586    時間: 2015-11-25 20:35

回復 4# v03586


   

感覺Device層別判斷的運用 可以類似這篇
連結資料表Layer 去判斷UPH  不知道各位版大此方法能不能呈現出來
作者: GBKEE    時間: 2015-11-27 08:18

本帖最後由 GBKEE 於 2015-11-28 05:48 編輯

回復 5# v03586
一步一步來
  1. Option Explicit
  2. Const xNote = "HQ-5F,HQ5F,HQ-2F,HQ2F,AT7F,AT6F,CSP,ENG"
  3. Dim wB(1 To 2) As Workbook, xDevice As String, xDen As String
  4. Sub Ex()
  5.     Dim Pkg As String, Rng(1 To 2) As Range, Rng_Addres As String
  6.     Dim Ar, xMsg As Boolean, E As Variant
  7.     Set wB(1) = Workbooks("開機數計算程式xls.xls")
  8.     Set wB(2) = Workbooks("ONHAND2HR_FMC_PP__112015181315.xls")
  9.     Ar = Split(xNote, ",")
  10.     With Workbooks(2).Sheets(1)
  11.         Set Rng(1) = .Cells.Find("PKG Type :", LookIn:=xlValues, LOOKAT:=xlWhole)
  12.         Rng_Addres = Rng(1).Address
  13.         Do
  14.            Pkg = Rng(1).Cells(1, 4)
  15.             Set Rng(2) = Rng(1).Offset(1)
  16.             Do
  17.                 xMsg = True
  18.                 If Rng(2) <> "" Then
  19.                     For Each E In Ar
  20.                         If InStr(Rng(2).Cells(1, 3), E) Then
  21.                             xMsg = False
  22.                             Exit For
  23.                         End If
  24.                     Next
  25.                     If xMsg And InStr(Rng(2)(1, 4), "G") Then
  26.                         Ex_Device Rng(2)(1, 4)
  27.                     End If
  28.                 End If
  29.                 Set Rng(2) = Rng(2).Offset(1)
  30.             Loop Until Rng(2).Text = "SubTotal:"
  31.             
  32.             Set Rng(1) = .Cells.Find(Rng(1).Text, Rng(1))
  33.             Rng(1).Interior.Color = vbYellow
  34.         Loop Until Rng_Addres = Rng(1).Address
  35.        ' .Close False
  36.        MsgBox "OK"
  37.     End With
  38. End Sub
  39. Sub Ex_Device(S As String)
  40.     Dim i As Integer, xRng As Range
  41.     Debug.Print vbLf & S & " ---"   'VBA  即時算視窗 顯示
  42.     i = InStrRev(S, "G") - 1
  43.     Do While IsNumeric(Mid(S, i, 1))
  44.         i = i - 1
  45.     Loop
  46.     S = Mid(S, i + 1)
  47.     i = InStr(S, "-")
  48.     If i > 0 Then
  49.         S = Replace(Mid(S, 1, i - 1), "GG", "G")
  50.     Else
  51.         S = Replace(Mid(S, 1), "GG", "G")
  52.     End If
  53.     i = InStr(S, "G")
  54.     For i = InStr(S, "G") + 1 To Len(S)
  55.         If Mid(S, i, 1) Like "[0-9]" Then
  56.             S = Mid(S, 1, i)
  57.             Exit For
  58.         End If
  59.     Next
  60.     xDevice = S
  61.     xDen = Val(S) & "G*" & Mid(S, i, 1)
  62.     Set xRng = wB(1).Sheets("Layer").Cells.Find(xDevice, LookIn:=xlValues)
  63.     If xRng Is Nothing Then
  64.         Debug.Print "找不到 " & xDevice & vbTab & xDen
  65.     Else
  66.        Debug.Print "找到 " & xDevice & vbTab & xDen & " 在 " & xRng.Address(, , , 1)
  67.     End If
  68. End Sub
複製代碼

作者: v03586    時間: 2015-11-27 23:29

回復 6# GBKEE


    感謝大大的幫忙!!! 試Run一下目前已經可以辦別PKG欄位
我最頭痛的就是Device 的問題..因為公司的Device的命名到後面都沒有統一了(越來越多)
但大多數Micro / SD  / USB 系列基本上都通用~ 例外的部分真的想不出來 ( 公司的問題) 傷腦筋
作者: 准提部林    時間: 2015-11-28 22:14

本帖最後由 准提部林 於 2015-11-28 22:37 編輯

一天研究資料,一天尋思架構,一天寫程式,
本不想寫的(後續問題應不少,恐無法跟帖),僅能做到這裡,要放空了,
其它請自行努力看看∼∼

附檔下載:funp.net上不去, 只能提供這個下載址
[attach]22649[/attach]
http://www.funp.net/451843

DEVICE 命名方式九彎十八拐,開幾條高速公路也沒用,
想辦法從源頭去規範才是最好方法∼∼
作者: v03586    時間: 2015-11-28 23:25

回復 8# 准提部林


    真心感謝准提部林版大的不辭辛勞...版大真的也說到要害...Device命名真的是很傷腦筋
會與公司高層主管告知此項問題!感謝版大提供方法:)
作者: v03586    時間: 2015-11-29 00:38

本帖最後由 v03586 於 2015-11-29 00:39 編輯

回復 8# 准提部林


    [attach]22651[/attach]
請問一下版大  程式碼中 這一段是自己開啟程式碼去修改的
如果我改在資料欄中 如下圖這樣顯示
[attach]22652[/attach]

是不是只要程式碼改成
QDate = Sheets("comply").[H13]

雖然把資料欄的格式設訂11/25  但還是會帶出年分2015/11/25
執行後顯示 "無符合資料"  是因為EXCEL 欄位中2015 的關係嗎?
作者: 准提部林    時間: 2015-11-29 10:38

回復 10# v03586


報表的DATE TIME 並無[年度], 且為〔文字格式〕,11/08  16:31,
Split("11/08  16:31", " ")(0) 是取出 11/08,

若是以儲存格指定日期:
QDate = Format(Sheets("comply").[H13], "mm/dd")

若是固定為電腦日期的〔今天〕:
QDate = Format(Date, "mm/dd")
作者: 准提部林    時間: 2015-11-29 19:57

修改一下〔自訂函數〕,
看數據,DEVICE 似乎都以〔後面〕的節點為主,不過這還是概略的檢測法,無法百分百正確:

Function Get_Layer(xStr$) As String
Dim i%, j&, N%, U, T, TT$, Ta$, Tb$
T = xStr
For Each U In Array("02G", "04G", "08G"):  T = Replace(T, U, Mid(U, 2)):  Next
 
T = Split(T, "-")
For j = UBound(T) To 0 Step -1
  N = 0: Ta = "": Tb = ""
  For i = 7 To 1 Step -1
    TT = "-" & T(j)
    If N <> 5 Then
     N = InStr(TT, 2 ^ i & "G")
     If N > 0 Then If Not IsNumeric(Mid(TT, N - 1, 1)) Then Ta = 2 ^ i & "G": Exit For
    End If
  Next i
  If Ta = "" Then GoTo 101
 
  N = N + Len(Ta)
  For i = N To N + 2
    Tb = Mid(TT, i, 1)
    If Val(Mid(TT, i, 1)) Then Tb = Left(Val(Mid(TT, i)), 2): Exit For
    Tb = ""
  Next i
  If Tb <> "" Then Get_Layer = Ta & "*" & Tb: Exit Function
101: Next j
End Function
作者: v03586    時間: 2015-11-30 01:05

回復 12# 准提部林


    謝謝版大指教
請問一下版大... 請問是加在這區嗎?
[attach]22659[/attach]


感覺上<自訂函數法>與<合併兩法> 是能把層別判別的最清楚的一個方法~
作者: v03586    時間: 2015-11-30 01:22

Sorry sir ....知道修改哪裡了!!
作者: 准提部林    時間: 2015-11-30 10:07

本帖最後由 准提部林 於 2015-11-30 10:27 編輯

報表〔CUSTNAME〕符合〔指定關鍵字〕,不加總該筆數量∼∼ 

If InStr(RepArr(j, 2), "ENG") Or InStr(RepArr(j, 2), "CSP") Then GoTo 101
改成如下: 
Dim x, XX
XX = Array("HQ-5F", "HQ5F", "HQ-2F", "HQ2F", "AT7F", "AT6F", "CSP", "ENG")
For x = 0 To UBound(XX)
  If InStr(RepArr(j, 2), XX(x)) Then GoTo 101
Next
作者: v03586    時間: 2015-11-30 21:15

回復 15# 准提部林


    修改後果然加總數字比較接近總投線量了!!!!!感謝版大的support
作者: v03586    時間: 2015-12-1 14:45

本帖最後由 v03586 於 2015-12-1 14:46 編輯

回復 15# 准提部林


    版大請問一下如果要再做個微調  請問可行嗎?
增加一欄DEVICE 依照相同的Device  如圖
[attach]22692[/attach]
相同Device加總 最後呈現時帶出相同的加總  帶入計算
如執行結果圖↓

執行結果那邊欄與列  增加一個加總  如圖 可以嗎?
如果這樣計算出來的數值 是不是應該要無條件取整數?
[attach]22693[/attach]
作者: 准提部林    時間: 2015-12-1 18:28

回復 17# v03586


[attach]22694[/attach]
作者: v03586    時間: 2015-12-2 00:49

回復 18# 准提部林


    感謝版大針對需求的調整!!!
另外Total 的加總原本我想說自己預設函數Sum(F2:T2) 然後手動拉下去
沒想到按計算後 會把我的函數清除

藍色部分如果無法呈現沒關係
[attach]22696[/attach]
作者: c_c_lai    時間: 2015-12-2 07:39

回復 19# v03586
試試看:
  1. Sub 計算當日開機數()
  2.     Dim RepSht As Worksheet, RepArr, xD1, xD2, R&, C&
  3.              .
  4.              .
  5.              .
  6.     '  此處呼叫
  7.     GetSubTot
  8.     Application.GoTo xSht.[A2]
  9. End Sub
複製代碼
增加部分:
  1. Sub GetSubTot()
  2.     Dim Btm As Long, rPos As Long
  3.    
  4.     With Sheets("開機數")
  5.         Btm = .Range("A" & Rows.Count).End(xlUp).Row
  6.         rPos = Sheets("開機數").UsedRange.End(xlToRight).Column
  7.         If (Cells(1, rPos) = "Total") Then rPos = rPos - 1
  8.         .Cells(1, rPos + 1) = "Total"
  9.         .Cells(2, rPos + 1).Resize(Btm - 1).Formula = "=SUM(F" & 2 & ":T" & 2 & ")"
  10.         .Cells(2, rPos + 1).Resize(Btm - 1) = .Cells(2, rPos + 1).Resize(Btm - 1).Value
  11.         .Cells(Btm + 1, "B") = "                        Total"
  12.         .Cells(Btm + 1, "F").Resize(, 16).Formula = "=SUM(F" & 2 & ":F" & Btm & ")"
  13.         .Cells(Btm + 1, "F").Resize(, 16) = .Cells(Btm + 1, "F").Resize(, 16).Value
  14.     End With
  15. End Sub
複製代碼

作者: 准提部林    時間: 2015-12-2 10:22

本帖最後由 准提部林 於 2015-12-2 10:23 編輯

回復 19# v03586

加入[右方]及[下方]合計:
[attach]22698[/attach]

再特別提醒:
〔取代法〕:Layer工作表的對照資料必須完整,且依〔數字大〕〔字元數多〕者排在最上方,不然還是問題
例如:8GAA1.8GAA16
若只有8GAA1,而漏了8GAA16,則8GAA16會被視為8GAA1而取代之,
或.8GAA1排在8GAA16前面,則8GAA16也會〔優先〕被8GAA1取代,
同理.8GAA1排在128GAA1前面,則128GAA1也會〔優先〕被8GAA1取代!

多花些時間去了解〔取代〕順序不同,所造成的結果差異∼∼這只能靠自己去邏輯推演∼
作者: v03586    時間: 2015-12-2 23:14

本帖最後由 v03586 於 2015-12-2 23:18 編輯

回復 21# 准提部林


    感謝版大得提醒~今日已在公司將Layer取代法得關鍵字新增75組 目前共154組
且實際跑完後 有去核對報表帶出來的是否正確~截至目前為止還是正常得!!!
感謝版大大力得支援 感激不盡..!!!

另外請問一下 有些命名方式不一樣 可以使用取代法  自己將層別打上去嗎
例如
某個Device KDRCK4MWGD-HAXHHH-HHQ
[attach]22699[/attach]
就變成自己新增 用手動改儲存格  也能使用取代法吧!!
我測試試OK的~~特殊命名只能靠取代法去cover了!!
這種更改方式應該不會影響程式上的判斷吧
作者: 准提部林    時間: 2015-12-3 09:44

回復 22# v03586


若 KDRCK4MWGD-HAXHHH-HHQ 是一個完整的Device名稱,沒問題,
除非還有以下這些相近名稱,還是要注意其優先順序:
KDRCK4MWGD-HAXHHH-HHQR  = 6G*4
HKDRCK4MWGD-HAXHHH-HHQ  =6G*1
BKDRCK4MWGD-HAXHHH-HHQ2 =6G*2

另外,這些特別指定字串,其A欄的G數,不要輸入6,改為999,才會排在最上方!
作者: v03586    時間: 2015-12-5 01:20

本帖最後由 v03586 於 2015-12-5 01:26 編輯

回復 23# 准提部林


    這幾天試Run下來發現一個小問題, 不知道有沒有辦法解決
發現Device不同 部分製程組合不同
報表上的EE欄位是製程欄位
如圖 判斷出來雖然都是8G*1 但產品組合結構不同 ,製程欄位不同
[attach]22708[/attach]

如同先前的判斷就會出線不是這個Device得製程也會帶出數值
[attach]22709[/attach]

自己想得辦法不知可否解決
不知道可否從製程欄位中去判斷出是否有SA0,SA1,RA0,RA1,DA0,DA1.....CA2  就是執行結果表頭那些
在[報表] 欄位呈現 (如圖)
[attach]22710[/attach]
在依照報表層別後面有出現的站點去Link [UPH] 那資料表 (如圖連結方式)
[attach]22711[/attach]

最後層現就依照製程欄位有的去計算開機數


附上更新過取代法169組資料及最新報表檔案
[attach]22712[/attach]


※ 不知道那些沒有命名規則得可不可以利用製程欄位直接去計算   ( 如無辦法就只能去建立Device 去判斷層別了 )
因為沒層別也不知道要帶哪個層別的參數 (攤手)
作者: 准提部林    時間: 2015-12-5 22:03

回復 24# v03586


1.同一名稱不同製程?如何分類.加總,及列表?
2.有名稱,卻沒有製程參數可相除,數量/?/21.5,怎麼算?
3.EE欄部份有製程,部份則無,甚至不確定取出的製程是否完整?
  不是小問題,比對看看檔案中〔報表〕的G欄及H欄:[attach]22718[/attach]

近年底較忙,可能較沒時間跟帖,看是超板或其他大大可幫忙接手∼∼∼∼
作者: v03586    時間: 2015-12-5 23:42

本帖最後由 v03586 於 2015-12-5 23:44 編輯

回復 25# 准提部林


    真不好意思這麼麻煩版大....如果版大沒有空沒關係放著吧!!主要本身的是為主
目前第四版計算出來還是會出現如圖問題..
[attach]22721[/attach]
1.同一名稱不同製程?如何分類.加總,及列表?
        基本上依照Device種類不同做列表.. 同樣Device (=同層別) 做加總
        列表依照不同Device列出來(現在的不就是依照Device不同列出來了嗎!!)

[attach]22720[/attach]
2.有名稱,卻沒有製程參數可相除,數量/?/21.5,怎麼算?
        有名稱確沒有製程參數可相除...因為IE( Industrial Engineer) 並無把所有參數量測完整 (太多產品/種類) 需要日後慢慢建立補齊
        邏輯連結部分 可以判斷成....如果[報表]資料表上的G欄 如果對應不到 [UPH]資料表 上的製程參數 則就不計算嗎?

        目前的狀況沒參數也是沒計算  但就是列表出來而已 ,  只要[UPH]資料表...日後IE有補上資料 就能計算出來了
3.EE欄部份有製程,部份則無,甚至不確定取出的製程是否完整?
     EE欄位 製程欄位 部分無的部分看過了!!只要沒有表上得代表是別廠的製程
最一開始不是有先判斷CSP ENG AT7F....等等 那些都是別廠的報表...製程不同所以沒有那些製程
所以取出的完全正確

作者: 准提部林    時間: 2015-12-6 14:00

回復 26# v03586


找不到完全對策, 趁還有空檔修改一下:
[attach]22726[/attach]

程式是無料,但最終還是需要〔人工〕加料處理∼∼
作者: v03586    時間: 2015-12-9 01:36

回復 27# 准提部林


    感謝版大..!!! 這幾天將試著將執行出來的V 部分 , 補齊參數~再過一陣子review 看看了~~~




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