我必须平均设置3列。
实施例
Blood_Patient1_0_R1
,Blood_Patient1_0_R2
,Blood_Patient1_0_R3
平均值位于新列Blood_Patient1_0
同样,Blood_Patient1_3_5_R1
,Blood_Patient1_3_5_R2
,Blood_Patient1_3_5_R3
平均值位于新列Blood_Patient1_3_5
正在为8组这样的列重复此过程。
目前,我使用以下公式进行平均:IF(ISERROR(AVERAGE(B7:D7)),"",AVERAGE(B7:D7))
并自动填充21,000多行。
由于列标题中有一个模式,我正在考虑自动化整个过程。
这就是我迄今为止在算法方面的想法:
表示
time
数组[3.5h,6.25h,9.5h,11.5h,16.5h,25h,49h和156h ]创建新列
表示从2到21458的行
使用上述公式
从R1到R3的平均值超过replicates
我不知道如何在excel中写这个。任何帮助将不胜感激。
答案 0 :(得分:0)
放手一搏。
此解决方案假设您有一个连续的数据集,即您希望搜索的列之间没有间隙。
首先,您需要包含此功能。将其粘贴到与子例程相同的模块中。此函数的目的是允许将每个标题中的字符串与子字符串数组进行比较,而不是InStr
函数允许的单个子字符串。
Function Time_Search(strCheck As String, ParamArray anyOf()) As Boolean
Dim item As Long
For item = 0 To UBound(anyOf)
If InStr(1, strCheck, anyOf(item)) <> 0 Then
Time_Search = True
Exit Function
End If
Next
End Function
接下来,粘贴此子例程。我已经忘记了数据集从单元格A1开始。此外,如果列数或行数发生变化,我已经允许动态范围。
Sub Insert_Average_Columns()
Dim HeaderRange As Range
Dim LastRow As Long
Dim c As Range
Set HeaderRange = Range(Range("A1"), Range("A1").End(xlToRight))
LastRow = Range("A" & Rows.Count).End(xlUp).Row
For Each c In HeaderRange.Cells
If Right(c.Value, 2) = "R3" Then
If Time_Search(c.Value, "3_5", "6_25", "9_5", "11_5", "16_5", "25", "49", "156") Then
c.Offset(0, 1).EntireColumn.Insert
c.Offset(0, 1) = "Average of " & Left(c.Value, Len(c.Value) - 3)
c.Offset(1, 1).FormulaR1C1 = "=IFERROR(AVERAGE(RC[-3]:RC[-1]),"""")"
c.Offset(1, 1).AutoFill Range(c.Offset(1, 1).Address, Cells(LastRow, c.Offset(1, 1).Column))
End If
End If
Next c
End Sub
您的数据存在一个问题。如果您希望该过程为T = 25插入平均列,那么它将对所有列执行此操作,其中T包含字符串&#34; 25&#34;。如果有T = 8.25,10.25,15.25等,则这些都将应用平均值。绕过它的唯一方法是在参数数组中包含更多的标题字符串,但我认为你将处理一个变量Blood_Patient ID,因此可能不是一个选项。