2013-07-02 26 views
1

我有多個電子表格,每個大致是這樣的:EXCEL VBA-平均包含在拼接區域爲每列數值的所​​有行

enter image description here

我試圖找到一種方法要經過第1行中的每一個SPEAKER HEADERS,並總結與相應調查問題相關的分數(「內容是否良好?SPEAKER是否相關?DELIVERY的好處?」)按顏色分組。

我可以'不要想到一個巧妙的方法來自動執行此操作。

我可以合併單元格的範圍跨越這樣的:

For Each Cell In src_sheet.UsedRange.Cells 
     If Cell.Row = 1 And IsEmpty(Cell) = False Then 
      MsgBox Cell.MergeArea.Address 
     End If 
    Next 

然後我需要遍歷所提供的地址範圍,讓在跌破這一區間意味着所有行的數值。

例如,在運行當前的宏觀產生這樣的:

enter image description here

我需要$C$1:$E$1並運行一個for循環,從C1說E1平均所有數字在它下面的行。我不知道如何做到這一點。

我在想擴充選擇中包括使用

一切有沒有更好的方式來做到這一點?

這是我做的,現在(我是頗爲自豪的賬戶是新練成)慘遭壞的方式:

For Each Cell In src_sheet.UsedRange.Cells 
     If Cell.Row = 1 And IsEmpty(Cell) = False Then 
      Set rng = Range(Cell.MergeArea.Address) 'Equal to the Address of the Merged Area 
      startLetter = Mid(rng.Address, 2, 1) 'Gets letter from MergeArea Address 
      endLetter = Mid(rng.Address, 7, 1) 'Gets letter from MergeArea Address 

      On Error GoTo ErrHandler: 
       Set superRange = Range(startLetter & ":" & endLetter) 

ErrHandler: 
    endLetter = startLetter 
    Set superRange = Range(startLetter & ":" & endLetter) 
Resume Next 

      superRange.Select 
      MsgBox Application.Average(Selection) 
+0

我會對此有不同的看法。創建一個PERSON類,然後創建每個人,併爲每個類別鍵入個人屬性。把它稱爲'person_instance.morning_session.content'不是嗎? – 2013-07-02 16:49:58

回答

2

爲了擺脫你是錯誤的有,你需要改變:

Set rng = Cell.MergeArea.Address 

Set rng = Range(Cell.MergeArea.Address) 

理想的情況下,該數據將被更好地保存在一個databa這樣它可以很容易地被查詢。如果這不是一種選擇,那麼您在Excel中的使用方式與大多數其他方法一樣有效。

編輯

一旦你獲得最左列的每個揚聲器的地址,你可以通過每一列,獲得平均循環。

'Number of columns in the current speaker's range. 
numColumns = rng.Columns.Count 
'First row containing data. 
currentRow = 4 
'First column containing data. 
firstColumn = rng.Column 
'Loop through each column. 
For col = firstColumn to firstColumn + (numColumns -1) 
    totalValue = 0 
    'Loop through each row. 
    Do While Cells(currentRow,col).value <> "" 
    totalValue = totalValue + Cells(currentRow,col).Value 
    currentRow = currentRow + 1 
    Loop 
    averageValue = totalValue/(currentRow - 3) 
    'Reset the currentRow value to the top of the data area. 
    currentRow = 4 
    'Do something with this average value before moving on to the next column. 
Next 

如果你不知道是什麼行數據的開始,你可以隨時查看以下rng.Row每一行,直到你打一個數值。

上述方法假定您的數據區域中沒有空白條目。如果您有空白條目,那麼您應該在運行此代碼之前對數據進行排序,或者您需要知道有多少行必須檢查數據值。

+0

我明白了,我想問另一個問題。比方說,我做的事: 設置RNG =範圍(Cell.MergeArea.Address) 對於每個rRow在rng.Rows MSGBOX rRow.Column 和收益率3,6,9,什麼是爲做一個最好的辦法循環,從3-5,6-8和9表示較低行中的所有數值的平均值。 – Parseltongue

+0

你骯髒的狗。這可能有效。我會檢查出來,並讓你知道。看看我的幽默解決方案 – Parseltongue