2016-08-01 12 views
2

最後の3週間のデータを報告するワークブック(ワークシートごとに1つ)にいくつかのグラフがあります。ソースデータは、ListObjectテーブルの非連続列です。新しい週のデータ(追加の行)でテーブルが更新される毎週、私はチャートを更新したい。VBA:データを3つの期間の最後に更新する

これはthis postと似ていますが、別のシリーズを追加する代わりにシリーズの範囲を更新しています。ここで

は、いくつかのサンプルデータです:

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 

最初に次のようになりチャート: その後Chart prior to VBA modification.

それはこのよう希望:(無視色差) Chart after VBA modification

任意の提案これを行う最も簡単な方法は?

シリーズ式はこのように見える終わる:

=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) 

私は、のSeriesCollection内の各シリーズを反復異なるカンマ区切りの値を解析して、範囲を更新すると思っています。次のようなものがあります:

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 

答えて

2

私はこの問題に近づく最も良い方法は動的名前付き範囲であると考えています。

[数式]タブの下の名前の管理には、次の3つの名前付き範囲を作成します。チャート上

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

次に右クリックし、選択したデータは、するシリーズの値を編集します。

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

次に、列に新しい行を追加するたびに、これらの3つの範囲が自動的に最後の3行に更新されますg入力は時系列順である。

説明:OFFSETの式は、セルA1を参照してから、最新のものが見つかるまで列Bを参照します(この場合、Sheet1はブック名に範囲を変更します)最新の日付の行番号だけシフトし、必要な数の行をバックアップし、右の2つの列に移動し、最後に1×3の範囲を選択します。

Enter Series Values

注:お使いのシリーズ名が同様に適切に更新するためには、あなたにも彼らのために名前付き範囲を作成する必要があります。

ヒント:

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

おかげ@Alexis、これは便利です。私はListObjectテーブルを使用しています。各シートにはそれぞれのテーブルの下に存在するデータがありますので、列全体の最大値を求めることは実用的ではありません。私はテーブルから最大値を選択するコードを変更しようとしています。もう一つの課題は、約30枚の名前付き範囲を効率的に作成する必要があるため、これを行う必要がある場所は約10枚ですが、これまではVBAコードを作成するよりも簡単です。 – MJA

+0

あなたは$ B:$ Bを、検索したいあなたの限定された範囲に置き換えてください。 –

+0

私の数式はより複雑に見えます: = OFFSET(tblMCC、MATCH(MAX(tblMCC [開始])、tblMCC [開始]、1)-3、MATCH( "グリーン"、tblMCC [#ヘッダー]、0)、3 、1) VBAで名前付き範囲を作成しようとすると、拒否され続けます。 – MJA

関連する問題