Excel 中的清洁代码?

Clean Code in Excel?

作为一名前程序员,我喜欢干净、可维护和文档化的代码。

作为一名项目经理,我不得不时不时地做一些复杂的 excel,并且想像编写程序一样编写 "clean" 公式。

  1. (如何)我可以将 "comments" 添加到(多行)公式中吗?

  2. (如何)我可以 "name" 一个(单元格相关的)公式并重新使用它吗? (例如,将其编写为带参数的 vb(甚至 f#)函数)

示例 1:而不是

=IF(AND(L+(L-1)*7>=$C15;L+(L-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+(L-1)*7>=$C15;L+(L-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

我可能会编写用户定义函数 (UDF) 而不是 example1

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

然后写

=Utilization(L11,A15)

作为一名前函数式程序员,我想出了下面给出的用户定义函数来解决我的问题。

注意以下几点:

  • 我只编写 "pure" 将输入参数映射到的数学函数 结果,没有状态变化,input/output,for 循环或类似的 涉及。 (至少我是这么想的,"Let"和VBA显然不是"pure"..)
  • 单元格引用和自动完成将在 sheet 秒内完成(excel 在这里很强大)
  • 常量被定义为特殊 sheet 中的命名范围,称为 "Constants"

给定一项具有估计工作量以及开始和结束日期的任务,我需要多少人? => 100% 意味着一个人需要全职工作(假设她每周工作 x 天,如常数中固定的那样)

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 调用的可读名称和对 "BaseLine1" 的引用,这是我的实际项目计划。扩展它以获得其他场景等将非常容易

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

最后,我按以下方式使用它:我有一个主 table,其中包含所有任务,包括它们的日期和每个团队的估计工作量。在另一个 sheet 中,我在横向上显示周数,在纵向上显示每个团队的任务。在单元格中,我使用函数 "currentUtil" 并使用自动完成和条件格式来获取计划的分析视图。

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