RPA/Power Automate Desktop

[Power Automate Desktop] 엑셀 수정 및 새 시트 복사

꼰대 2021. 6. 15. 17:15

이전 만든 엑셀 데이터가지고 뭐 더 해볼께 없나 곰곰히 생각하다가 셀 일부값을 조건 걸어 수정해야겠다 생각했습니다.

 

평균을 제외한 국영수 점수 중 50점 미만인 셀에 점수 대신 "낙제"라는 단어로 수정하고 싶습니다.

셀 점수 중 50점 미만인 점수의 좌표값을 얻어 해당 셀을 "낙제"로 수정하고 저장하는 아주 간단한 프로세스를 생각하고 접근했는데 문제는 이 프로그램이 셀의 좌표값을 얻을 수 없다는 것입니다. 제가 못찾는건지 정말 없는건지는 정확하지 않지만 1시간 넘게 찾아본 결과 없습니다. 이 프로그램에서 지원하는 것은 범위 셀 값을 읽어서 테이블 리스트 형태의 변수에 저장하는 것만 지원하니 위에서 설명한 간단한 프로세스로 구현할 수 없습니다.

이에 생각한 내용은 전체 데이터를 복사해 새로운 시트를 생성, 붙여넣으면서 점수값을 비교해 50점 미만이면 "낙제"를 입력하는 프로세스입니다.

어찌보면 이 프로세스도 간단합니다. 완성된 그림은 아래와 같습니다.

 

어제 오늘 엑셀가지고 좀 해봤는데 몇가지 참고할 만한 내용이 있습니다.

1. 엑셀 관련 Style을 적용할 수 없습니다. 그 어디에도 해당 내용 없습니다.
2. 작업 창에 작업이 많아질 수록 프로그램이 엄청 무거운 편입니다.

 

전체 플로어는 아래와 같습니다.

 

+새 흐름 선택해서 새로운 창을 열고 좌측 메뉴 Excel > Excel 시작을 끌어옵니다. Excel 시작은 다음 문서 열기로 선택하고 수정할 엑셀 파일의 경로를 탐색기를 통해 선택하고 저장합니다.

 

새로운 흐름 만들어서 진행하지 않고 기존꺼에서 작업 하나씩 설명하는 방식으로 하겠습니다. 느려터져서 못해먹겠습니다.

다음으로 좌측 메뉴 Excel > 활성 Excel 워크시트 설정을 끌어오고 다음 워크시트 활성화는 색인을 선택, 워크시트 색인은 1을 입력하고 저장합니다. 만약 작업 대상 시트가 다른 곳에 있다면 해당 번호를 넣어주면 됩니다. (파일의 두번째 시트에 있다면 2)

 

좌측 메뉴 Excel > Excel 워크시트에서 첫 번째 빈 열/행 가져오기를 끌어오고 저장합니다. 이는 시트에 있는 셀 데이터를 읽을 때 데이터가 있는 마지막 행과 열을 구하기 위해 미리 변수로 지정해둡니다. 이렇게 하면 FirstFreeColumn 변수에는 현재 시트에서 빈 열이 처음 있는 번호 (데이터가 있는 마지막 열 번호 + 1)를 저장하게 됩니다.

 

이제 시트에 있는 데이터를 읽어야 합니다. 좌측 메뉴 Excel > Excel 워크시트에서 읽기를 끌어와 검색은 셀 범위의 값, 시작 열/행은 시트의 좌측 최상단 셀 좌표이니 A1, 끝 열/행은 위에서 구한 변수 - 1 값이 되겠습니다.

 

이렇게 하면 ExcelData라는 변수에 테이블 형태의 리스트 데이터가 들어가 있습니다. 확인을 위해 상단 실행 버튼을 클릭하고 작업이 끝나면 우측 흐름 변수창에 ExcelData 우측의 추가작업 > 보기를 클릭하여 데이터를 확인합니다.

셀을 읽어 변수에 저장하면 어떤 형태로 데이터가 들어가는지 이해하셨을 겁니다. 저 데이터를 꺼낼때는 당연히 반복문으로 두번 돌면서 행 -> 열 순서로 가져와야 합니다.

참고로 아래 값 중 #, Column1, Column2 ... 는 데이터 아닙니다. 0번 행부터 데이터입니다.

그리고 한가지 팁을 더 드리면 만약 이 데이터 테이블에서 국어 타이틀값만 얻고 싶다면 어떻게 하면 될까요?%ExcelData[0][1]% 을 넣으면 됩니다. 2차원 배열로 [행][열]로 이루어져 있습니다.

 

이제 값을 붙여넣을 새로운 시트를 생성해야 합니다. 좌측 메뉴 Excel > 새 워크시트 추가를 끌어오고 새 워크시트 이름을 넣고 추가 위치는 마지막 워크시트로 지정합니다.

 

새로 생성한 워크스트를 활성화 시켜야합니다. 좌측 메뉴 Excel > 활성 Excel 워크시트 설정을 끌어와 다음 워크시트 활성화는 색인, 워크시트 색인은 위에서 생성한 시트를 마지막 워크시트 뒤에 넣었기 때문에 2번이 되겠습니다.

 

다음으로 좌측 메뉴 변수 > 변수 설정을 끌어와 변수 이름은 row, 값은 1로 입력하고 저장합니다. 이는 데이터를 넣을 셀 좌표값 중 행 값으로 하단 반복문이 종료될 때 +1씩 증가시켜 줘야 합니다.

 

