본문 바로가기
GAS

[GAS] 시트통합 매크로

by 일등미노왕국 2023. 4. 3.

https://www.youtube.com/watch?v=pdCE4gCr6q8&list=PLxmyPu_Id2smCXbzw2IgsRpizPIaR8G-i&index=2&ab_channel=EXCELANDVBA 

 

EXCEL AND VBA님의 시트를 통합하는 매크로이다. 엑사남님 유튜브 강의를 보면서 공부했듯 VBA GAS 님의 강의를 리뷰하면서 성장해 나가려 한다.

 

시트를 통합하는 매크로는 VBA에서 많이 하는 형태이다.

 

시트를 통합하기 위해서는 메인시트를 제외한 모든 시트를 순환하면서 데이터를 가져오는것이 포인트이다.

각 데이터 시트마다 헤드값 + 데이터로 구성이 되기 때문에 헤드는 최초에 한번만 들어가야 한다.

if (first){                         // 통합시트의 말머리를 가져오기 위한 작업

  result = result.concat(sheets[i].getDataRange().getDisplayValues() );
  first = false;                    // main시트가 아닌 첫 시트의 전부를 result에 담아라

}else{                              // main시트가 아닌 두번째 시트면

코드를 설명하면 통합시트가 아닌 첫 데이터 시트가 들어오면 시트의 모든 데이터를 result 배열에 추가하라는 구문이다.

 

}else{                              // main시트가 아닌 두번째 시트면 

  rngAll = sheets[i].getDataRange();   // 시트의 전체 내용을 rngall 에 담아라.
  result = result.concat(rngAll.offset(1,0,rngAll.getNumRows()-1).getDisplayValues() );
          // rngall에서 한행 내려오고 전제행의 길이를 줄인 전체값을 result 배열에 추가로 담아라
          // 두번째 시트부터는 헤드값을 없애기 위한 작업
}

이 구문은 두번째 시트부터는 VBA에서 데이터 영역만 가져오기 위한 코드이다.

set rngAll = 영역

set rngall = 영역.offset(1).resize(rngall.rows.count-1,영역의 열길이)
더보기
function merge_sheets(){

  //spreadsheet _ 엑셀에서 워크북  
  var wb = SpreadsheetApp.getActiveSpreadsheet();

  //sheets
  var sheets = wb.getSheets();  // worksheets
  var result = [];              // result 배열에 담기
  var first = true;             
  var rngAll;

  for(var i=0; i<sheets.length;i++){        // 시트들을 순환

    if(sheets[i].getName() !== 'main'){     // 시트의 이름이 main이 아니면

        if (first){                         // 통합시트의 말머리를 가져오기 위한 작업

          result = result.concat(sheets[i].getDataRange().getDisplayValues() );
          first = false;                    // main시트가 아닌 첫 시트의 전부를 result에 담아라
          
        }else{                              // main시트가 아닌 두번째 시트면 

          rngAll = sheets[i].getDataRange();   // 시트의 전체 내용을 rngall 에 담아라.
          result = result.concat(rngAll.offset(1,0,rngAll.getNumRows()-1).getDisplayValues() );
                  // rngall에서 한행 내려오고 전제행의 길이를 줄인 전체값을 result 배열에 추가로 담아라
                  // 두번째 시트부터는 헤드값을 없애기 위한 작업
        }

    }
  }

  wb.getSheetByName("main").getRange(1, 1).getDataRegion().clear();     // 기존값을 삭제

  wb.getSheetByName("main").getRange(1, 1, result.length, result[0].length).setValues(result);
  
  // main시트에 range(1,1).resize(배열의 행길이, 배열의 열길이[첫번째 값이 크기]) = result 배열을 담아라
   

}
 

 

https://docs.google.com/spreadsheets/d/1s5jSNL8CVRZIFG5XQOOdwFbbsX1wPIBWUuLk8lAUo8I/edit?usp=sharing

댓글