본문 바로가기
SAP

[VBA] 엑셀 VBA로 SAP에 자동으로 입력하기

by 해피케이네 2022. 1. 2.
반응형

안녕하세요 케이네입니다^^

케이네의 회사에서 ERP 시스템을 SAP를 사용하는데 정말 좋고 훌륭한 프로그램이면서 매우 비싼 녀석이지요. 그리고 입력이 여간 까다로운것이 아니어서 입력해야 하는 필드도 많고 조금만 적절한 값을 입력하지 않으면 다음 스텝 입력시 에러가 난답니다. 그리고 수정하기가 많이 까다롭기도 하고 월말 마감이 종료되어 당월 시스템이 Close되면 더 이상 수정을 못하는 그런 자비 없는 녀석이에요.

 

매일같이 입력해야 하는 SAP를 조금이라도 자동으로 입력하고 싶어서 VBA로 가능할지 찾아보니 되더라고요! 아직 케이네는 VBA가 능숙하지 못해서 자동화 할 수 있는 부분이 크지는 않지만 오늘도 정시퇴근을 위해 초 단위로 업무를 해치우시는 워킹맘들에게 도움이 되고싶어서 남겨봅니다!

 

먼저 VBA로 조작 전에 소개해드릴 SAP상의 기능이 있는데 "SAP script recording" 입니다. 아래의 링크에서 친절하게 설명하고 있어요. 

 

https://blogs.sap.com/2016/07/21/sap-gui-script-recording-playback-for-mass-password-resets/

 

SAP GUI Script Recording & Playback for mass password resets | SAP Blogs

4 2 17,626 This document will explain how to automate the SAP User-id password resets using the Script Recording and Playback. You can able to make the script on your own by following this document and programming knowledge is not required. Script recordin

blogs.sap.com

엑셀의 기능에 있는 매크로기록과 비슷한 기능이에요. SAP상에서 반복적으로 사용할 동작을 기록할거에요. 그리고 VBA로 수정이 필요한 부분은 엑셀에서 참조해 오려고 해요. 스크립트를 기록하고 나면 script1.vbs라는 파일이 생기는데 메모장으로 열어주고 안에 내용을 보면 뭔가 복잡하게 나와있어요. 

 

이것을 어떻게 VBA로 변경하는가 하면, 스크립트상에 If~End If 로 되어 있는 부분은 아래처럼 변경해 주세요. 이 부분은 스크립트로 SAP에 접속하려고 한다는 그런 내용이라고 합니다. 그러니까 언제나 동일한 내용이 들어가니 그냥 복붙으로 사용하시면 되요. 중요한것은 session.findByld~~로 쭈욱 나열되어 있는 부분입니다. 여기는 기록된 스크립트를 그대로 VBA에 붙여넣기 하면 됩니다.

 

Public Sub VBA로SAP움직이기() ' 이름은 아무렇게나 지어요
 
    Dim SapGuiAuto As Object
    Dim Application As Object
    Dim Connection As Object
    Dim session As Object
    
    Set SapGuiAuto = GetObject("SAPGUI")
    Set Application = SapGuiAuto.GetScriptingEngine
    Set Connection = Application.Children(0)
    Set session = Connection.Children(0)

 

    session.~~~~ ' 여기부터는 SAP 기록된 내용 붙여넣기

End Sub

케이네가 기록한 세션 내용을 살펴볼게요.

 

session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/ctxt품목코드").text = "101195942"
session.findById("wnd[0]/usr/ctxt").setFocus
session.findById("wnd[0]/usr/ctxt").caretPosition = 9
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxt고객사").text = "1009137"
session.findById("wnd[0]/usr/ctxt").setFocus
session.findById("wnd[0]/usr/ctxt").caretPosition = 7
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxt날짜").text = "2021/12/28"

 

이중에서 엑셀의 셀 정보를 참조해 오고 싶은 부분이 고객사 정보라고 하면 아래와 같이 코드를 추가하시면 되어요.

 

기존 : session.findById("wnd[0]/usr/ctxt고객사").text = "1009137"

변경 : session.findById("wnd[0]/usr/ctxt고객사").text = selectedCustomer

 

불러올 정보를 selectedCustomer라고 정해줬으니 selectedCustomer를 정의해 줘야겠지요?

 

    Dim selectedCustomer As String 'selectedCustomer라고 이름 붙여진 상자를 하나 만들어 줍니다.
    selectedCustomer = ActiveWorkbook.ActiveSheet.Cells(2, 1).Value ' 이 상자에 어떤 값을 넣을것이냐 하면 지금 열려있는 엑셀 시트의 "A2" 셀을 참조해 오라고 정해줍니다.

