아래 포스팅에서 작성한 바와 같이 Autohotkey 를 사용하면 COM 을 사용한 작업들을 할 수가 있습니다.

http://iamaman.tistory.com/461

COM 을 사용한 대표적인 작업으로는 Internet explorer 를 비롯하여 Microsoft Office 등을 자동활 할 수 있는데요~

오늘은 Microsoft Office powerpoint 파일을 안 보이게 여는 방법에 대해 조금 소개해 보려 합니다.

보통 엑셀 등에서는 Application object 의 visible 필드의 값을 false 로 하면 파일이 열려 있지만 보이지는 않게 설정 할 수 있습니다.

그런데 powerpoint 에서는 약간 다르더군요.

아래와 같이 file open 시에 4번째 옵션에 false 로 주면 화면에는 보여주지 않고 powerpoint 파일을 열 수 있습니다.

powerpointFile=C:\abc.pptx
pptApp := ComObjCreate("PowerPoint.Application") ; create PowerPoint object 
Xl_Workbook := pptApp.Presentations.Open(powerpointFile,,,false) ; Visible False


Xl_Workbook.Close
pptApp.Quit() 



  1. 김민혁 2018.12.06 09:29

    안녕하세요 좋은 자료 감사히 잘 보고 있습니다

    혹시 인터넷에 첨부된 엑셀파일을 저장하지 않고 열기를 선택하여 활성화된 엑셀파일을 Comobj 명령어로 바로 접근할수 없겠습니까?

    • 남성 2018.12.06 19:07 신고

      현재 엑셀 파일이 열려 있고 해당 엑셀 파일의 COM object 에 접근하기 위해서는 ComObjActive 를 사용하면 됩니다.

      exCOM := ComObjActive("Excel.application")
      exCOM.visible := False


      아래 포스팅도 참고 하시길~

      http://iamaman.tistory.com/1996

  2. 김민혁 2018.12.07 10:53

    답변 주셔서 대단히 감사합니다. 제가 당면한 상황 하나를 더 설명을 못했네요
    저장하지 않은(첨부파일 여러개를 저장하지 않고 열기를 선택한)
    1개 이상의 엑셀파일을 별도로 통제하고 싶습니다


    1. 제가 관리하는 엑셀파일 하나가 실행되어 있는 상태이고
    ( xl:= comobjcreate("Excel.Application")
    xl.open(path) 를 사용하고 있습니다)

    2. 그 상황에서 인터넷에서 엑셀 첨부파일을 열어서(저장하지 않고)
    첨부파일의 데이터를 1번의 엑셀파일에 붙여놓고 싶습니다

    3.문제점
    1) 첨부파일의 엑셀파일을 활성화된 상태에서
    xl2:= comojbactive("Excel.application").ActiveWindow
    xl2.range("A1").copy
    위의 스크립트를 실행하면 range가 알수없는 이름이라고 에러가 뜨고요

    2)
    xl2:= comojbactive("Excel.application")
    xl2.range("A1").copy

    이렇게 실행하면 첨부파일이 아닌 기존1번의 엑셀파일의 A1을 복사합니다..





    인터넷에 찾아봤는데 좋은 예시가 있었으나 이것도 에러가 납니다
    고수님 제발 부탁드립니다 해법을 알려주십시오


    It's recommended to use oExcel := Excel_Get() instead of oExcel := ComObjActive("Excel.Application") to access the Excel object for a few reasons - when you use oExcel := ComObjActive("Excel.Application");
    • if there is more than 1 running Excel process, it will get the first registered on the ROT (Running Object Table).
    • if the Excel process hasn't been registered on the ROT (if it was just opened), you will get a Com Error.
    • you will get an error if the worksheet is being edited

    #IfWinActive, ahk_class XLMAIN

    F1::

    oExcel := Excel_Get(), oSheet := oExcel.ActiveWorkbook.ActiveSheet

    oSheet.Columns("A").ColumnWidth := 4, oSheet.Columns("B").ColumnWidth := 16

    oSheet.Columns("C").ColumnWidth := 10, oSheet.Columns("D").ColumnWidth := 10

    oSheet.Columns("E").ColumnWidth := 40, oSheet.Columns("F").ColumnWidth := 60

    oSheet.Cells.Select



    oSheet.Sort.SortFields.Clear

    oSheet.Sort.SortFields.Add(oSheet.Range("F:F"),0,1,ComObjMissing(),0)

    oSheet.Sort.SetRange(oSheet.Range("A:M"))

    oSheet.Sort.Header := 1, oSheet.Sort.MatchCase := 0

    oSheet.Sort.Orientation := 1, oSheet.Sort.SortMethod := 1

    oSheet.Sort.Apply

    return

    #IfWinActive


    에러 문구:
    Call to nonexistent function.
    Specifically: Excel_Get(), oSheet := oExcel.ActiveWorkbook.ActiveSheet

    • 남성 2018.12.07 15:39 신고

      아래와 같이하면 복사가 될 겁니다.

      xl2:= ComObjActive("Excel.application")
      xl2.ActiveSheet.Range("A1").copy

  3. 김민혁 2018.12.07 10:56

    참고한 사이트는 해당사이트 입니다
    https://autohotkey.com/board/topic/77840-how-to-pass-com-object-pointer-to-a-script/#entry495039

