在Excel中计算数据条件可能有所不同

我正在执教一支步枪射击小组,我正在devise一个程序来分析数据,所有需要的数据都存储在excel中的一个大的非规范化的表格中。 我希望能够计算每个射手的统计数据,如平均分,最高分,标准差等。我的总结表还需要一些variables来过滤数据,比如一天中的哪一天,哪一天的时间,远距离射击,一年。

我试图devise自己的function,如

Public Function AveScore(ShooterID As String, YearShot As Integer, Optional Day As String = "All Year", Optional TimeOfDay As String = "All Day", Optional Distance As String = "All", Optional OutOf As Integer = 40, Optional TopShots As Integer = 0, Optional AdjOutOf As Boolean = True) As Double 

这样我就可以轻松地在我的床单上打电话,让我轻松调整我的格式。 然而,由于filter的性质,他们有时会过滤一些数据和其他时间,我希望在这些领域的所有数据。 每个filter对应于表中的一个字段。

我发现使用循环来计算结果的结果是许多压倒性的陈述,这是不切实际的,因为我必须考虑到需要某些条件时的每种可能性

以下是我通过if语句创buildexcel公式,然后对其进行评估的尝试

 Public Function AveScore(ShooterID As String, YearShot As Integer, Optional Day As String = "Al Year", Optional TimeOfDay As String = "All Day", Optional Distance As String = "All", Optional OutOf As Integer = 40, Optional TopShots As Integer = 0, Optional AdjOutOf As Boolean = True) As Double 'if TopShots is 0 then no top and show all shots Dim formula As String: formula = "{=AVERAGE(" Dim top As Boolean: top = False Dim i As Integer 'check if they want to look at the top shots If TopShots <> 0 Then top = True formula = formula + "LARGE(" End If 'add 2 if statements that check year and shooterID formula = formula + "IF(DenormalizedTable[Year]=" & YearShot & ",IF(DenormalizedTable[ShooterID]=" & Chr(34) & ShooterID & Chr(34) & "," Dim counter As Integer: counter = 2 'check if its a day or period the add the IF statement If Day <> "All Year" Then Set c = Lists.Range("PeriodList").Find(Day, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then formula = formula + "IF(DenormalizedTable[Period]=" & Chr(34) & Day & Chr(34) & "," counter = counter + 1 Else Set c = Lists.Range("DayList").Find(Day, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then formula = formula + "IF(DenormalizedTable[Day]=" & Chr(34) & Day & Chr(34) & "," counter = counter + 1 End If End If End If 'and the time of day if If TimeOfDay <> "All Day" Then formula = formula + "IF(DenormalizedTable[TimeOfDay]=" & Chr(34) & TimeOfDay & Chr(34) & "," counter = counter + 1 End If 'Add the distance IF If Distance <> "All" Then formula = formula + "IF(DenormalizedTable[Distance]=" & Distance & "," counter = counter + 1 End If formula = formula + "DenormalizedTable[%Score]" 'add the brackets for the IFs For i = 1 To counter formula = formula + ")" Next i If top Then formula = formula + ",{" For i = 1 To TopShots formula = formula + i If i <> TopShots Then formula = formula + "," End If Next i formula = formula + "})" End If formula = formula + ")*" & OutOf & "}" MsgBox formula AveScore = Evaluate(formula) End Function 

对于我希望写的其他function来说,这个function似乎也是非常不切实际和不可用的

我希望有人能够提出一个办法来实现这个可行的分析

我只是编程的新手,并不具备预构buildfunction的最佳知识,但是我做了大量的研究,找不到任何能帮助我的东西