본문 바로가기
Tips

초보자가 회사 엑셀excel 에 쓸만한 오토핫키ahk 자동화 코드 정리

by Toast 2020. 9. 9.
반응형

추천 인디게임 : 오름달

 

오름달 : 달을 우주로 올려요, Fly the Moon - Google Play 앱

이타적인 성격일수록 유리한, 한 손가락으로 즐기는 두뇌 게임!

play.google.com

 

추천 인디게임 : 떼굴떼굴 집으로

 

떼굴떼굴 집으로 - Rolling Home - Google Play 앱

구르는 재주만 있는 외계인을... 집으로 보내주세요!

play.google.com

 

 

 

 

업무 자동화를 위해 오토핫키를 공부하며 어려웠던 점들을 기억하며
아래에 정리했습니다.
저 역시도 한 번 썼던 코드들을 다시 쓰려니 이리저리 헷갈렸었거든요.

일종의 RPA 일텐데요 (Robotic Process Automation) 아래 내용 활용하시어 업무자동화 이룩하셔요~

좌측이 코드, 우측이 설명이며 검은색 외 글씨를 수정하시면 되겠습니다.
엑셀파일을 열어서 이리저리 수정하고, 저장한 후 메일로 보내고 텔레그램telegram으로 보내는 것 까지 입니다.



엑셀파일 열기

엑셀파일 열기 : 특정 엑셀파일 열기  
엑셀명칭 := ComObjCreate("Excel.Application")
경로명 = %A_ScriptDir%\파일명.xlsx
엑셀명칭.Workbooks.Open(경로명)
엑셀명칭.Visible := True
엑셀명칭.DisplayAlerts := False
엑셀명칭을 설정하고
ahk가 있는 폴더의 파일명.xlsx를 열기.
엑셀명칭에 해당할 파일을 지정. (상기 경로명의 파일)
해당 엑셀파일을 보이게 열지 여부. 안보이게 할거면 False 로 변경
해당 엑셀파일에서 알람/확인창을 뜨지 않게 함.
엑셀파일 열기 : 열 엑셀파일을 지정하기  
엑셀명칭 := ComObjCreate("Excel.Application")
FileSelectFile, 경로명
엑셀명칭.Workbooks.Open(경로명)
엑셀명칭.Visible := True
엑셀명칭.DisplayAlerts := False
엑셀명칭을 설정하고
해당 파일의 위치를 선택할 수 있는 대화창이 뜸
엑셀명칭에 해당할 파일을 지정. (상기 선택된 값)
해당 엑셀파일을 보이게 열지 여부. 안보이게 할거면 False 로 변경
해당 엑셀파일에서 알람/확인창을 뜨지 않게 함.
참고 : 열 엑셀파일을 지정하는 옵션  
FileSelectFile, 경로명, ,C:\열릴폴더\, 설명, *.xlsx 경로명은 똑같고, 옵션은 빈칸, 열릴폴더 지정가능, 다이얼로그 설명글, 보일파일형태



엑셀에서 값복사

시트 중 특정 부분의 수식을 값복사 하기  
엑셀명칭.Sheets("시트명").Select
엑셀명칭.ActiveSheet.Range("A:Z").Copy
엑셀명칭.ActiveSheet.Range("A:Z").PasteSpecial(-4163)
엑셀과 시트를 선택
위에서 선택해 active된 상기 시트의 A~Z까지 카피함
상기 시트의 A~Z까지 값만 붙여 넣음
엑셀 모든 시트를 값복사하기  
엑셀명칭.Sheets().Select
엑셀명칭.Cells.Select
엑셀명칭.Cells.Copy
엑셀명칭.Cells.PasteSpecial(-4163)
엑셀명칭.Range("A1").Select
엑셀 내 모든 시트를 선택
위에서 선택해 active된 상기 시트의 모든 셀을 선택함
위에서 선택해 active된 상기 시트의 모든 셀을 복사함
상기 시트에서 값만 붙여 넣음
선택되어 있는 음영을 없애기 위하여 A1셀을 선택
특정위치에 붙여넣기  
엑셀명칭.Sheets("시트1명").Select
엑셀명칭.Range("A:J").Copy
엑셀명칭.Sheets("시트2명").Select
엑셀명칭.Range("A1").Select
엑셀명칭.ActiveSheet.Paste
복사할 시트 선택
복사할 범위 선택해서 복사
붙여넣을 시트 선택
붙여넣을 시작셀 선택
붙여넣기
일부 범위에만 붙여넣기  
엑셀명칭.Sheets("시트명").Select
엑셀명칭.Range("K7:P7").Copy
엑셀명칭.Range("K7:P9000").Select
엑셀명칭.ActiveSheet.Paste
시트 선택
복사할 위치 선택해서 복사
붙여넣을 범위 선택
붙여넣기