cell(2,1) 의 위치 cell(row,colum)

 

전체 코드를 보면 이렇게 됩니다.

 

Public Sub VBA로SAP움직이기()
 
    Dim SapGuiAuto As Object
    Dim Application As Object
    Dim Connection As Object
    Dim session As Object
    Dim selectedCustomer As String    


    Set SapGuiAuto = GetObject("SAPGUI")
    Set Application = SapGuiAuto.GetScriptingEngine
    Set Connection = Application.Children(0)
    Set session = Connection.Children(0)

 

selectedCustomer = ActiveWorkbook.ActiveSheet.Cells(2, 1).Value

 

session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/ctxt품목코드").text = "101195942"
session.findById("wnd[0]/usr/ctxt").setFocus
session.findById("wnd[0]/usr/ctxt").caretPosition = 9
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxt고객사").text = selectedCustomer
session.findById("wnd[0]/usr/ctxt").setFocus
session.findById("wnd[0]/usr/ctxt").caretPosition = 7
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxt날짜").text = "2021/12/28"

 

End Sub

 

뭔가 열심히 한것 같은데 조금 아쉬워요. 근데 우리가 하나만 입력하는게 아니라 여러개를 입력하고 싶을때가 있잖아요. 그럴때는 반복하는 작업을 만들어 주면 됩니다. VBA에서 "For"라는 기능이 있어요. 이걸 반복문이라고 한다고 하네요? 잘 모르겠지만 일단 인터넷에서 친절한 분들이 만들어 주신 코드가 있어서 흉내내보았어요.

 

이렇게 쓰면 위에 엑셀에 있던 고객코드 3개를 SAP로 입력해 준다고 하네요.

 

For i = 1 To 3
    
    selectedCustomer = sh.Cells(i, 1).Value

 

Next i

 

근데 지금까지 없던 i 는 갑자기 왜 여기서 나오는지, 잘 모르겠지만 일단 따라해 봅니다. i가 처음에는 1로 설정하고, i가 3이 될때까지 for문안에 있는 셀 값을 참조하라는 뜻이라고 해요. 근데 i를 쓰려면 그냥 갑툭튀 하면 안되고 i가 무엇인지 알려줘야 한다고 해서 Dim i As Integer 라고 추가를 해줍니다. 추가하는 김에 Dim wb As Workbook, Dim sh As Worksheet 도 추가해줄까봐요. 그리고 이녀석들은   Set wb = ActiveWorkbook    Set sh = wb.Worksheets 이렇게 설정을 해줍니다.

코드 머리쪽을 다시 보면 이렇게 되어요.

 

Public Sub VBA로SAP움직이기()
 
    Dim SapGuiAuto As Object
    Dim Application As Object
    Dim Connection As Object
    Dim session As Object
    Dim wb As Workbook
    Dim sh As Worksheet
    
    Dim selectedCustomer As String
    Dim i As Integer
    
 
    Set SapGuiAuto = GetObject("SAPGUI")
    Set Application = SapGuiAuto.GetScriptingEngine
    Set Connection = Application.Children(0)
    Set session = Connection.Children(0)
    
    Set wb = ActiveWorkbook
    Set sh = wb.Worksheets

 

For i = 1 To 3
    
    selectedCustomer = sh.Cells(i, 1).Value

 

session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/ctxt품목코드").text = "101195942"
session.findById("wnd[0]/usr/ctxt").setFocus
session.findById("wnd[0]/usr/ctxt").caretPosition = 9
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxt고객사").text = selectedCustomer
session.findById("wnd[0]/usr/ctxt").setFocus
session.findById("wnd[0]/usr/ctxt").caretPosition = 7
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxt날짜").text = "2021/12/28"

 

Next i

 

End Sub

 

이렇게 하면 셀 값을 참조하면서 원하는 매크로 기능을 돌릴수 있어요. 케이네는 간단한 입력기능만 있지만 VBA를 더 잘 만드시는 분이라면 복잡한 기능 구현도 가능하지 않을까 생각되어요. 이걸로 하루에 커피 한모금 여유롭게 마실 시간으로 20초 정도 번 것 같네요.

 

우리 모두 정시 퇴근해요!

반응형

댓글