글목록

2021년 6월 6일

Module 7. 여러 차트를 일괄 변경하기 - (2)차트배열을 ShapeRange로 변환하기

여러 개의 차트에 작업을 하고, 작업이 완료된 여러 개의 차트를 선택된 상태로 매크로를 마치게 되면, 그 다음 수작업하는데 도움이 될 수 있습니다.

예를 들어, 5개의 차트를 선택해서, 원본 차트를 남겨두기 위해 복사를 한 후 크기를 변경하거나, 서식을 변경했다고 하겠습니다. 그 다음 작업은 처음에 선택한 차트가 아니라, 작업이 완료된 차트 복사본이 선택되어 있다면, 수작업으로 차트를 다른 시트로 옮기거나, 그 이후 작업을 추가로 진행하는데 유리할 수 있습니다.

다른 예로, 10개의 차트를 선택한 상태에서 2개씩 병합된 차트를 5개 만들었다고 하면, 매크로가 완료되었을 때, 처음 10개의 차트를 선택한 상태로 마치는 것보다, 새로 만들어진 차트 5개를 선택한 상태로 매크로가 끝난다면, 새 차트를 일일이 선택하는 번거로움이 줄어들 수 있을 것입니다.

1개의 차트인 경우, Chart.Select를 이용해서 차트가 선택된 상태로 끝낼 수 있습니다만, 차트 배열에서 여러 개의 차트가 할당되어 있다면, Select method가 작동되지 않습니다.

여러 개의 차트를 동시에 선택된 상태를 만들기 위해서는 차트배열을 ShapeRange로 변환해준 후, ShapeRange.Select를 사용해야합니다.

이전 글에서 Shape 아래 Chart가 포함된다고 했는데, Chart.Parent를 사용하면, 상위 개체인 Shape이 반환될 것 같지만, 차트를 포함한 Shape이 반환되지 않습니다. 따라서, 번거롭지만, 아래와 같이 해당 시트 내에 있는 모든 Shape에 대해 선택하려는 Chart명을 일일이 확인한 후, 해당 Shape의 Index 목록을 만들어 ShapeRange로 만들어주는 방법을 쓸 수 있습니다.

엑셀 작업 시트에 수천개의 Shape이 포함된 것이 아니라면, 이렇게 ShapeRange를 만들더라도 그다지 시간이 오래 걸리진 않습니다.

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

Function ChartArrayToShapeRange(iChart() As Chart) As ShapeRange
  On Error GoTo ErrorHandler
  Dim i As Long, j As Long, n As Long, tSh As Worksheet, tShRange As ShapeRange, tIndex() As Long

  '우선 차트가 포함된 시트를 확인합니다.
  Set tSh = iChart(LBound(iChart)).Parent.Parent
  n = LBound(iChart) - 1
  ReDim tIndex(LBound(iChart) To UBound(iChart))
  '해당 시트 내 모든 Shape 개체에 대하여, Chart가 포함되어있는지 확인하고, 차트명을 입력된 차트명과 비교하여 같다고 하면, 해당 Shape의 Index 목록을 만들어줍니다.
  For i = LBound(iChart) To UBound(iChart)
    For j = 1 To tSh.Shapes.Count
      If tSh.Shapes(j).HasChart Then
        If tSh.Shapes(j).Chart.Name = iChart(i).Name Then
          n = n + 1
          tIndex(n) = j
          Exit For
        End If
      End If
    Next
  Next
  'Index 배열을 이용하여, ShapeRange를 만들어 반환해줍니다. ShapeRange는 일반적인 배열과 달리, 아이템들을 추가하거나 빼는 등의 작업이 되지 않기 때문에 이러한 과정을 거쳐서 원하는 ShapeRange를 만들 수 있습니다.
  Set ChartArrayToShapeRange = tSh.Shapes.Range(tIndex)
ErrorHandler:
  Erase tIndex
End Function

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

댓글 없음:

댓글 쓰기

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

많이 본 글 :