이제 데이터 테이블을 읽어야 합니다. 좌측 메뉴 반복 > 각각의 경우를 끌어와 테이블 변수를 지정해줍니다. 이 구문의 뜻은 변수내 데이터 처음부터 데이터가 끝날 때까지 하나씩 반복한다는 뜻으로 하나의 데이터를 가져올 때마다 하단에 생성된 변수명에 저장됩니다. 편리한 구분을 위해 저는 rowValue라는 이름으로 변경하였습니다. (처음에는 CurrentItem으로 표시됩니다.)

 

좌측 변수 > 변수 설정을 끌어와 9번 (작업 흐름창 번호)에 위치시키고 변수명은 col, 값은 1을 넣고 저장합니다. 이는 데이터를 넣을 셀 좌표값 중 열 값으로 하단 반복문이 종료될 때 +1씩 증가시켜 줘야 합니다. 

 

이제 열 정보를 가져올 반복문이 필요합니다. 좌측 메뉴 반복 > 각각의 경우를 끌어와 10번에 위치하고 반복할 값은 rowValue, 저장될 변수는 colValue로 저장합니다. 위에서 데이터 테이블 형태로 정의한 ExcelData는 2차원 배열로 처음에는 행 수에 맞게 정보가 나열되고 다음으로 각 행 정보에 열 정보가 들어가 있는 형태로 구성되어 있습니다.

 

개발 언어를 모르시는 분들을 위해 이를 좀 더 자세히 이야기하면 아래 그림과 같습니다. ExcelData는 10개의 행 정보가 있고 하나의 행 정보에는 5개의 열 정보가 있는 형태입니다.
(컴퓨터의 시작번호는 0번부터 시작하기 때문에 주의하시기 바랍니다.)

예를 들면 3번 학생의 영어점수를 얻으려면 ExcelData[2][2] 값이 되겠습니다.

 

그래서 위 작업창에 반복문이 2번 들어간 이유는 처음 반복문은 행 정보에 대한 반복이고 두번째 반복문은 해당 행에 있는 열에 대한 반복문입니다.
(위 표를 90도 우측으로 돌리면 엑셀 데이터 구조와 동일합니다.)

이해가 안가시는분들은 인터넷에서 배열 자료구조를 좀 살펴보시면 쉽게 이해가 가능합니다.

 

다음으로 하나씩 읽은 열 값 중 국어, 영어, 수학 값일 경우 낙제 여부를 판단해야 합니다. 좌측 메뉴 조건 > 만약을 끌어와 11번에 배치하고 위에서 정의한 col 변수가 2와 같을 경우, 즉 국어 열일 경우를 지정하고 저장합니다.

 

다음으로 좌측 메뉴 조건 > 만약을 끌어와 12번에 배치하고 피연산자는 colValue, 연산자는 보다 작음, 두번째 피연산자는 50으로 저장합니다.

이는 위 국어 점수가 50점 미만일 경우의 조건입니다.

 

그러면 50점 미만의 조건에 만족할 경우 colValue를 변경해줍니다. 좌측 메뉴 변수 > 변수 설정을 13번에 끌어와 배치하고 변수는 colValue로 변경하고 값은 낙제로 입력하고 저장합니다.

이는 50점 미만일 경우 colValue 값을 "낙제"로 변경한다는 뜻입니다.

 

이제 좌측 메뉴 조건 > 그렇지 않다면을 추가하여 나머지 영어(col=3), 수학(col=4) 열도 위와 같이 동일하게 처리해줍니다.

 

각 국어, 영어, 수학의 50점 미만 점수에 대한 처리가 끝났습니다. 이제 값을 엑셀에 넣어야 합니다. 좌측 메뉴 Excel > Excel 워크시트에 쓰기를 끌어와 24번에 위치시키고 아래와 같이 입력하여 저장합니다.

여기까지 오게되면 colValue 변수에는 50점 미만일 경우 낙제 값이 들어가 있고 아니라면 기존 점수값이 그대로 있습니다. 또한 새로 입력해야할 셀좌표는 col, row 변수에 들어가 있습니다.

 

좌측 메뉴 변수 > 변수 증가를 끌어와 27번에 배치하고 아래와 같이 입력합니다. 즉, 열에 대한 반복문 마지막에 열 값에 대해 1만큼 증가시켜야 합니다.

 

마지막으로 좌측 메뉴 변수 > 변수 증가를 끌어와 27번에 위치 시키고 아래와 같이 입력하고 저장합니다.

행 반복문 마지막에 행 값도 1만큼 증가시켜줍니다.

 

모든 처리가 끝났습니다. 좌측 메뉴 Excel > Excel 닫기을 끌어와 최하단에 위치 시키고 아래와 같이 입력하고 저장합니다.

 

조건문이 생각보다 길어졌습니다. 살펴보니 조건문에 AND, OR 같은 연산자를 지원하지 않습니다. 그러다보니 조건문을 하나하나 작성하게 되어 길어집니다.
switch문을 사용해도 되는데 위 구문은 switch문을 작성할 성격도 아니고 길이도 별 차이가 없습니다.
궁금하신분은 조건문을 switch문으로 변경해도 됩니다. switch문은 좌측 메뉴 조건에서
전환
케이스
기본 케이스 순서입니다.
즉,
switch()
{
  case XX :
  default:
}
이렇게 구성하면 됩니다.

반응형