MATLAB 은 정말 많은 부분을 자동화 할 수 있는 툴입니다.

 

Simulink 를 사용하신다고 하더라도 MATLAB 을 제대로 다룰 줄 알아야 Simulink 를 효율 적으로 사용 할 수 있습니다.

 

코드 생성과 같이 시간이 좀 많이 걸리는 작업을 실행할 때 컴퓨터 앞에서 계속 앉아 있다면 참 답답 할 겁니다.

 

이럴 때 저는 MATLAB 에서의 작업이 끝나면 메일을 보내도록 설정해 놓고 나가서 커피 한잔 하면서 쉬곤 합니다.

 

요즘 대부분 스마트폰을 사용하니 휴대폰으로 메일을 확인 할 수 있을테고

 

작업이 완료 됐다는 메일을 받으면 들어와서 그 이후의 작업을 하는거죠.

 

저는 Windows 환경이고 메일 프로그램으로 Ms 아웃룩을 사용 합니다.

 

MATLAB 에서는 MS Office 제품군을 자동활 할 수 있습니다.

 

메일을 보내는 간단한 스크립트는 아래와 같습니다. Subject 에 메일 제목을 넣고 To에 보낼 사람, HTMLBody 에 메일 내용을 적습니다.

 

h = actxserver('outlook.Application');

mail = h.CreateItem('olMail');

mail.Subject = 'Mail Test';

mail.To = 'nnn@naver.com';

 

mail.BodyFormat = 'olFormatHTML';

mail.HTMLBody = 'This is Body';

mail.Send;

h.release;

 

MATLAB 에서 시간이 오래 걸리는 작업을 돌려 놓고 마지막에 위 스크립트를 실행 되도록 한다면 MATLAB 이 돌아가는 동안에 나가서 커피 한잔 하고

 

다 되면 휴대폰으로 확인하고 ~

 

들어와서 다음 작업을 하는 식이죠~



  1. 2016.11.02 22:27

    비밀댓글입니다

Autohotkey 를 사용하다 보면 코드 내에서 현재 사용하는 시스템이 32 비트 인지 또는 64 비트인지를 구별해야 하는 경우가 종종 발생합니다.

 

예를 들면 Windows 64비트에서는 32 비트용 프로그램들이 Program Files (x86) 에 설치가 되곤 합니다.

 

하지만 32비트 운영체제에서는 Program Files 폴더에 설치가 되죠.

 

따라서 하나의 코드를 32비트와 64 비트에서 동시에 사용하기 위해서는 해당 시스템이 32비트인지 64 비트인지를 구분해야 하는 것입니다.

 

이에 대한 방법은 아래 포스팅에서 소개했던 ~

 

http://iamaman.tistory.com/1461

 

IsWow64Process() 함수를 사용하면 됩니다. IsWow64Process() 함수는 64비트이면 1을 그렇지 않으면 0을 리턴합니다.

 

이제 위 함수를 사용하여 간단한 예제를 하나 만들어 보죠. 간단하게 Autohotkey 로 chrome 브라우저를 실행하는 예제를 만들어 봤습니다.

 

일단 제가 현재 사용하고 있는 64 비트 운영체제에서는 아래 Path 에 chrome 실행 파일이 존재합니다.

 

C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

 

하지만 32비트 운영체제에서는 아래 Path 에 chrome 실행 파일이 존재합니다.

 

C:\Program Files\Google\Chrome\Application\chrome.exe

 

따라서 윈도우 시스템에 따라 Autohotkey 코드가 정상적으로 동작하게 하기 위해서는 32비트 인지 64비트인지를 구분해서 아래와 같이 코딩 해야 할 것입니다.

 

IsWow64Process()

{

    hProcess := DllCall("kernel32\GetCurrentProcess")

    ret := DllCall("kernel32\IsWow64Process", "UInt", hProcess, "UInt *", bIsWOW64)

    return ret & bIsWOW64

}

 

if (IsWow64Process())

{

    Run "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"

}

else

{

    Run "C:\Program Files\Google\Chrome\Application\chrome.exe"

}

 

위 코드를 실행하면 자신의 운영체제에 맞는 chrome 이 실행 됩니다.

+ Recent posts