2016-04-04 87 views
0

我有一本工作簿,它是一份每週報告。到本週結束時,它將包含8張工作表,一張每週的一天和一張報告整週價值的8張工作表。 工作表: 星期一,星期二,星期三,星期四,星期五,星期六,星期,星期Excel VBA - 跨工作表的總和值

每個工作表都是完全相同的格式並從模板表複製。

爲了保持簡單起見,我把它燒到了一個單元格B12。

B12在worksheeet 「周」 需要平等的:!!!!!!! =週一B12 +週二B12 +週三B12 +星期四B12 +週五B12 +週六B12 +太陽B12

我將使用VBA將上面的公式插入工作表「Week」的單元格B12中,但是我有幾個問題:

1)並非所有的每日工作表都存在,例如,如果我僅在星期三運行報表「星期一」和「星期二」將存在。如果我在星期六執行報告,則會存在「星期一」,「星期二」,「星期三」,「星期四」和「星期五」。這意味着我不能只將上面的公式插入到「Week」的單元格B12中,因爲我得到了#REF!由於表單不存在而導致錯誤。

我因此需要一些代碼,將加起來的任何7個每日片材的所有B12值,但僅當片材存在。

所以,如果我在週三運行報告它等於: =週一B12 +星期二B12

如果我在星期六運行報告它等於:! =週一B12 +週二B12 +週三!!! B12 + Thur!B12 + Fri!B12

2)我的第二個問題是,這不適用於單元格B12,但也適用於另外約100個單元格,它們並不都在一個範圍內,而有些是合併的單元格等等。所以,雖然我在談論B12試圖簡化這篇文章,但我希望能夠輕鬆地將解決方案應用於許多其他單元,而無需編寫數百條if語句等。

希望這是有道理的。

這是我有這麼遠,但它不工作:

Sub test() 

Dim ws As Worksheet 
Dim testVar As Double 
Dim wsName As String 
wsName = ws.Name 
For Each ws In ActiveWorkbook.Worksheets 
Select Case wsName 
    Case "Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun" 
     testVar = testVar + Worksheets(wsName).Range("B12").Value 
End Select 
Next ws 

Worksheets("Week").Range("B12").Value = testVar 

End Sub 

乾杯

+2

'wsName = ws.Name'不需要之前的循環中。 –

+1

爲什麼不從每天的白紙開始,並將數據粘貼到收到的數據中。那麼你只需要:'= SUM('Mon:Sun'!B12)'作爲你的公式。 – Rory

+1

@斯科特克萊納那樣簡單嗎? :-)謝謝,它現在有效。 – megatron77

回答

0

試試這個。

Sub test() 

Dim ws As Worksheet 
Dim testVar As Double 
Dim rng As Range 

Set rng = Selection 

For Each c In rng 

    For Each ws In ActiveWorkbook.Worksheets 
     Select Case ws.Name 
      Case "Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun" 
       testVar = testVar + ws.Range(c.Address).Value 
     End Select 
    Next ws 

    Worksheets("Week").Range(c.Address).Value = testVar 
    testVar = 0 

Next c 

End Sub 

您應該能夠選擇你的「周」工作表的任何範圍或單個細胞和命中宏來得到匹配的單元格的總和在它們存在的日常工作表。

0

如果我理解正確,你將有一定數量的每一天張的文件,再加上作爲最後的片報告單。
然後,您可以使用n = ThisWorkbook.Sheets.Count,這將成爲總張數,併爲工作表(1)到工作表(n-1)獲得總和。
事情是這樣的:

x = 0 
n = ActiveWorkbook.Sheets.Count 
For i = 1 To n - 1 
x = x + Sheets(i).Range("B12").Value 
Next i 
Sheets(n).Range("B12") = x 
0

好吧,我得到它的工作,但決定我想用它作爲一個功能,而不是對的代碼,我需要編寫量最小化。

我已經寫了以下爲例:

Function sumWeekly(cellToSum As Range) 

Dim ws As Worksheet 
Dim cumulativeVar As Double 
Dim wsName As String 
For Each ws In ActiveWorkbook.Worksheets 
wsName = ws.Name 
Select Case wsName 
    Case "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" 
     cumulativeVar = cumulativeVar + Worksheets(wsName).Range(cellToSum.Column & cellToSum.Row).Value 
End Select 
Next ws 

Worksheets("Week").Range(cellToSum.Column & cellToSum.Row).Value = cumulativeVar 

End Function 

Sub test() 

Dim ppcsessions As Range 

Set ppcsessions = Worksheets("Mon").Range("B12:B12") 

sumWeekly (ppcsessions) 

End Sub 

但是當我打電話「測試」我得到一個必選對象!錯誤?

+0

這應該是一個新問題,而不是您的原始答案。 –

+0

您的問題的快速答案是'cellToSum.Column'返回一個數字和RANGE對象使用一個字符串。您將需要使用CELLS。 –

0

這裏是一個正確的功能代碼:

Function sumWeekly(cellToSum As String) As Double 

Dim ws As Worksheet 
Dim cumulativeVar As Double 

For Each ws In ActiveWorkbook.Worksheets 
Select Case ws.Name 
    Case "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" 
     cumulativeVar = cumulativeVar + Worksheets(ws.Name).Range(cellToSum).Value 
End Select 
Next ws 

sumWeekly = cumulativeVar 

End Function 

然後,它將被稱爲像這樣:

Sub test() 

Dim ppcsessions() As String 
Dim i As Long 

'load this array with all the ranges desired. 
ppcsessions = Array("B12", "I11", "G13") 

For i = LBound(ppcseesions) To UBound(ppcsessions) 
    Worksheets("WEEK").Range(ppcseesions(i)).Value = sumWeekly(ppcsessions(i)) 
Next i 

End Sub