2016-04-04 11 views
0

Ich habe eine Arbeitsmappe, die einen wöchentlichen Bericht ist. Am Ende der Woche wird es 8 Arbeitsblätter enthalten, eines für jeden Wochentag und ein 8., das die Werte für die ganze Woche anzeigt. Arbeitsblätter: Mo, Di, Mi, Do, Fr, Sa, So, WocheExcel VBA - Summenwerte über Arbeitsblätter

Jedes Arbeitsblatt hat dasselbe Format und wird aus einem Vorlagenblatt kopiert.

Um die Dinge einfach zu halten, habe ich dies auf eine Zelle B12 gekocht.

B12 auf der worksheeet "Woche" muss gleich:!!!!! = Mo B12 + Di B12 + Mi B12 + Thur B12 + Fr B12 + Sa B12 + Sun B12

Ich war Verwenden Sie VBA, um die obige Formel in Zelle B12 des Arbeitsblatts "Woche" einzufügen, aber ich habe ein paar Probleme:

1) Nicht alle Tagesblätter existieren, zum Beispiel, wenn ich den Bericht nur am Mittwoch ausführen "Mon" und "Di" werden existieren. Wenn ich den Bericht am Samstag starte, gibt es "Mon", "Di", "Mi", "Do" und "Fr". Das bedeutet, dass ich die obige Formel nicht einfach in Zelle B12 von "Woche" einfügen kann, weil ich ein #REF bekomme! Fehler aufgrund von Blättern, die nicht existieren.

Ich brauche daher einen Code, der alle B12-Werte eines der 7 Tagesblätter addiert, aber nur wenn dieses Blatt existiert.

SO, wenn ich den Bericht am Mittwoch, führen Sie es gleich: = Mo B12 + Di B12

Wenn ich den Bericht am Samstag führen Sie es gleich:! = Mo B12 + Di B12 + Mi!! B12 + Thur! B12 + Fr! B12

2) Mein zweites Problem ist, dass dies nicht nur für Zelle B12 gilt, sondern auch für weitere 100 Zellen und sie sind nicht alle in einem Bereich, sie sind verteilt aus, und einige sind verschmolzene Zellen usw. Während ich über B12 spreche, um diesen Beitrag zu vereinfachen, möchte ich leicht in der Lage sein, eine Lösung für viele andere Zellen anzuwenden, ohne Hunderte von if-Anweisungen usw. schreiben zu müssen.

Hoffentlich macht das Sinn. Dies ist

wo ich habe so weit, aber es funktioniert nicht:

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 

Prost

+2

'wsname = ws.Name' muss innerhalb der Schleife nicht vor sein. –

+1

Warum fangen Sie nicht einfach mit einem leeren Blatt für jeden Tag an und fügen Sie die Daten wie empfangen ein. Dann brauchst du nur: '= SUM ('Mo: So'! B12)' als deine Formel. – Rory

+1

@ Scott Craner einfach so das eh? :-) Danke, es funktioniert jetzt. – megatron77

Antwort

0

dieses auszuprobieren.

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 

Sie sollten alle Bereiche oder einzelne Zellen in den ‚Woche‘ Arbeitsblatt auswählen können und das Makro trifft die Summe der passenden Zellen in den täglichen Arbeitsblatt zu bekommen, wo sie existieren.

0

Wenn ich richtig verstanden habe, haben Sie eine Datei mit einer bestimmten Anzahl von Blättern für jeden Tag, plus Berichtsblatt als letztes Blatt.
Dann können Sie n = ThisWorkbook.Sheets.Count, die Gesamtzahl der Blätter und Summe für Blätter (1) zu Blättern (n-1) erhalten.
Etwas wie folgt aus:

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

Okay, ich es aber entschied ich verwenden möchte es als eine Funktion stattdessen müssen schreibe ich auf die Menge an Code zu minimieren zu arbeiten habe.

Ich habe die folgende als Beispiel geschrieben:

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 

Aber wenn ich „test“ ich ein Objekt erforderlich erhalten rufen! Error?

+0

Dies sollte eine neue Frage sein, keine Antwort auf Ihr Original. –

+0

Die schnelle Antwort auf Ihre Frage ist 'cellToSum.Column' gibt eine Zahl zurück und RANGE-Objekt verwendet eine Zeichenfolge. Sie müssen CELLS verwenden. –

0

Hier ist der Code in einer richtigen Funktion:

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 

Es wäre dann wie folgt aufgerufen werden:

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 
Verwandte Themen