글목록

2021년 6월 7일

Module 7. 여러 차트를 일괄 변경하기 - (3)여러 차트에 차트 서식을 일괄 복사하기

차트의 서식을 다른 차트에 복사하기 위해서는 원본 차트에서 Ctrl+C 후, 홈 탭에서 '선택하여 붙여넣기'를 클릭하면, 아래와 같이 선택 창이 뜨게 되고, 서식만 붙여넣게 할 수 있습니다. 그러나, 이 방법은 여러 개의 차트를 선택한 상태에서는적용할 수 없으며, 붙여넣을 차트를 1개씩만 선택해서 반복 작업을 해야하고, 차트 갯수가 많아지면 번거로운 수작업이 많아진다는 문제가 있습니다.



여러개의 차트를 선택한 후, 1번째 차트의 서식을 나머지 차트에 붙여넣는 매크로를 만들어보려고 합니다. 차트가 몇개 안된다면, 1번 차트를 제일 먼저 선택하고, 나머지 차트를 Ctrl 키를 누른 상태에서 클릭하면 1번 차트를 지정해줄 수 있습니다. 그런데, 작업하려는 차트가 수십개라면, 차트들을 일일이 클릭하기도 귀찮을 수 있습니다. 이럴 땐, 차트 1~2개를 선택한 상태에서 Ctrl+A를 누르게 되면, 해당 시트에 있는 모든 차트를 선택할 수 있습니다.

그런데, Ctrl+A로 모든 차트를 선택하게 되면, ZOrder에 따라 차트 순서가 정해지는데, 차트의 ZOrder를 모르기 때문에 어느 차트가 1번 차트인지 모르게 됩니다. 물론 제일 처음 생성된 차트가 1번이겠지만, 차트를 생성한 순서를 다 기억할 수는 없으니.. 이럴 땐 기준차트를 선택해서 마우스 오른쪽 버튼으로 맨 앞으로, 혹은 맨 뒤로 보내기..를 클릭하게 되면 ZOrder가 바뀌게 되니 미리 ZOrder를 변경한 후 작업할 차트를 Ctrl+A로 여러 차트를 선택하는 방법이 있습니다. 혹은 기준 차트를 잘라낸 후 (Ctrl+X), 붙여넣기(Ctrl+V)를 하게 되면, 이 차트의 ZOrder가 맨 마지막으로 가게 됩니다.

다른 방법으로는 대상 차트를 다 선택한 후, 마지막에 Ctrl을 누른 상태에서 기준 차트를 한번 클릭하면 그 차트는 선택에서 제외되고, 다시 클릭하게 되면 기준 차트는 맨 마지막에 선택된 차트가 됩니다. 따라서, 차트 배열을 만들 때, 맨 마지막 차트를 기준 차트로 선택할 수 있게 해두면, 사용자 입장에서는 차트 선택이 비교적 간단해질 수 있습니다.


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

Sub CopyChartFormat()
  On Error Resume Next
  Dim i As Long, tSel As ShapeRange, tMode As Long, tChart() As Chart
  '워크시트에서 원하는 여러 개체를 선택한 상태에서 차트들만 추출하여 배열에 할당해줍니다. 만약 차트가 선택되지 않았거나, 차트가 1개 밖에 없다면 매크로를 중단시킵니다.
  If SelectionToChartArray(tChart, True) = False Then GoTo ErrorHandler
  If UBound(tChart) < 1 Then GoTo ErrorHandler
  '선택된 개체 중 차트들만 ShapeRange로 변환해줍니다.
  Set tSel = ChartArrayToShapeRange(tChart)
  '복사 방식이 전체, 서식, 수식으로 선택할 수 있도록 하고, 기본값을 서식만 복사하도록 2로 설정해둡니다.
  tMode = Val(InputBox("복사 모드를 선택하세요." & vbCrLf & "1 : 전체 복사,  2 : 서식만 복사,  3 : 수식만 복사", "복사 모드 선택", 2))
  If Not (tMode = 1 Or tMode = 2 Or tMode = 3) Then GoTo ErrorHandler
  '기준 차트는 Chart(0) 또는 tSel(1).Chart 이며, Chart.Copy가 아니라 Chart.ChartArea.Copy를 사용해야합니다. 나머지 차트를 순서대로 선택한 후, 붙여넣기를 실행합니다. 작업을 마치고 나면, 차트들만 선택된 상태로 매크로를 종료합니다.
  tSel(1).Chart.ChartArea.Copy
  For i = 2 To tSel.Count
    tSel(i).Select
    ActiveSheet.PasteSpecial Format:=tMode
  Next
  tSel.Select
ErrorHandler:
  Erase tChart
End Sub

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


위의 매크로는 실행하더라도, 차트의 크기나, 데이터 범위 등이 변하지 않을 수 있습니다. Shape이 가진 모든 속성을 다 복사하는 것이 아니라, ChartArea 내 속성만 복사하기 때문에, 차트를 포함한 Shape의 크기가 변하지 않습니다. 또한, X, Y값의 범위가 '자동'으로 설정되어 있으면, '자동'이라는 속성을 복사하게 되므로, 인위적으로 X, Y값의 범위를 동일하게 만들기 위해서는 데이터 상/하한값을 수동으로 지정하여야 X, Y값을 동일하게 만들 수 있습니다.

여러 데이터셋으로부터 차트를 그린 후, 이러한 속성을 강제로 맞춰주기 위해서는 별도의 매크로가 필요합니다. 다음 글에서는 차트 Scale과 크기까지 복사하는 매크로를 작성해보겠습니다.

댓글 없음:

댓글 쓰기

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

많이 본 글 :