在Excel中清洁代码?

时间:2015-02-06 10:04:56

标签: vb.net excel f# functional-programming comments

作为一名前程序员,我喜欢干净,可维护和记录的代码。

作为一名项目经理,我不得不经常做复杂的擅长,并希望写出" clean"公式与我编写程序的方式相同。

  1. (如何)我可以添加"评论"成为(多线)公式?

  2. (如何)我可以"命名"一个(细胞相对)公式并重复使用它? (例如,将其写为带参数的vb(或甚至f#)函数)

  3. 示例1:而不是

    =IF(AND(L$11+(L$13-1)*7>=$C15;L$11+(L$13-1)*7<$D15);VLOOKUP($A15;RessourcePlan;12+$E15;WRONG);0)
    

    我想写:

    // check if this columns (L) date is inbetween startdate (Col C) and enddate (Col D)
    =IF (AND(L$11+(L$13-1)*7>=$C15;L$11+(L$13-1)*7<$D15);
    
        // then select the the utilisation (12+E15) for the resp. team from the resource plan
        VLOOKUP($A15;RessourcePlan;12+$E15;WRONG);
    
        // else default to 0
        0 
    
    ) //ENDIF
    

    而不是example1,我可能会写一个用户定义的函数(UDF)

    Function Utilization(thisDate As Date, task As String) As Double
        ... // clean VB or F# code
    End Function
    

    然后写

    =Utilization(L11,A15)
    

1 个答案:

答案 0 :(得分:0)

作为一名前功能强大的程序员,我为我的问题提出了下面给出的用户定义函数。

请注意以下几点:

  • 我只写&#34;纯粹&#34;将参数映射到的数学函数 结果,没有状态变化,输入/输出,for循环或类似 参与其中。 (至少我考虑到了这一点,&#34;让&#34;和VBA显然不是&#34;纯粹&#34; ..)
  • 单元格引用和自动完成将在工作表中完成(excel很强大)
  • 常量被定义为名为&#34;常量&#34;
  • 的特殊工作表中的命名范围

考虑到估计工作量和开始和结束日期的任务,我需要多少个人? =&GT; 100%意味着一个人需要在这个全职工作(假设她正在工作x天PerWeek,固定在常数中)

Public Function util(ByVal startDate As Date, ByVal endDate As Date, ByVal estimation As Double) As Double

 Dim duration As Integer
 Let duration = DateDiff("d", startDate, endDate)

 Dim weeks As Double
 Let weeks = duration / 7

 Dim pdays As Integer
 Let pdays = weeks * [daysPerWeek]

 util = estimation / pdays

End Function

由于我有许多任务和许多团队正在处理它们,我想知道我需要一个团队来完成一项任务的人数。以下函数重用上面的函数。请注意复杂Vlookup调用的可读名称以及对&#34; BaseLine1&#34;的引用。这是我的实际项目计划。扩展它以获得其他场景等非常容易。

Public Function currentUtil(currentDate As Date, id As String, team As Integer) As Double
  Dim result As Double

  Let startDate = Application.WorksheetFunction.VLookup(id, [BaseLine1], 11, 0)
  Let endDate = Application.WorksheetFunction.VLookup(id, [BaseLine1], 12, 0)
  Let estimation = Application.WorksheetFunction.VLookup(id, [BaseLine1], 5 + team, 0)

  If (currentDate >= startDate And currentDate < endDate) Then
    result = util(startDate, endDate, estimation)
  Else
    result = 0
  End If

  currentUtil = result

End Function

最后我通过以下方式使用它:我有一个包含所有任务的主表,包括日期和每个团队的估计工作量。在另一张表中,我在横向上有几个星期,在垂直上有每个团队的任务。在单元格中,我使用函数&#34; currentUtil&#34;并使用自动完成和条件格式来获得计划的分析视图。

最后,我得到了与以前相同的结果,但是以更加方便和可维护的形式。