Board logo

標題: 職級判別 [打印本頁]

作者: somn    時間: 2018-4-30 14:26     標題: 職級判別

想請問各位高手
職級的判斷需修改為大於就跳一個級別 應該如何修正
因為無法想到該如何判斷這些表   只能用愚蠢的IF來做這個職級表,因if只能有七層所以用一欄當參照XD

[attach]28639[/attach]

附上檔案[attach]28640[/attach]
作者: p212    時間: 2018-4-30 16:27

利用定義名稱計算
請參考
作者: somn    時間: 2018-4-30 17:36

回復 2# p212
太厲害了!!!!!!
真的非常感謝你
作者: 准提部林    時間: 2018-4-30 21:28

本帖最後由 准提部林 於 2018-4-30 21:30 編輯

=MIN(10,LOOKUP(99,IF({1,0},1,LOOKUP(99,MATCH(C2,OFFSET($F$1,MATCH(B2,G:G,)-1,MATCH(A2,$F$1:$M$1,)+1,10),{1,0})+{1,0}))))

=MIN(10,LOOKUP(99,IF({1,0},1,LOOKUP(99,MATCH(C2,OFFSET($F$1,MATCH(B2,G:G,)-1,2+(A2="行政")*4,10),{1,0})+{1,0}))))

=MIN(10,LOOKUP(99,IF({1,0},1,LOOKUP(99,MATCH(C2,OFFSET($F$1,(CODE(B2)-65)*10+1,2+(A2="行政")*4,10),{1,0})+{1,0}))))

=MIN(10,IFERROR(LOOKUP(99,MATCH(C2,OFFSET($F$1,MATCH(B2,G:G,)-1,2+(A2="行政")*4,10),{1,0})+{1,0}),1))
作者: hcm19522    時間: 2018-5-2 09:54

=IFERROR(LOOKUP(1,0/(C2>OFFSET(J$2,MATCH(B2,J:J,)-2,MATCH(A2,I$1:P$1,),10)),L$2:L$11),1)
作者: ML089    時間: 2018-5-10 14:57

回復 1# somn

就資料特性可以簡化公式
1. F="工廠" J="行政",
2. G K 兩欄相同
3. A...F每種都是10個

D2 =MATCH(1,FREQUENCY(C2,OFFSET(H$1,MATCH(B2,G:G,)-1,N(A2=J$1)*4,10)),)

有些資料超過10級的金額,以11級替代。

若要維持為 10級,可以修正為
=MIN(10, 上述公式)
作者: Andy2483    時間: 2023-5-15 14:00

請教各位前輩:
這範例如何用VBA方式處理?
謝謝各位前輩
作者: Andy2483    時間: 2023-5-16 09:05

謝謝論壇,謝謝各位前輩
昨天這帖想不到方法,暫時擱下,昨晚運動完突然想到用參照表與資料表以輔助欄混和排序,就可以明確知道職級,將他納入字典,再吐出來
今天早上將昨晚想到的方法實現,學習方案如下,請各位前輩指導更好的辦法

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

輔助欄排序後:
[attach]36361[/attach]

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


Option Explicit
Sub TEST()
Dim Brr(1 To 1000, 1 To 4), Crr, A(3), Y, X&, R&, i&, C%, j%, K%, P$, Q$
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是 字典
Range([D2], [D65536].End(3)(2)).ClearContents
'↑令結果欄儲存格清除內容
A(1) = Range([D2], [A65536].End(3))
A(2) = Range([I2], [F65536].End(3))
A(3) = Range([M2], [J65536].End(3))
'↑令A變數這 一維陣列的1~3陣列值各為二維陣列,各以儲存格值帶入
For i = 1 To 3
   For R = 1 To UBound(A(i))
      X = X + 1
      For C = 1 To 4: Brr(X, C) = A(i)(R, C): Next
   Next
Next
'↑設迴圈將3個二維陣列寫入Brr陣列裡
C = Range([A1], ActiveSheet.UsedRange).Columns.Count
'↑令C變數是偵測使用儲存格最右邊欄數
With Cells(1, C + 1).Resize(X, 4)
'↑在使用儲存格右側增設輔助儲存格(不影響原始資料為原則)
   .Value = Brr
   .Sort KEY1:=.Item(1), Order1:=1, _
         Key2:=.Item(2), Order2:=1, _
         key3:=.Item(3), Order3:=2, _
         Header:=xlNo, Orientation:=xlTopToBottom
   '↑將陣列值寫入輔助儲存格後,做3層排序
   Crr = .Value
   '↑令Crr變數是 二維陣列,裝入輔助儲存格排序後的值
   For i = 1 To UBound(Crr)
   '↑設順迴圈!
      P = Crr(i, 1) & "|" & Crr(i, 2) & "|" & Crr(i, 3)
      '↑令P是1~3欄i迴圈列Crr陣列,以"|"間隔組成的新字串
      If InStr(P, Q) <> 1 Then K = 10
      '↑因為有些薪資大於10級薪資,而排序時列在迴圈最前面,
      '所以只要偵測到(性質|職別)不同前一迴圈,就先令K=10

      If Crr(i, 4) <> "" Then
         Q = Crr(i, 1) & "|" & Crr(i, 2): K = Crr(i, 4)
      End If
      Y(P) = K
      '↑令P這組合字串當key,item是K變數,納入Y字典裡
   Next
   .EntireColumn.Delete
   '↑令輔助儲存格欄位刪除
End With
Crr = A(1)
'↑令Crr換裝 A(1)這二維陣列
For i = 1 To UBound(Crr)
'↑設順迴圈
   P = Crr(i, 1) & "|" & Crr(i, 2) & "|" & Crr(i, 3)
   Crr(i, 1) = Y(P)
   '↑令以P這組合字串查Y字典得到的item值寫入Crr陣列第1欄裡,
   '寫在Crr陣列第1欄的原因是方便將陣列值寫入儲存格裡,
   '畢竟第1欄的陣列值除了被用來組合成P變數也沒有用途了

Next
[D2].Resize(UBound(Crr), 1) = Crr
'↑令Crr陣列第1欄值寫入從[D2]開始的儲存格中
Set Y = Nothing: Erase Brr, Crr, A
'↑令釋放變數
End Sub




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