Board logo

標題: [發問] 自定函數-選擇權權利金報價單問題 [打印本頁]

作者: frantz    時間: 2016-4-4 01:36     標題: 自定函數-選擇權權利金報價單問題

權利金報價單位       
報價未滿10點:0.1點(5元)
報價10點以上,未滿50點:0.5點(25元)
報價50點以上,未滿500點:1點(50元)
報價500點以上,未滿1,000點:5點(250元)
報價1,000點以上:10點(500元)

小弟參考以上規則自己嘗試利用自定函數方式編寫出以下的寫法
不知道這樣子寫需不需要在修正呢 。
能否請前輩指點一下。
謝謝。
  1. Function MyOP(V As String, V1 As Double)
  2.   
  3.    If V <= 10 Then
  4.     MyOP = Round(V1, 1)
  5.     End If
  6.    
  7.     If (Len(V) = 2 Or Len(V) >= 4) Then
  8.     If V > 10 And V < 50 And Mid(V, 1, 4) >= 0 And Mid(V, 1, 4) <= 4 Then
  9.     MyOP = Round(V1, 0)
  10.     ElseIf V > 10 And V < 50 And Mid(V, Len(V), Len(V)) = 5 Then
  11.     MyOP = Mid(Int(V1), 1, 2) + 0.5
  12.     ElseIf V > 10 And V < 50 And Mid(V, Len(V), Len(V)) > 5 Then
  13.     MyOP = Round(V1, 0)
  14.     End If
  15.     End If
  16.    
  17.    
  18.    
  19.    
  20.     If V <= 100 And V1 >= 50 Then
  21.     MyOP = Mid(Int(V1), 1, 2) + 1
  22.    
  23.     ElseIf V < 500 And V1 > 100 Then
  24.     MyOP = Mid(Int(V1), 1, 3) + 1
  25.    
  26.     ElseIf V <= 1000 And V >= 500 Then
  27.     MyOP = (Mid(Round(V1, 0), 1, 2) * 10) + 5
  28.    
  29.     ElseIf V <= 10000 And V > 1000 Then
  30.     MyOP = (Mid(Round(V1, 0), 1, 3) * 10) + 10
  31.     ElseIf V > 10000 Then
  32.     MyOP = (Mid(Round(V1, 0), 1, 4) * 10) + 10
  33.    
  34.     End If
  35. End Function
複製代碼

作者: GBKEE    時間: 2016-4-4 05:59

本帖最後由 GBKEE 於 2016-4-4 06:25 編輯

回復 1# frantz
  1. Option Explicit
  2. Sub Ex()
  3.     MsgBox "權利金報價單位" & MyOP(48)
  4. End Sub
  5. '****** 陣列中 Match ****
  6. Function MyOP(V As Double) As Double
  7.     Dim AR(), ArOp(), m As Integer
  8.     AR = Array(1000, 999, 499, 49, 9, 0)
  9.     ArOp = Array(10, 5, 1, 0.5, 0.1, 0)
  10.     m = Application.Match(V, AR, -1)
  11.     MyOP = ArOp(m - 1)
  12. End Function
  13. '******Select Case ****
  14. Function MyOP(V As Double) As Double
  15.     Select Case V
  16.         Case Is <= 0
  17.             MyOP = 0
  18.         Case Is < 10            '報價未滿10點:0.1點(5元)
  19.             MyOP = 0.1
  20.         Case 10 To 49        '報價10點以上,未滿50點:0.5點(25元)
  21.             MyOP = 0.5
  22.         Case 50 To 499      '報價50點以上,未滿500點:1點(50元)
  23.             MyOP = 1
  24.         Case 500 To 999     '報價500點以上,未滿1,000點:5點(250元)
  25.             MyOP = 5
  26.         Case Is > 999    '報價1,000點以上:10點(500元)
  27.             MyOP = 10
  28.     End Select
  29. End Function
複製代碼

作者: 准提部林    時間: 2016-4-4 12:56

本帖最後由 准提部林 於 2016-4-4 12:59 編輯

Function MyOP(V As String, V1 As Double)
V是數值, 何以定義為[文字]型態, 若無法確定其型態, 可不定義, 其為單一元素, 影響應不大!
另用 MID 去取數, 就有點畫蛇添足, 化簡為繁, 直接用[常數]不是較好? 或者有其它理由?
=========================================
除了超版的方法, 一般用 IF 的方法:( 注意:判斷是由大而小, 與公式的 IF 規則相同)
Function MyOP_1(V)
If V >= 1000 Then
  MyOP_1 = 10
ElseIf V >= 500 Then
  MyOP_1 = 5
ElseIf V >= 50 Then
  MyOP_1 = 1
ElseIf V >= 10 Then
  MyOP_1 = 0.5
ElseIf V > 0 Then
  MyOP_1 = 0.1
End If
End Function
 
IF公式:=IF(A1>=1000,10,IF(A1>=500,5,IF(A1>=50,1,IF(A1>=10,0.5,IF(A1>0,0.1,0)))))
==========================================
一般人少用的 SWITCH:
Function MyOP_2(V)
If V > 0 Then
 MyOP_2 = Switch(V >= 1000, 10, V >= 500, 5, V >= 50, 1, V >= 10, 0.5, V > 0, 0.1)
End If
End Function
==========================================
這是工作表函數法:
Function MyOP_3(V)
If V > 0 Then
 MyOP_3 = Application.Lookup(V, Array(0, 10, 50, 500, 1000), Array(0.1, 0.5, 1, 5, 10))
