본문 바로가기
SAP

[VBA/SAP] SAP 텍스트 박스 문자열을 VBA를 이용해서 엑셀로 가지고 오기 SAP 자동화

by 해피케이네 2023. 2. 10.
반응형

안녕하세요 케이네입니다

SAP로 업무를 보다가 노가다스러운 일이 하나 생겨서 해결 방법을 찾아보다가 올려봅니다.

하고자 하는것은 PO 번호의 텍스트 부분을 가져오는 작업 이었는데 PO 전체 레포트 리스트에서는 텍스트 부분을 컬럼으로 제공하지 않아서 하나하나 PO를 조회해서 엑셀에 붙여넣기를 해야하는 상황 이었습니다.



Script 녹화 기능으로 PO를 검색해서
해당 탭의 텍스트를 드래그한 다음 컨드롤+C
엑셀에 붙여 넣는 부분을 녹화 하였습니다 하고자 한 것은 SeletedPO로 엑셀에 있는PO를 가져와서 순차적으로 PO번호를 검색 하고 텍스트박스에서 복사해온 내용을 TextInput 이라는 String 변수에 넣고 i 라는 integer 변수를 증가 시키며 검색하고 싶은 PO 을 차례로 for loop 로 돌리는 것이었지요.

첫 난관, script 녹화 기능은 키보드에서 컨트롤+C로 입력한 것을 녹화하지 못했습니다. 데이터를 물리적으로 복사해 와야하는데 복사하라는 명령을 못받는 것이지요. session.findById("wnd[0]").sendVKey 17
(Shift + F5)
와 같이 입력 하는 키를 인식해줘야 하는데 ctrl + c 를 녹화해 오지 못했습니다.
SAP sendkeys list 를 찾아보니 복사하는 키는 V77, V92 를 쓴다고 나오더군요. 둘다 시도해 보았으나 실패.

session.findById("wnd[0]").sendVKey 77
session.findById("wnd[0]").sendVKey 92

그러다가 키보드로 명령을 받은게 아닌 마우스 오른쪽 클릭은 어떻게 기록되는지 궁금해서 해보았습니다.

session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0013/subSUB1:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1102/tabsHEADER_DETAIL/tabpTABHDT3/ssubTABSTRIPCONTROL2SUB:SAPLMEGUI:1230/subTEXTS:SAPLMMTE:0100/subEDITOR:SAPLMMTE:0101/cntlTEXT_EDITOR_0101/shellcont/shell").setSelectionIndexes 0, 16

결론적으로는 마우스 우클릭 명령어로 해결을 보았습니다.

복사해온 것을 변수에 넣는것은 아래와 같이 했습니다.

TextInput = session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0013/subSUB1:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1102/tabsHEADER_DETAIL/tabpTABHDT3/ssubTABSTRIPCONTROL2SUB:SAPLMEGUI:1230/subTEXTS:SAPLMMTE:0100/subEDITOR:SAPLMMTE:0101/cntlTEXT_EDITOR_0101/shellcont/shell").Text

그리고 vba로 TextInput을 엑셀에 입력해 나가면 됩니다.

전체 코드는 아래와 같습니다

Option Explicit
Sub POTEST()


    Dim SapGuiAuto As Object
    Dim Application As Object
    Dim Connection As Object
    Dim session As Object
    
    Dim selectedPO As String
    Dim TextInput As String
    Dim i As Integer
    Dim wb As Workbook
    Dim ws As Worksheet
    
    Set SapGuiAuto = GetObject("SAPGUI")
    Set Application = SapGuiAuto.GetScriptingEngine
    Set Connection = Application.Children(0)
    Set session = Connection.Children(0)
    
    Set wb = Workbooks("StockTest.xlsm")
    Set ws = wb.Worksheets("Sheet2")
    
  

For i = 1 To 140
    selectedPO = ws.Cells(i, 1).Value
    
    TextInput = ""
    


    session.findById("wnd[0]").sendVKey 17
    session.findById("wnd[1]/usr/subSUB0:SAPLMEGUI:0003/ctxtMEPO_SELECT-EBELN").Text = selectedPO
    session.findById("wnd[1]").sendVKey 0
    session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0013/subSUB1:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1102/tabsHEADER_DETAIL/tabpTABHDT3/ssubTABSTRIPCONTROL2SUB:SAPLMEGUI:1230/subTEXTS:SAPLMMTE:0100/subEDITOR:SAPLMMTE:0101/cntlTEXT_EDITOR_0101/shellcont/shell").setSelectionIndexes 0, 16
    TextInput = session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0013/subSUB1:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1102/tabsHEADER_DETAIL/tabpTABHDT3/ssubTABSTRIPCONTROL2SUB:SAPLMEGUI:1230/subTEXTS:SAPLMMTE:0100/subEDITOR:SAPLMMTE:0101/cntlTEXT_EDITOR_0101/shellcont/shell").Text
    ws.Cells(i, 2) = TextInput
Next
    

End Sub


간단히 for 문으로 구현했습니다. 물리적으로 모든 PO의 화면에 접근 하기 때문에 돌리는데 시간은 좀 걸립니다. 하지만 그 시간에 다른 메일을 보는 업무나 웹사이트를 보는것도 가능하고 커피도 한잔 가능하네요.

도움이 되셨다면 정말 기쁘겠습니다.


반응형

댓글