2017-04-08 7 views
1

Ich schreibe einen VBA-Code, der eine PDF-Datei von SAP speichert. Ich habe den Ort erreicht, wo SAP mich fragt, wo ich meine PDF-Datei speichern möchte (öffnet Windows Explorer "Speichern unter" -Fenster). An diesem Punkt stoppt VBA-Code und ich muss manuell den Namen der Datei eingeben, die ich will speichern. Dann läuft VBA weiter ...PDF speichern von SAP

Ich brauche Hilfe, um einen Weg zu finden, diesen Schritt zu automatisieren.

Eine mögliche Lösung, an die ich denke (aber nicht weiß, wie man es tatsächlich macht), ist vba zu sagen, ein VB-Skript zu starten, das auf Speichern als Fenster endet. Dann würde ich eine "application.sendkeys (" ") senden, um das Speichern als Pfad einzugeben.

Bitte beraten, wenn dies machbar ist. Wenn dies der nächste Schritt ist, muss ich bestimmte Zeilen des vb-Skripts dynamisch ändern Datei (ich brauche, um eine Liste zu Schleife und ändern jedes Mal einige Werte)

Danke

+0

So rufen Sie Excel SaveAs Dialogfeld ist relativ einfach. Es gibt eine Diskussion über solchen Code hier https://social.msdn.microsoft.com/Forums/en-US/69e81793-94d2-49a1-ab82-a3acdb4c81d4/saveas-dialog-box?forum=isvvba. Alles andere würde einen Blick auf Ihren vorhandenen Code erfordern, um Ihr Problem besser zu verstehen. – Variatus

+0

Hallo Variatus, seine SAP, die den Dialog nennen, nicht ich. Wenn es das tut, kann ich keinen Code ausführen, weil VBA möchte, dass ich es schließe, bevor ich den Rest des Codes wieder aufnehme. Danke. – OGERWOLF

+0

Lass mich das klarstellen. Ruft SAP Excel an, um ihm Daten zu geben und das Excel-Blatt in PDF zu speichern? – Variatus

Antwort

1

so ist es eine ziemliche Herausforderung gewesen .... Hier ist meine Lösung Fenster ein „speichern unter“ Handle Es kann viel einfacher sein, wenn Sie nur auf "Speichern" klicken würden. Meine Lösung ist komplizierter, da ich angeben, wo die Datei gespeichert werden soll. Dazu müssen Sie die richtige Combobox finden, die viel kostet der Iteration

WinAPI notwendigen Erklärungen:

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 

Actual VBA-Code:

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 

2. VBA-Code: Für SAP, da es einfacher zu sein, erweist sich aufgrund ComboboxEx32 statt Combobox verwendet wird.

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 

Fazit, das ist nicht der perfekteste Code, aber ich konnte nichts anderes im Web finden. Ich hoffe, dass dies allen zugute kommen wird, die das gleiche Problem haben.