win32com(지도를 쉽게만드는것)

win32com - win32com으로 event처리

작성자
admin
작성일
2024-03-12 21:27
조회
263
win32com으로 event처리하기

이벤트를 발생시킬수있는 큰 3가지 경우는 아래와 같다
1 sheet별로 이벤트처리를 할 수 있는것
2 워크북수준에서 이벤트처리를 하는 것
3 엑셀프로그램수준에서 이벤트 처리하는 것
 

그중에서 아래의 코드는 sheet안에서의 이벤트처리이며, 이것은 현재 열려저있는 활성화된 시트에서 진행이 된다. 그리고 이것은 제가만든 pcell등과 연관을 짖지 않은 상태에서 이루어 지는 것이며, 아랫부분에 별도로 pcell과 연결하여 적용하는 방법을 보여드릴것입니다

 

# -*- coding: utf-8 -*-
import time #내장모듈
import pythoncom #pywin32 의 모듈
import win32com.client as win32 #pywin32 의 모듈

xlapp = win32.dynamic.Dispatch('Excel.Application')
workbook = xlapp.ActiveWorkbook
sheet = workbook.ActiveSheet
class SheetEvents:
    def OnChange(self, range_obj):
       print("old 셀주소 => ", range_obj.Address)
       print("값이 변경된 o1d 의 셀값 => ", range_obj.Value)
    def OnDeactivate(self):
       print("pcell 안의 메소드 실행 =>")
    def OnSelectionChange(self, range_obj):
       range_obj.Value = range_obj.Address
       print("선택한 영역이 바뀐것 => ", range_obj.Value)
if __name__ == "__main__":

    excel_sheet_event = win32.WithEvents(sheet, SheetEvents)
    while True:
       pythoncom.PumpWaitingMessages()

 
여기서 아셔야할 부분은 event는 한번실행되면 안되기 때문에 while을 사용합니다.
그래서 이것은 pell이나 다른 1회성 프로그램과 같이 사용할 수가 없습니다
만약 엑셀화일안에서 이벤트를 1개 만들고 동시에 python으로 이것을 만들면, 2개모두 실행이 됩니다

, python을 정지시킨후에 다시 실행을 시키면, python으로 만든 것은 다시 실행이 되는데, 엑셀 프로그램의 이벤트는 다시 실행이 않됩니다

이유는 엑셀은 다시 실행하기전에는 기존의 연결을 파이썬이 종료되면서 끊었기 때문에

엑셀화일을 다시 실행시키기 전까지는 작동을 하지 않는다
 
 

 Pcell과 event사용법
이것은 pce11의 안에서 실행을 시키면 않된다. 왜냐하면 엑셀이 끝날때까지나 아니면, 다른 기준으로 계속해 서 실행이 되도록 만드는 목적
Pce11 - 한번 실행하고 끝나는 목적
Pcell_event - 이벤트가 발생할때마다 계속 실행되는 목적
엑셀안의 매크로를 작성하면 알아서 엑셀에 실행하는 동안에 이벤트가 발생을 하면 실행되는데, 우리가 만드 는 pce11 _event가 실행이 되기 위해서는 프로그램이 끝나지 않고 계속 살아잇어야 한다
그래서 while을 넣어서 무한 반복하게 한것이다
 

# -*- coding: utf-8 -*-
import pcell
import time #내장모듈
import pythoncom #pywin32 의 모듈
import win32com.client as win32 #pywin32 의 모듈

excel = pcell.pcell()
class SheetEvents:
    def OnChange(self, rng):
       print("old 셀주소 => ", rng.Address)
       print("값이 변경된 o1d 의 셀값 => ", rng.Value)
    def OnDeactivate(self):
       print("pcell 안의 메소드 실행 =>", excel.read_address_in_activecell())
    def OnSelectionChange(self, range_obj):
       print("선택한 영역이 바뀐것 => ", range_obj.Value)
       print("pcell 안의 메소드 실행 =>", excel.read_address_in_activecell())
       excel.paint_cell("", excel.read_address_in_activecell(), "b1u88")
if __name__ == "__main__":
    excel = pcell.pcell()
    #excel_application_ event - win32.WithEvents(exce1, ApplicationEvents)
    #excel_workbook_event = win32.WithEvents(excel.active_workbook(), WorkbookEvents)
   
excel_sheet_event = win32.WithEvents(excel.get_activesheet_object(), SheetEvents)
    while True:
       pythoncom.PumpWaitingMessages()

추가적으로 다른 이벤트들을 사용하고 싶다면,
만약 엑셀 매크로의 이벤트를 만들었다면, 그것도 함께 실행이 되는데
만약 pcel1_event를 제거하면, 두개 보두 실행이 되지 암고
엑셀매크로는 파일안에 남아있기 때문에, 다시 실행을 원한다면 아마도 껏다가 다시 실행올 해야 할것으로 보
인다
원인은 엑셀의 이벤트에 저장된 연결고리가 사라지기 때문인 것 같다