본문 바로가기

Autohotkey강좌

Autohotkey#45, 엑셀 취합 v1.6(입력파일의 특정열을 취합파일의 다른 열에 복사하는 경우)

반응형

https://youtu.be/B9EtxxusnRk

엑셀 취합 v1.5면 웬만한 경우를 다 감당한다고 생각했는데, 생각보다 다르게 사용하는 경우가 많은 것 같습니다. 

일단 질문이 들어온 경우를 설명드리면, 입력 엑셀 파일에서는 B열을 복사해서 최종 취합할 엑셀 파일에서는 C열에 넣고 입력 엑셀 파일에서 E열을 D열에 취합하려면 어떻게 하냐는 것입니다.

다양한 방법이 존재하지만, 취합할 엑셀 파일이 기존에 사용하던 내용이라 손을 대기 어려운 상황이라서, 프로그램적으로 처리하기를 원한 경우라 생각됩니다. 그걸 해결하려면 구조를 수정해야 했습니다.

GUI는 다음과 같이 변경했습니다.

우선 기존의 시작행과 종료행을 지정하는 방식대, 전체행을 복사하는 경우에 대한 방식을 RADIO버튼을 써서 선택하도록 해 주고, 기존의 마지막행 포함여부가 라디오버튼의 설명과 헷갈려서 (마지막행-1)행까지로 변경했습니다.

Gui, Add, Radio, x230 y240 w100 h20 vDedicatedEndRow gToggleRow , 마지막행 지정 ;
Gui, Add, Radio, x230 y270 w100 h20 vTotalData gToggleRow checked, 전체 행 포함

...

 

물론 변수명과 해당 로직도 그에 맞게 뒤바꾸었습니다.

if ( ExcludeEndRow = 1)

iLastRow := exelinput.ActiveSheet.Cells.SpecialCells(11).row - 1
} else 
{
iLastRow := exelinput.ActiveSheet.Cells.SpecialCells(11).row
}

열에 대한 선택을 하도록 라디오버튼을 추가했습니다.

Gui, Add, Radio, x30 y300 w100 h20 vTotalColumn gToggleColumn checked, 전체열 포함
Gui, Add, Radio, x30 y330 w300 h20 vSomeColumn gToggleColumn , 특정열 지정     입력파일(열) => 결과파일(열)
Gui, Add, Edit, x130 y360 w50 h20 vICol1 , B
Gui, Add, Edit, x220 y360 w50 h20 vOCol1 , C
Gui, Add, Edit, x130 y390 w50 h20 vICol2 , E
Gui, Add, Edit, x220 y390 w50 h20 vOcol2 , D

만약 2열 이외에 추가로 작업이 필요하다면 수정하시면 됩니다.

 

또한 기본 선택을 전체행,  전체열 포함으로 하고 그에 맞게 EDIT창을 ENABLE/DISABLE해 주었습니다. 그러려면 GUI,  SHOW를 하기 전에 변수 점검하도록 했습니다.

gosub ToggleColumn
gosub ToggleRow

...........

ToggleColumn:
{
  Gui, Submit, Nohide
  if ( TotalColumn = 1)
  {
    GuiControl, disable, ICol1 
    GuiControl, disable, ICol2 
    GuiControl, disable, OCol1 
    GuiControl, disable, OCol2 
  } else 
  {
    GuiControl, enable, ICol1 
    GuiControl, enable, ICol2 
    GuiControl, enable, OCol1 
    GuiControl, enable, OCol2 
  }
}
return

ToggleRow:
{
  Gui, Submit, Nohide
  if ( DedicatedEndRow = 1)
  {
    GuiControl, enable, EndRow 
  } else 
  {
    GuiControl, disable, EndRow 
  }
}
return

 

다음으로 전체열을 취합할건지 특정열을 지정해서 진행할지에 따라 다르게 처리되도록 구현해 줍니다.

우선 전체열 포함하는 경우는 기존과 같습니다.

if( TotalColum = 1) 
{
iLastCol := exelinput.ActiveSheet.Cells.SpecialCells(11).column
tt := chr( asc("A")+iLastCol -1)
rg = A%StartRow%:%tt%%iLastRow%
CellValue := exelinput.Worksheets(SheetName).range(rg).Value
LastRowEnd := LastRow + iLastRow -StartRow
drg = A%LastRow%:%tt%%LastRowEnd%
LastRow := LastRowEnd+1
output.Worksheets(SheetName).range(drg).Value :=CellValue

다음으로 일부열만 변경할 경우는 입력파일의 열을 취합할 파일의 열에 넣도록 range값을 변경해 줍니다.

특히 본격적인 작업을 하기전에 사용자가 의도치 않게 집어 넣었을 빈칸을 지워주는 작업을 먼저 합니다.

그리고 나서 이후에 입력범위와 출력 범위를 조정해 줍니다.

else 
{
 StringReplace,ICol1, ICol1," ","",All
 StringReplace,ICol2, ICol2," ","",All
 StringReplace,OCol1, OCol1," ","",All
 StringReplace,OCol2, OCol2," ","",All

rg =%ICol1%%StartRow%:%ICol1%%iLastRow%
CellValue := exelinput.Worksheets(SheetName).range(rg).Value
LastRowEnd := LastRow + iLastRow -StartRow
drg = %OCol1%%LastRow%:%OCol1%%LastRowEnd%
output.Worksheets(SheetName).range(drg).Value :=CellValue

rg =%ICol2%%StartRow%:%ICol2%%iLastRow%
CellValue := exelinput.Worksheets(SheetName).range(rg).Value
drg = %OCol2%%LastRow%:%OCol2%%LastRowEnd%
output.Worksheets(SheetName).range(drg).Value :=CellValue

LastRow := LastRowEnd+1
}

이렇게 수정해 주면 입력파일의 B열을 취합할 파일의 C열에 복사해 넣고 입력 파일의 E열을 취합할 파일의 D열에 복사하는 것이 가능해 집니다. 추가적인 열이 필요하면 조금만 응용하시면 됩니다.

아래는 해당 스크립트입니다.

mergeExcelv1.6.ahk
0.01MB

바쁘신들이 이용할 실행파일입니다. 

mergeExcelv1.6.exe
0.61MB

반응형