End If
End Function
==========================================
不用VBA,一般公式:
=IF(A1<=0,0,LOOKUP(A1,{0,10,50,500,1000},{0.1,0.5,1,5,10}))
=IF(A1<=0,0,MAX((A1>={0,10,50,500,1000})*{0.1,0.5,1,5,10}))
作者: frantz    時間: 2016-4-4 16:58

回復 2# GBKEE


    謝謝超版
待會我回去TRY
瞭解當中的不同處
作者: frantz    時間: 2016-4-4 17:03

回復 3# 准提部林


    謝謝前輩
當初會寫這個是因為有用一般公式計算選擇權的撐壓價。
會有在價格大於五十元之後,仍有小數位的問題。
因此想把這些大於五十元之上的數字可以四捨五入進位。
用進位方式去呈現符合規則的數字。
待會回去我一個個TRY看看不同處。
作者: frantz    時間: 2016-4-4 19:46

回復 2# GBKEE
回復 3# 准提部林

謝謝兩位前輩提供的寫法
剛剛測試後,發現寫法呈現出來效果都是一樣。
如我按48.1 或者48.5、48.6等情形時,
出來都是0.5
但如果要四捨五入進位判斷的話。
能不能寫成如下呢?
  1. Function MyOP(V)
  2. MyOP = Switch(V >= 1000, 10, V >= 500, 5, V >= 50, 1, V >= 10, 0.5, V > 0, 0.1)

  3. If (V > 0 And V <= 10) Then
  4.   MyOP = V
  5. End If
  6.   
  7. If V > 10 Then
  8.     If Round(V, 2) - Int(V) = 0 Then
  9.     MyOP = Int(V)
  10.     ElseIf (Round(V, 4) - Int(V) >= 0.001 And Round(V, 4) - Int(V) <= 0.5) Then
  11.     MyOP = Int(V) + MyOP
  12.     Else
  13.     MyOP = Round(V, 0)
  14.     End If


  15. End If
  16. End Function
複製代碼

作者: frantz    時間: 2016-4-4 21:15

剛剛小弟自己在重新思考寫法如下
配合規則進行點數計算時,能更貼進規則。
10點以下跳數時,『每跳動』是0.1點計算(計算出來應該是9.5、9.6、9.7)
10點以上未滿50點,『每跳動』是0.5點計算(計算出來應該是10、10.5、11)
50點以上未滿500點,『每跳動』是1點計算(計算出來應該是51、52、53)
500點以上未滿1000點,『每跳動』是5點計算(計算出來應該是500、505、510)
1000點以上時,『每跳動』是10點計算(計算出來應該是1000、1020、1030)
  1. Function MyOP(V As Double) As Double
  2. Dim t, a
  3. t = Round(V, 4) - Int(V)
  4.     Select Case V
  5.         Case Is <= 0
  6.             a = 0
  7.         Case Is < 10            '報價未滿10點:0.1點(5元)
  8.             a = 0.1
  9.         Case 10 To 49        '報價10點以上,未滿50點:0.5點(25元)
  10.             a = 0.5
  11.         Case 50 To 499      '報價50點以上,未滿500點:1點(50元)
  12.             a = 1
  13.         Case 500 To 999     '報價500點以上,未滿1,000點:5點(250元)
  14.             a = 5
  15.         Case Is > 999    '報價1,000點以上:10點(500元)
  16.             a = 10
  17.     End Select


  18. If (V >= 0 And V < 10) Then
  19.     Select Case t
  20.     Case Is <= 0
  21.         MyOP = 0.1
  22.     Case Is < 10
  23.         MyOP = V
  24.     End Select
  25. ElseIf (V >= 10 And V < 50) Then
  26.     Select Case t
  27.     Case Is <= 0
  28.         MyOP = Int(V)
  29.     Case 0.0001 To 0.5
  30.         MyOP = Int(V) + a
  31.     Case Is > 0.5
  32.        MyOP = Round(V, 0)
  33.     End Select
  34. ElseIf (V >= 50 And V < 500) Then
  35.     Select Case t
  36.     Case Is <= 0
  37.         MyOP = Int(V)
  38.     Case 0.0001 To 0.4999
  39.         MyOP = Int(V)
  40.     Case Is = 0.5
  41.        MyOP = Round(V, 0) + a
  42.     Case Is > 0.5
  43.        MyOP = Round(V, 0)
  44.     End Select
  45. ElseIf (V >= 500 And V < 1000) Then
  46.     Select Case t
  47.     Case Is <= 0
  48.         MyOP = WorksheetFunction.RoundDown(V, -1)
  49.     Case 0.0001 To 0.4999
  50.         MyOP = WorksheetFunction.RoundDown(V, -1) + a
  51.     Case Is = 0.5
  52.        MyOP = WorksheetFunction.RoundDown(V, -1) + a
  53.     Case Is > 0.5
  54.        MyOP = WorksheetFunction.RoundDown(V, -1) + a
  55.     End Select
  56. ElseIf V >= 1000 Then
  57.     Select Case t
  58.     Case Is <= 0
  59.         MyOP = WorksheetFunction.RoundDown(V, -1)
  60.     Case 0.0001 To 0.4999
  61.         MyOP = WorksheetFunction.RoundDown(V, -1)
  62.     Case Is = 0.5
  63.        MyOP = WorksheetFunction.RoundDown(V, -1) + a
  64.     Case Is > 0.5
  65.        MyOP = WorksheetFunction.RoundDown(V, -1) + a
  66.    
  67.     End Select
  68. End If


  69. End Function
複製代碼





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