엑셀에서 삭제

시트를 삭제하기  
엑셀명칭.Application.DisplayAlerts := False
엑셀명칭.Sheets("시트명").Delete()
해당 엑셀파일에서 알람/확인창을 뜨지 않게 함. (삭제확인)
삭제진행
특정 시트만 남기고 삭제하기  
For sheet in 엑셀명칭.Worksheets
if sheet.Name != "시트명하나" AND sheet.Name != "시트명둘"
sheet.delete
해당 엑셀파일에서
시트명하나와,  시트명둘  이 아닌 건들을
삭제함
셀을 삭제하기  
엑셀명칭.Sheets("시트명").Select
엑셀명칭.ActiveSheet.Range("A:Z").Delete
엑셀명칭.ActiveSheet.Range("3:3000").Delete
엑셀 내 특정 시트를 선택
위에서 선택한 해당 시트의 A열~Z열을 삭제함
위에서 선택한 해당 시트의 3행~3000행을 삭제함


엑셀에서 정렬

표의 헤더 빼고 정렬하기  
엑셀명칭.Sheets("시트명").Select
endR := 엑셀명칭.ActiveSheet.UsedRange.Rows.Count
엑셀명칭.Range("A3:AB"endR).Sort(xfile.Columns(1),2)
엑셀 내 특정 시트를 선택
위에서 선택한 시트의 행 수를 세어 endR 이라는 변수로 지정
시트의 A3~AB끝까지 지정해서 A(=1) 기준 내림차순(=2) 정렬


엑셀 저장

특정이름으로 저장  
경로변수 = %A_ScriptDir%\aaa.xlsx
엑셀명칭.DisplayAlerts := False
엑셀명칭.ActiveWorkbook.SaveAs(경로변수)
ahk와 동일폴더에 aaa.xlsx로 파일명 지정
덮어쓰기 알람이 뜨지 않게 처리
상기 경로에 저장함
그대로 저장  
엑셀명칭.ActiveWorkbook.Save() 그대로 저장


엑셀 정리

모든 시트를 맨 위로 보내게  
엑셀명칭.Sheets("제일끝시트명").Select
Send, {ctrl down}
Loop 30
{
Send, {Home}
Sleep, 100
Send, {PgUp}
Sleep, 100
}
Send, {ctrl up}
제일 오른쪽의 시트를 지정
컨트롤키를 누르고
30번 반복함

제일윗셀로

앞시트로


컨트롤키를 뗌


여러 엑셀을 오가기

필요 엑셀을 선택하기  
엑셀명칭.Visible := True 해당 엑셀을 보이게 하기
해당 엑셀을 닫기  
엑셀명칭.Quit 해당 엑셀을 닫기 (꺼짐)


아웃룩으로 메일 보내기

