2017-12-30 92 views
0

エクセル2010Excelグラフ - 範囲参照せずにVBAで

問題をdiscountinuousシリーズを描画する方法:私は参照せずに* VBA経由* XY-散布図に*シングル* *不連続*シリーズをプロットする必要がありますシートの範囲。

Y値がシート範囲にレイアウトされている場合、不連続点にブランク値を挿入することで簡単に実現できます。 [データの選択]> [隠しセルと空セル]で[空のセルを次のように表示:ギャップ]を選択する限りです。ここでは(赤でシリーズ2が重要である1)の例である:

enter image description here

だから私はVBAを経由して同じことを再現しようとしていた。

Sub addDiscountinuousSingleSeries() 
    Dim vx As Variant, vy As Variant 
    Dim chrtObj As ChartObject, chrt As Chart, ser As Series 

    Set chrtObj = ActiveSheet.ChartObjects("MyChart"): Set chrt = chrtObj.Chart 

    Set ser = chrt.SeriesCollection.NewSeries 

    vx = Array(0.3, 0.3, 0.3, 0.7, 0.7, 0.7) 
    vy = Array(-1, 1, vbNullString, -1, 1, vbNullString) 
    'vy = Array(-1, 1, CVErr(xlErrNA), -1, 1, CVErr(xlErrNA)) 'doesn't work either 
    'vy = Range(RANGE_YVALUES_WITH_BLANK) 'this would work, but I do not want to reference a range 

    chrt.DisplayBlanksAs = xlNotPlotted 'VBA equivalent to 'Show empty cells as: Gaps' 

    With ser 
     ser.Name = "VBA Series" 
     .XValues = vx 
     .Values = vy 
    End With 

End Sub 

しかし、VYに空白値配列は無視され、2つの垂直バーが接続されているように見えます(緑の系列)。

enter image description here

私はプログラム的に真ん中の行を削除することができることを知っているが、現実の問題に私はそれが(遅すぎる、複雑すぎる)適切なソリューションではありません解決しようとしています。

私の質問:予想される動作を得るために、一連の.Values配列を指定し、vbaの2つの垂直の緑色のセグメント間にギャップを取得する方法はありますか(シリーズは1つしかなく、シート範囲を参照しません)?

+0

私はこの[OP](https://superuser.com/questions/941463/can-empty-cells-be-entered-into-an-arrayことに気づきました-constant-in-excel)も同様の問題がありましたが、何の答えも得られませんでした。 – Janthelme

+1

Excel 2010ではなく、2016 'vy = Array(-1、1、CVErr(xlErrNA)、-1、1、CVErr(xlErrNA))'は、 'chrt.DisplayValueNotAvailableAsBlank = True'と組み合わせて使用​​できます。 –

+0

ありがとうございます! DisplayValueNotAvailableAsBlankプロパティはExcel 2010に存在しないようですので、残念なことに2010年以降にアップグレードされた可能性があります。 – Janthelme

答えて

1

不要な行だけをフォーマットすることができます。おそらく最も美しい方法ではないかもしれませんが、それはあなたの後に何を達成するでしょう。

ser.Points(3).Format.Line.Visible = msoFalse 
ser.Points(4).Format.Line.Visible = msoFalse 
ser.Points(6).Format.Line.Visible = msoFalse 

または:

For i = 1 To ser.Points.Count 
    If i <> 1 Then k = i - 1 Else k = i 
    If ser.Values(i) = 0 Or ser.Values(k) = 0 Then 
     ser.Points(i).Format.Line.Visible = msoFalse 
    End If 
Next