본문 바로가기

Autohotkey강좌

Autohotkey 17, 미니탭과 엑셀간 데이터(그래프) 이동

반응형

https://youtu.be/Ptjpmh_EvBs

지난번에 진행한 미니탭에서 생성한 그래프들을 엑셀에 옮기는 것을 진행해 보겠습니다. 엑셀에서 "Sheet 2" 라는 특정시트의 D3에서부터 M3까지 그래프들을 순차적으로 옮기려고 합니다. 옮기려는 그래프의 갯수는 10개입니다.

 

1) GUI의 구성  

이것을 만들기 위해 GUI기능을 활용해서 메뉴를 만들고 버튼을 누르면 해당 기능이 수행되도록 할것입니다.

GUI 의 모양은 다음처럼 만들려고 합니다. 사이즈는 적당히 선택하면 됩니다. Autohotkey 에서는 Text와 Button을 이용하면 되겠습니다.

 

Gui, Add, Text, x30 y20 w220 h20, Minitab To Excel Graph Transfer ;
Gui, Add, Button, x20 y80 w200 h20, Transfer ;
Gui, Add, Button, x20 y140 w200 h20, End ; 
Gui, Show, h200, Graph Transfer

 

이렇게 4줄이면 GUI가 완성됩니다. 첫줄은 Minitab To Excel Graph Transfer 라는 제목을 표시하는 것이고, x축 좌표는 메뉴상의 30과 y축 5에서 width 220, height 20으로 정한것입니다. 버튼은 x20, y80을 기준으로 width 200, height 20으로 하고 표시는 Transfer라고 하며 해당 Button은 ButtonTransfer가 됩니다. 마찬가지고 End도 동일하게 구성하였습니다.

구성을 다 하였으므로 해당 GUI를 보여주는데 높이만 200 으로 지정하였으므로 나머지는 적당한 사이즈가 선택됩니다. Title은 Graph Transfer라고 표시되었습니다. 

 

2) ButtonTransfer기능의 구현

우리가 진행하려고 하는 내용을 offline에서 한번 진행해 보고 해야 할 내용을 기록해 봅니다.

 가) Minitab에서 복사해야 할 그래프는 총 10개인데 마지막에 실행된 그래프가 data10 이므로 순서를 바꾸어 10번째 그래프부터 Excel에 복사하면 문제가 없을 듯 합니다. 일의 순서로 적어 보면

   A) Minitab으로 focus를 옮긴다. 

   B) 제일 상위에 떠 있는 그래프를 복사한다.

   C) Excel로  focus를 옮긴다.

   D) 복사한 그래프를 M3위치에 복사한다.

   E) 다시 Minitab으로 focus를 옮긴다.

   F) 마지막 그래프를 지우거나 최소화 시킨다.

   G) 제일 상위에 떠 있는 그래프를 복사한다.

   H) Excel로 focus를 옮긴다.

   I)복사한 그래프를 N3위치에 복사한다. 

   J) D부터 다시 반복한다.

 

A~D까지와 E~J까지에는 약간의 차이가 있다. 바로 F항목과 I항목에서 기존의 M3을 N3으로 바꾸는 부분이 존재한다. 따라서 이 부분을 처리를 어떻게 할까? 다양한 방법이 있지만, 그래프를 복사하고 나서 해당 그래프를 지우거나 최소화 하면 문제가 없을 가능성이 크다. 또한 M3위치가 N3으로 바뀌게 되므로 이 부분도 M3위치에 복사하고 나서 계산을 해 주는게 좋을것 같다. 수정한 루틴이다.

   A) Minitab으로 focus를 옮긴다.

   B) 제일 상위에 떠 있는 그래프를 복사한다.

   C) 그래프를 삭제한다.(또는 최소화 한다)

   D) Excel로  focus를 옮긴다.

   E) 복사한 그래프를 복사될 위치(M3)에 복사한다.

   F) 복사될 위치를 N3으로 변경한다.

   G) 다시 Minitab으로 focus를 옮긴다.

   F) B부터 반복한다.

 

이 부분을 ButtonTransfer에 옮겨 보자.

 

ButtonTransfer:
{
  Gui, Submit, nohide
  col :="M" 
  row :="3"

  winactivate, ahk_exe excel.exe :EXCEL로 FOCUS이동
  sleep, 300
  xl := ComObjActive("Excel.Application") ;EXCEL Com object를 xl로 할당함.
  xl.ActiveWorkbook.Sheets("Sheet 2").Select  ; xl에서 sheet를 "Sheet 2"로 이동함

  Loop 10
  {
    Clipboard = 
    sleep, 50
    winactivate, ahk_exe mtb.exe ;mtb로 이동
    sleep, 500 ;1000
    SendInput {Ctrl down}c{Ctrl up} ; ^c 최상위 그래프 복사
    sleep, 800
    SendInput {Ctrl down}{f4}{Ctrl up} ; ^{f4} 최상위 그래프 닫기
    sleep, 200
    SendInput, n ;저장하지 않는 옵션에 대한 n 입력 
    sleep, 100
    winactivate, ahk_exe excel.exe ;excel로 이동하여
    sleep, 500 ; 800
    colrow =%col%%row% ;이동할 셀의 열과 행을 한번에 붙여주기( M열 3행 ==> M3
    SendInput {Ctrl down}g{Ctrl up}%colrow%{Enter} ; ^g%colrow%{Enter} ;셀이동하기 선택하고 이동할 셀번호 입력 후 ENTER
    sleep, 500 ;800
    SendInput {Ctrl down}v{Ctrl up} ;^v 그래프 붙여 넣기

    sleep, 500 ;800
    col :=chr(asc(col) -1) ;이동할 COLUMN을 하나씩 줄이기 위해 ASCII값으로 변환한 후에 1을 빼고 다시 CHAR로 변경하여 COL에 저장

   }

}
return

 

명령 사이에 sleep, 300 또는 sleep, 500등으로 시간 여유를 넣어 주는게 좋다.

 

3) End 버튼

End버튼이 눌렸을때 동작은 어떻게 해야 할까? 그냥 App을 종료하면 된다.

 

ButtonEnd:
{
   ExitApp
}
return

 

4) 비상시 탈출 버튼(ESC)

비상시 탈출 버튼은 반드시 만드는게 좋다고 했다. 다음 정도면 충분하다.

 

#IfWinActive ahk_class AutoHotkeyGUI
ESC::goto, ButtonEnd
return
#IfWinActive

 

이제 모두 작성되었으므로 한번 실행해 보자. 정상적으로 실행이 되는가? 잘 된다면 OK. 

기본적인 EXCEL셀 처리 및 SHEET이동 , 명령어 주는 법등에 대한 예제 항목이 있으므로 유사한 상황에서 활용할 수 있을 것이라 생각이 든다. 잘 안 된다면 댓글로 질문을 주면 틈틈히 확인하고 답을 달겠습니다.

test.ahk
0.00MB

 

반응형