2016-11-14 94 views
0

我分析在Excel電子數據表的數字數據,每行包含數據,其是在一式三份的一個又一個柱(從左到右,請參閱Excel數據集圖片)。對於每一行,總共可以有30-180列(因此每行10到60個樣本一式三份)。另外,可以有10-180行的數據。我希望VB代碼在每第三列之後插入一列(從D列開始),並在該新列中計算三個行值的CV [= STDEV(D3:F3)/ AVERAGE(D3:F3)]]列(D3/E3/F3),並在插入列的底部計算該列的所有CV的平均值(請參閱處理的Excel數據集圖片)。由於我的數據集有不同數量的列(但總是以3個爲一組),並且我還希望代碼能夠識別它何時到達列的末尾由於行數也不同,所以在「有數據」的行上結束。以下是開始的Excel數據集和已處理的Excel數據集的圖片。我查看了搜索中出現的很多相關的回答問題,但沒有一個適合這個應用程序,而且我對編寫代碼的知識很少。感謝您的幫助,非常感謝。的Excel /插入柱和計算CV(STDEV /平均),然後計算CV的平均該列

Excel data set

Processed Excel data set

+0

什麼是'數據結束'的'規則'?行或列中的空白/空單元格值? –

+0

嗨韋恩,感謝尋找這個,我的數據規則的結束是一個「空/空單元格的行或列的值」 – Bill

回答

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 
+0

嗨韋恩,我錯誤地描述了我想要的STDEV,真的很想CV(STDEV /平均; STDEV (D3:F3)/ AVERAGE(D3:F3))。我試圖修改你的代碼從計算STDEV到CV,但沒有任何運氣。你的幫助將再次得到真正的讚賞。 – Bill

+0

然後嘗試用 「=(STDEV(」 &rng1.Address& 「))/平均值(」 &rng1.Address& 「)」 代替 「= STDEV.P(」 &rng1.Address& 「)」 這導致STDEV/AVERAGE –

+0

好的,那是有效的,我碰到的唯一問題是當我將這個宏應用到一個Excel文件,並且它已經運行了一個宏並離開#DIV/0時!對於它無法計算的值,在我替換所有#DIV/0之前,這個宏不會在這些文件上運行!與0.0,然後它運行完美。 – Bill