글목록

2021년 5월 16일

Module 6. 엑셀 차트 일괄적으로 그리기 - (4) 선택열에 대한 분산차트 생성하기

X, Y열 및 header 갯수를 정의해둔 상태에서 분산 차트를 그리는 function을 작성합니다. X, Y열을 데이터만 포함하도록 다듬은 후 새 차트를 생성하고, 여러 데이터를 1개 차트에 포함하기 위해서는 이 차트에 계속해서 추가하는 방식으로 차트를 생성할 것입니다.

우선 새 차트를 생성하는 function은 아래와 같이 작성하였습니다.

'------------------------------------------------

Function ScatterChart_New(iXCol As Range, iYCol As Range, iHeader As Integer, Optional iChartType As Long = xlXYScatterLinesNoMarkers) As Chart
  Dim tSh As Worksheet, tChart As Chart, tXY() As Range, tStr() As String, tFormula As String, i As Long

  'Y열 데이터를 포함한 시트를 우선 활성화 합니다.
  Set tSh = iYCol.Worksheet
  tSh.Activate
  '이전 글에서 작성한 바와 같이, X, Y열 정보를 다듬어준 후, Y열을 선택하고 차트를 삽입해줍니다. 차트를 삽입하면, 엑셀에서 자동으로 선택영역을 해석하여 차트로 그려주는데, 이후 자동으로 그려진 차트를 원하는 X, Y열 및 데이터명으로 바꿔주면 됩니다.
  tXY = TrimXYRange(iXCol, iYCol, iHeader)
  tXY(2).Select
  Set tChart = tSh.Shapes.AddChart.Chart
  With tChart
  '생성된 차트의 형태는 점, 선, 점+선 형태의 차트 타입으로 변경해줍니다.
    .ChartType = iChartType
  '자동으로 생성된 차트의 수식(Series() 함수)으로부터 시트명을 읽어온 후, 데이터명, X, Y열의 범위를 넣어 수식을 새로 생성한 후, 1번째 SeriesCollection의 수식을 변경해줍니다.
    tStr = SplitChartSeriesFormula(.SeriesCollection(1).Formula, True)
    If Not tXY(0) Is Nothing Then tStr(1) = tStr(0) & "!" & tXY(0).Address
    tStr(2) = tStr(0) & "!" & tXY(1).Address
    tStr(3) = tStr(0) & "!" & tXY(2).Address
    tFormula = "=SERIES("
    For i = 1 To 4
      tFormula = tFormula & tShName & tStr(i)
      If i < 4 Then tFormula = tFormula & ","
    Next
    tFormula = tFormula & ")"
    .SeriesCollection(1).Formula = tFormula
  '차트의 위치를 Y열이 있는 위치로 옮겨줍니다. 여러개의 차트를 동시에 만들 때, 어느 데이터에 대한 차트인지 위치만으로 쉽게 확인할 수 있습니다. 이 함수에서는 Y열 시작셀의 위에서 5개 데이터 아래에 있는 셀에 차트를 위치하도록 해두었습니다. 본인 취향에 맞게 적당한 위치를 지정해주시면 됩니다.
    .ChartArea.Top = tXY(2).Offset(5, 0).Top

    .ChartArea.Left = tXY(2).Left
  End With
  Set ScatterChart_New = tChart
  Erase tXY, tStr
End Function

'------------------------------------------------

위의 function을 이용하여 차트를 그리면 아래와 같이 데이터가 있는 부분만 차트를 형성하게 됩니다.


위 function에서 SeriesCollection(1).Name, SeriesCollection(1).XValues, SeriesCollection(1).Values를 이용하여 1번 그래프의 데이터 범위를 지정해주면 쉽게 차트를 그릴 수 있습니다. 그런데, 왜 복잡하게 Series() 함수를 분해하고 다시 조합하는지 의문이 드실 수 있습니다.

우선, SeriesCollection(1).Name에는 주소를 입력하게 되면, 해당 셀의 데이터만 읽어와서 대입해주며, 2개 이상의 셀을 데이터명으로 지정하지 못합니다. 차트를 그리는 것은 문제가 없을 수 있지만, 이후 매크로를 이용해 차트를 변경하거나, 데이터 위치를 변경하는 등의 작업을 할 때, 엑셀에서 제공하는 method나 property를 이용하는 것보다 Series 함수를 직접 핸들링하는 것이 훨씬 간편해지기 때문에 이렇게 작성하였습니다.

Series 또는 SeriesCollection과 관련된 Method, Property를 확인하시려면, https://docs.microsoft.com/ko-kr/office/vba/api/excel.series(object)을 참고하시기 바랍니다.

댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :