2017-04-08 3 views
1

SAP에서 PDF 파일을 저장할 VBA 코드를 작성하고 있습니다. SAP에서 내 PDF 파일을 저장할 위치를 묻습니다 (Windows 탐색기에서 "다른 이름으로 저장"을 엽니 다.)이 시점에서 VBA 코드가 멈추고 원하는 파일 이름을 수동으로 입력해야합니다. 저장합니다. 그런 다음 vba는 계속 실행됩니다 ...SAP에서 PDF 저장

이 단계를 자동화하는 방법을 찾으려면 도움이 필요합니다.

내가 생각하고있는 가능한 해결책은 (실제로 어떻게해야할지 모르겠다.) vba가 창으로 저장시 끝나는 VB 스크립트를 실행하도록 알려주는 것입니다. 그런 다음 "application.sendkeys (" ")를 보내서 Save as Path를 입력하십시오.

가능하면 조언을 해주십시오. 파일 (나는 목록을 반복 할 필요가 일부 값마다 변경)

여기 .... 꽤 도전하고있다,

+0

Excel의 다른 이름 저장 대화 상자를 호출하는 것은 비교적 쉽습니다. 이러한 코드에 대한 설명은 https://social.msdn.microsoft.com/Forums/en-US/69e81793-94d2-49a1-ab82-a3acdb4c81d4/saveas-dialog-box?forum=isvvba에서 확인할 수 있습니다. 이보다 더 많은 것이 있다면 문제를 더 잘 이해하기 위해 기존 코드를 살펴 봐야합니다. – Variatus

+0

안녕하세요 Variatus, 그 SAP는 대화를 호출합니다. 코드를 실행하면 VBA에서 코드의 나머지 부분을 다시 시작하기 전에 코드를 닫으려고하므로 코드를 실행할 수 없습니다. 고마워. – OGERWOLF

+0

이걸 똑바로 세워 줘. SAP에서 Excel을 호출하여 데이터를주고 Excel 시트를 PDF로 저장합니까? – Variatus

답변

1

그래서 주셔서 감사합니다 내 솔루션은 "다른 이름으로 저장"창이 핸들하는 것입니다 "저장"버튼을 클릭하기 만하면 간단해질 수 있습니다. 파일을 저장해야하는 위치를 지정하기 때문에 솔루션이 더 복잡해졌습니다. 그렇게하려면 오른쪽 콤보 박스를 찾아야합니다. 반복 횟수 :

,

WinAPI를 필요 선언 :

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ 
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long 
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _ 
(ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long 
Private Declare Function SendMessage Lib "user32" Alias _ 
"SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, _ 
ByVal wParam As Long, lParam As Any) As Long 

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long 


Public Declare Function SendNotifyMessage Lib "user32" Alias "SendMessageA" (_ 
    ByVal hWnd As Long, _ 
    ByVal Msg As Integer, _ 
    ByVal ByValByValwParam As Integer, _ 
    ByVal lParam As String) As Integer 

실제 VBA 코드 :

Sub SaveAsWindow() 
Dim Winhwnd As Long 
Dim prev As Long 
Dim abc As Long 
Dim strText As String 
Dim rty As Variant 
Dim Parent As Long 
Dim child As Long 
Winhwnd = FindWindow(vbNullString, "Save As") 

For i = 1 To 20 
    strText = String$(100, Chr$(0)) 
    abc = GetClassName(Winhwnd, strText, 100) 
    If Left$(strText, 12) = "DirectUIHWND" Then GoTo here1 
    Winhwnd = FindWindowEx(Winhwnd, 0&, vbNullString, vbNullString) 
Next i 

here1: 

Parent = Winhwnd 
child = FindWindowEx(Parent, 0&, vbNullString, vbNullString) 

GoTo skip 'avoid this part for the 1st run 

here2: 
'fix child3 and child2 
If child2 = 0 Then 
    rty = "0&" 
    Else 
    rty = 0 
End If 
If child3 = 555 Then 
    rty = "0&" 
    child3 = "" 
End If 


skip: 

For i = 1 To 20 
    child = FindWindowEx(Parent, child, vbNullString, vbNullString) 

    For x = 1 To 20 
     If child3 = "" Then rty = 0 
     child2 = FindWindowEx(child, rty, vbNullString, vbNullString) 
     abc = GetClassName(child2, strText, 100) 

      If Left$(strText, 8) = "ComboBox" Then 
       child3 = FindWindowEx(child2, 0&, vbNullString, vbNullString) 
       If child3 = 0 Then 
       child3 = 555 
       GoTo here2 
       Else 
       GoTo here3 
      End If 
     End If 
    Next x 
Next i 

here3: 
'this is te filepath. will be pasted into combobox. to adapt to your needs. 
SendNotifyMessage child3, &HC, 0&, "C:\Users\username\abc.pdf" 


'Get again the Save button 
Winhwnd = FindWindow(vbNullString, "Save As") 
buttn = FindWindowEx(Winhwnd, 0, "Button", "&Save") 

'click on the save button 
SendMessage buttn, &HF5&, 0, 0 

End Sub 

VBA 코드 2 : 그것 때문에 ComboboxEx32에 간단 것으로 밝혀 SAP를 들어, 대신 콤보 상자의 사용.

Sub test() 
Dim Winhwnd As Long 
Dim strText As String 
Winhwnd = FindWindow(vbNullString, "Save As") 

combo = FindWindowEx(Winhwnd, 0, vbNullString, vbNullString) 

For i = 1 To 20 
combo = FindWindowEx(Winhwnd, combo, vbNullString, vbNullString) 
strText = String$(100, Chr$(0)) 
abc = GetClassName(combo, strText, 100) 

If Left$(strText, 12) = "ComboBoxEx32" Then GoTo here 

Next i 
here: 

SendNotifyMessage combo, &HC, 0&, "C:\Users\username\abc.pdf" 

buttn = FindWindowEx(Winhwnd, 0, "Button", "&Open") 
SendMessage buttn, &HF5&, 0, 0 

End Sub 

결론이 코드는 가장 완벽한 코드는 아니지만 웹에서 다른 것을 찾을 수 없습니다. 나는 이것이 동일한 문제를 가진 사람들에게 도움이되기를 바랍니다.