2016-08-01 9 views
2

Ich habe mehrere Diagramme in einer Arbeitsmappe (eine pro Arbeitsblatt), die die letzten drei Wochen der Daten melden. Die Quelldaten sind nicht zusammenhängende Spalten in einer ListObject-Tabelle. Jede Woche, wenn die Tabellen mit einer neuen Datenwoche (zusätzliche Zeile) aktualisiert werden, möchte ich, dass die Diagramme aktualisiert werden.VBA: Update Diagramm zu den letzten drei Perioden von Daten

Dies ist ähnlich wie this post, aber ich aktualisiere den Serienbereich, anstatt eine weitere Serie hinzuzufügen.

Hier einige Beispieldaten:

A  B  C  D  E  F 
Start End  Green Yellow Red  Total 
------- ------- ------- ------- ------- ------- 
1/1/16 1/7/16 10  10  10  30 
1/8/16 1/14/16 12  12  12  36 
1/15/16 1/21/16 12  20  18  50 
1/22/16 1/28/16 30  10  50  45 

Das Diagramm wie dieses erste aussehen: Chart prior to VBA modification.

Danach würde es so gerne: (Mißachtung Farbdifferenz) Chart after VBA modification

Irgendwelche Vorschläge auf dem einfachsten Weg, dies zu tun?

Die Serie Formeln am Ende wie folgt aussehen:

=SERIES(Project!$A$2,Project!$C$1:$E$1,Project!$C$2:$E$2,1) 
=SERIES(Project!$A$3,Project!$C$1:$E$1,Project!$C$3:$E$3,2) 
=SERIES(Project!$A$4,Project!$C$1:$E$1,Project!$C$4:$E$4,3) 

Ich denke in Series durch jede Serie von iterieren, die verschiedenen comma separated values ​​Parsen aus, und die Aktualisierung des Bereichs. Etwas wie dieses:

set clnSeries = activechart.seriescollection 
dim strSeriesTemp as string 'Placeholder for previous series formula 
For i = clnSeries.count to 1 step -1 
    if strSeriesTemp = "" then 
    strSeriesTemp = clnSeries(i).formula 
    arrSeries = split(clnSeries(i).formula, ",") 
    for i = lbound(arrSeries) to ubound(arrSeries) 
     select case i 
     'Move legend label one row down 
     case 1: strFormula = arrSeries(i).offset(1,0).address 
     'Leave series labels the same 
     case 2: strFormula = strFormula & arrSeries(i) 
     'Move series values one row down 
     case 3: strFormula = strFormula & arrSeries(i).offset(1,0).address 
     'Set series index 
     case 4: strFormula = strFormula & i 
     end select 
     strFormula = "=SERIES(" & strFormula & ")" 
    else 
    clnSeries(i).formula = strFormula 
    end if 
next i 

Antwort

2

Ich denke, der beste Weg, dieses Problem anzugehen, ist mit dynamischen benannten Bereichen.

Erstellen Sie die folgenden drei genannten Bereiche im Namen-Manager unter der Registerkarte Formeln:

Ultimate=OFFSET(Sheet1!$A$1,MATCH(MAX(Sheet1!$B:$B),Sheet1!$B:$B,0)-1,2,1,3) 
Penultimate=OFFSET(Sheet1!$A$1,MATCH(MAX(Sheet1!$B:$B),Sheet1!$B:$B,0)-2,2,1,3) 
Antepenultimate=OFFSET(Sheet1!$A$1,MATCH(MAX(Sheet1!$B:$B),Sheet1!$B:$B,0)-3,2,1,3) 

Define Dynamic Ranges

Dann Rechtsklick auf das Diagramm, Daten auswählen, bearbeiten Sie die Series Werte sein:

=Sheet1!Antepenultimate 
=Sheet1!Penultimate 
=Sheet1!Ultimate 

Jedes Mal, wenn Sie Ihren Spalten eine neue Zeile hinzufügen, werden diese drei Bereiche automatisch aktualisiert, um die letzten drei Zeilen assumin zu sein g Die Eingaben sind in chronologischer Reihenfolge. (Beachten Sie, dass Sheet1 auf Ihren Arbeitsmappen-Namen aktualisiert wird, wenn Sie zurückgehen, da es sich um eine Arbeitsmappenebene mit dem Namen Bereich handelt.)

Erläuterung: Die OFFSET Formel verweist auf Zelle A1 und sucht dann in Spalte B nach, bis sie die neueste gefunden hat Datum und verschiebt sich um die Zeilennummer des letzten Datums, sichert die erforderliche Anzahl von Zeilen, verschiebt die Spalten nach rechts und wählt schließlich einen Bereich von 1x3 aus.

Enter Series Values

Hinweis: Damit Ihre Seriennamen auch richtig zu aktualisieren, müssen Sie auf benannte Bereiche auch für sie machen.

Hinweis:

UltimateName=OFFSET(Sheet1!$A$1,MATCH(MAX(Sheet1!$B:$B),Sheet1!$B:$B,0)-1,0) 
+0

Dank @Alexis, ist dies hilfreich. Ich verwende ListObject-Tabellen, und jedes Blatt hat Daten, die unter den jeweiligen Tabellen vorhanden sind, so dass die Suche nach einem Maximalwert einer ganzen Spalte für mich unpraktisch ist. Ich versuche, Ihren Code zu ändern, um den maximalen Wert aus der Tabelle auszuwählen.Eine weitere Herausforderung ist, dass ich ungefähr 10 Blätter habe, wo dies getan werden muss, so dass ich effektiv ungefähr 30 benannte Bereiche erstellen muss, aber bisher scheint dies einfacher als das Schreiben von VBA-Code. – MJA

+0

Sie sollten einfach in der Lage sein, $ B: $ B zu ersetzen, unabhängig davon, in welchem ​​Bereich Sie suchen möchten. –

+0

Meine Formeln sehen komplizierter aus: = OFFSET (tblMCC, MATCH (MAX (tblMCC [Start]), tblMCC [Start], 1) -3, MATCH ("Grün", tblMCC [#Headers], 0), 3 , 1) Und wenn ich versuche, den benannten Bereich in VBA zu erstellen, wird es immer abgelehnt. – MJA