2017-12-30 129 views
0

엑셀 2010Excel 차트 - 범위 참조하지 않고 VBA에

문제를 discountinuous 시리즈를 그리는 방법 : 난을 참조하지 않고 * VBA를 통해 *는 XY-분산 형 차트에 * 한 * * 불연속 * 시리즈를 그릴 필요 시트의 범위.

불연속에 빈 값을 삽입하여 시트 범위에 Y 값을 배치 할 때 쉽게 달성 할 수 있습니다. 데이터 선택> 숨겨진 셀 및 빈 셀에서 '빈 셀을 다음과 같이 표시 : 간격'을 선택하는 한.

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에서 두 개의 세로 녹색 세그먼트 (하나의 계열 만 있고 시트 범위에 대한 참조가 없음) 사이에 간격을 확보 할 수 있습니까?

+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