複雑度とファンクションポイントを計算するエクセルマクロ
DET/RET/FTRから複雑度やファンクションポイントを計算するエクセルのマクロである.Excel2002では動いている.
使い方は以下の通り.
- メニューバーの「ツール」→「マクロ」→「Visual Basic Editor」
- メニューバーの「挿入」→「標準モジュール」
- 下記コードの“'---begin---”から“'---end---”までをコピー
- Visual Basic Editorを閉じる
- DET/RET/FTRをシート上に記述
- 結果を表示したいセルでメニューバーの「挿入」→「関数」
- ダイアログの「関数の分類」から「ユーザ定義」を選択
- 関数名に4個の関数(DataFunctionComplexity/DataFunctionPoint/TransactionalFunctionComplexity/TransactionalFunctionPoint)が出てくるので,適当なものを選ぶ.
- 関数を設定したセルに結果を表示
'---begin--- Option Explicit Type DataFunction det As Integer ret As Integer complexity As String End Type Type TransactionalFunction det As Integer ftr As Integer complexity As String End Type Const DET_MAX = 32767 '整数型の最大値 Const RET_MAX = 32767 Const FTR_MAX = 32767 Function DataFunctionComplexity(det As Integer, ret As Integer) As String Dim df(6) As DataFunction df(0).det = 50 df(0).ret = 1 df(0).complexity = "low" df(1).det = DET_MAX df(1).ret = 1 df(1).complexity = "average" df(2).det = 19 df(2).ret = 5 df(2).complexity = "low" df(3).det = 50 df(3).ret = 5 df(3).complexity = "average" df(4).det = DET_MAX df(4).ret = 5 df(4).complexity = "high" df(5).det = 19 df(5).ret = 6 df(5).complexity = "average" df(6).det = DET_MAX df(6).ret = RET_MAX df(6).complexity = "high" Dim i As Integer For i = LBound(df) To UBound(df) If det <= df(i).det And ret <= df(i).ret Then DataFunctionComplexity = df(i).complexity Exit For End If Next End Function Function DataFunctionPoint(filetype As String, complexity As String) As Integer Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") dic.Add "EIF,low", 5 dic.Add "EIF,average", 7 dic.Add "EIF,high", 10 dic.Add "ILF,low", 7 dic.Add "ILF,average", 10 dic.Add "ILF,high", 15 DataFunctionPoint = dic.Item(filetype + "," + complexity) End Function Function TransactionalFunctionComplexity(trantype As String, det As Integer, ftr As Integer) As String Dim ei(6) As TransactionalFunction ei(0).det = 15 ei(0).ftr = 1 ei(0).complexity = "low" ei(1).det = DET_MAX ei(1).ftr = 1 ei(1).complexity = "average" ei(2).det = 4 ei(2).ftr = 2 ei(2).complexity = "low" ei(3).det = 15 ei(3).ftr = 2 ei(3).complexity = "average" ei(4).det = DET_MAX ei(4).ftr = 2 ei(4).complexity = "high" ei(5).det = 4 ei(5).ftr = FTR_MAX ei(5).complexity = "average" ei(6).det = DET_MAX ei(6).ftr = FTR_MAX ei(6).complexity = "high" Dim eo_eq(6) As TransactionalFunction eo_eq(0).det = 19 eo_eq(0).ftr = 1 eo_eq(0).complexity = "low" eo_eq(1).det = DET_MAX eo_eq(1).ftr = 1 eo_eq(1).complexity = "average" eo_eq(2).det = 5 eo_eq(2).ftr = 3 eo_eq(2).complexity = "low" eo_eq(3).det = 19 eo_eq(3).ftr = 3 eo_eq(3).complexity = "average" eo_eq(4).det = DET_MAX eo_eq(4).ftr = 3 eo_eq(4).complexity = "high" eo_eq(5).det = 5 eo_eq(5).ftr = FTR_MAX eo_eq(5).complexity = "average" eo_eq(6).det = DET_MAX eo_eq(6).ftr = FTR_MAX eo_eq(6).complexity = "high" Dim tf() As TransactionalFunction If trantype = "EI" Then tf = ei Else tf = eo_eq End If Dim i As Integer For i = LBound(tf) To UBound(tf) If det <= tf(i).det And ftr <= tf(i).ftr Then TransactionalFunctionComplexity = tf(i).complexity Exit For End If Next End Function Function TransactionalFunctionPoint(trantype As String, complexity As String) As Integer Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") dic.Add "EI,low", 3 dic.Add "EI,average", 4 dic.Add "EI,high", 6 dic.Add "EO,low", 4 dic.Add "EO,average", 5 dic.Add "EO,high", 7 dic.Add "EQ,low", 3 dic.Add "EQ,average", 4 dic.Add "EQ,high", 6 TransactionalFunctionPoint = dic.Item(trantype + "," + complexity) End Function '---end---