我在Excel电子表格中分析数值数据,每行包含一列又一列一式三份的数据(从左到右,参见Excel数据集图片)。对于每行,总共可以有30-180列(因此每行一式三份,每个样品10-60个样品)。此外,可以有10-180行数据。我希望VB代码在每三个列之后插入一个列(从列D开始),并且在新列中计算三个行值的CV [= STDEV(D3:F3)/ AVERAGE(D3:F3)]列(D3 / E3 / F3),并在插入列的底部计算该列的所有CV的平均值(请参阅处理的Excel数据集图片)。我还希望代码能够识别它何时到达“带数据”列的末尾,因为我的数据集具有可变数量的列(但总是以3个为一组)并且我还希望代码能够识别它何时到来由于行数也有所不同,所以在“有数据”行的末尾。下面是起始Excel数据集和Processed Excel数据集的图片。我查看了搜索中出现的许多相关回答问题,但没有一个适合这个应用程序,而且我对编写代码知之甚少。感谢您的帮助,非常感谢。
答案 0 :(得分:0)
请尝试以下代码...只需将工作表名称更改为您拥有的任何工作表名称。
Option Explicit
Function STDEV_AVG()
Dim ws As Worksheet
Dim iRow As Integer
Dim iCol As Integer
Dim iLastrow As Long
Dim iLastCol As Long
Dim rng1 As Range
Set ws = ActiveWorkbook.Sheets("sheet5")
Sheets(ws.Name).Activate
With ws
iLastrow = Cells.Find(What:="*", After:=Range("A1"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
iLastCol = Cells.Find(What:="*", After:=Range("A1"), SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).column
End With
If iLastCol < 6 Then
MsgBox "There must be a minimum of 6 columns, else this format seems incorrect!"
End If
For iCol = iLastCol + 1 To 7 Step -3
ws.Cells(1, iCol).Select
ActiveCell.Offset(1).EntireColumn.Insert (xlShiftToRight)
Cells(2, iCol) = "StdDev"
For iRow = 3 To iLastrow
If Cells(iRow, iCol - 1) <> "" Then
Set rng1 = ws.Range(Cells(iRow, iCol - 3), Cells(iRow, iCol - 1))
'ws.Range(Cells(iRow, iCol - 3), Cells(iRow, iCol - 1)).Select
Cells(iRow, iCol).Formula = "=STDEV.P(" & rng1.Address & ")"
End If
Next iRow
Set rng1 = ws.Range(Cells(3, iCol), Cells(iLastrow, iCol))
'ws.Range(rng1.Address).Select
Cells(iLastrow + 1, iCol).Formula = "=Average(" & rng1.Address & ")"
Next iCol
End Function