메일 발송하기  
obj :=ComObjCreate("Outlook.Application")
메일명 := obj.CreateItem(0)
메일제목 := "ㅇㅇㅇㅇㅇㅇㅇㅇ"제목변수
메일명.Subject := 메일제목
메일명.Body := "ㅇㅇㅇㅇㅇㅇ"
메일명.To := "메일주소; 메일주소"
메일명.Bcc := "메일주소; 메일주소"
myAttachments := 메일명.Attachments
myAttachments.Add("C:\aa.xlsx")
메일명.Send()
objRelease(메일명)
objRelease(obj)
아웃룩 모듈 불러오기
메일명 설정
메일제목에 변수가 들어가는 경우, 별도로 변수정의부터 시작
메일제목 지정
메일 내용 지정. 변수가 안들어가서 별도 변수 지정 없이 진행함
메일 수신인
메일 비밀참조인
첨부파일 있을 경우
첨부파일 경로 입력
메일 발송 명령
아웃룩 메일작성 종료 (메모리 회수라고 함)
아웃룩 모듈 종료 (메모리 회수라고 함)
엑셀 메일 내용을 html로 작성하기  
obj :=ComObjCreate("Outlook.Application")
메일명 := obj.CreateItem(0)
메일명.Subject := “ㅇㅇㅇㅇ
URL변수 := 엑셀명.Sheets("").Range("A1").value
링크URL = "https://api.com/%URL변수%"
본문변수 =
(
<HTML>
<br><br>
<a href=%링크URL%>클릭</a>
<br><br>
</HTML>
)
메일명.HTMLBody := 본문변수
메일명.To := "메일주소; 메일주소"
메일명.Bcc := "메일주소; 메일주소"
메일명.Send()
objRelease(메일명)
objRelease(obj)
아웃룩 모듈 불러오기
메일명 설정
메일제목에 변수가 없어서 바로 입력
엑셀명의 가시트, A1의 값을 URL변수로 지정함
상기 URL변수를 포함해서 링크 URL을 만듦.
본문내용을 변수로 지정
URL에 변수가 포함되어 직접입력하면 작동하지 않았음






메일 내용을 HTML로 하여 내용을 불러옴
수신인 지정
비밀참조인 지정
메일 발송 명령
아웃룩 메일작성 종료 (메모리 회수라고 함)
아웃룩 모듈 종료 (메모리 회수라고 함)


텔레그램 보내기 : 더 자세한 내용은 다음글로 - [ 텔레그램 api 로 메시지 채널 자동화 ]

엑셀 메일 내용을 html로 작성하기  
텍스트내용 := 엑셀명칭.Sheets("시트명").Range("A1").value
링크URL = "https://api.telegram.org/bot키/sendmessage?chat_id=-채팅방번호&parse_mode=markdown&text=%텍스트내용%"
텍스트 내용을 특정엑셀 특정시트 특정셀에서 찾기
봇키와 채팅방번호를 넣고 마크다운 모드로 텍스트내용 넣
html 메일로 넣을 때는 변수를 한 번 거쳐야 했습니다. 이유는 저도 모릅니다.. 생존식으로 방법만 찾은거라서요..
텍스트내용은 유니코드로 작성해야 합니다.
엑셀 메일 내용을 텔레그램으로 보내기  
텍스트내용 := 엑셀명칭.Sheets("시트명").Range("A1").value
Run, https://api.telegram.org/bot키/sendmessage?chat_id=-채팅방번호&parse_mode=markdown&text=%텍스트내용%
WinWait, api.telegram
sleep, 1000
send ^w
A1셀에 텍스트를 만들어 놓음
브라우저로 해당 주소 접속. 여기서는 변수로 접속하면 오히려 안되더라고요, 역시 이유는 모릅니다..
브라우저 열릴 때 까지 대기
열리면 1초 후에
해당 창 닫기 (텔레그램 접속한 창)
마크다운 요령  
% = %25
줄바꿈 = %0A
* = %2A
그냥%로 하면 종종 에러남
엑셀상에서 이름지정으로 해놓으면 더 편함.
*과 *사이는 굵은글씨임

텔레그램 발송에 대한 더 자세한 내용은 - [  텔레그램 api 로 메시지 채널 자동화 ]

 

 

추천 인디게임 : 오름달

 

오름달 : 달을 우주로 올려요, Fly the Moon - Google Play 앱

이타적인 성격일수록 유리한, 한 손가락으로 즐기는 두뇌 게임!

play.google.com

 

추천 인디게임 : 떼굴떼굴 집으로

 

떼굴떼굴 집으로 - Rolling Home - Google Play 앱

구르는 재주만 있는 외계인을... 집으로 보내주세요!

play.google.com

 

 

반응형

댓글