2017-08-23 3 views
1

Ich habe einen Code, um PDF-Dateien nach Excel zu übertragen, aber ich bekomme eine Fehlermeldung in einer der Zeilen und ich weiß nicht warum.PDF zu Excel Fehler beim Schließen PDF-Datei

Ich bin in der Lage, die Daten aus der PDF-Datei korrekt zu extrahieren und einzufügen, das Problem ist, wenn Sie versuchen, die PDF-Datei zu schließen.

Der Code Ich verwende ist wie folgt:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ 
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ 
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 

Sub PDFExtract() 

' Get name of Excel file 
TemplateName = ThisWorkbook.Name 

Dim oW As Worksheet: Set oW = ThisWorkbook.Worksheets("Temp") 
FileToOpen = "c:\text.pdf" 
ShellExecute 0, "Open", FileToOpen, "", "", vbNormalNoFocus 
num = ShellExecute(0, "Open", FileToOpen, "", "", vbNormalNoFocus) 

' wait 2 secs 
Application.Wait Now + TimeValue("00:00:2") 

' select all using ctrl a 
SendKeys "^a", True 

' wait 2 secs 
Application.Wait Now + TimeValue("00:00:2") 

' copy all using ctrl c 
SendKeys "^c" 

' wait 2 secs 
Application.Wait Now + TimeValue("00:00:2") 

' activate this wokbook 
Windows(TemplateName).Activate 
Sheets("Temp").Select 
Range("B7").Select 
ActiveSheet.Paste 

Call TerminateApp ' The problem in the code for TerminateApp 
End sub 

So weit so gut. Jetzt der TerminateApp Code, wo ich das Problem habe

Ich habe oben hervorgehoben, wo ich die Fehlermeldung bekomme. Die Fehlermeldung erhalte ich ist: Laufzeitfehler ‚-2147217406 (80041002): Nicht

gefunden Was ich seltsam gefunden, dass:

  • Die PDF-Datei
  • Wenn ich geschlossen wurde Schritt über die Linie, das Programm ohne Fehler weiterhin
  • Wenn ich eine andere PDF-Datei geöffnet haben, schließt es beide und keine Fehlermeldung nicht geben

Es sieht so aus, als ob es die PDF-Datei schließt und dann versucht, danach zu suchen, sie aber nicht findet. Irgendwelche Ideen, warum der Fehler auftritt und wie das Problem gelöst werden kann?

Ich habe versucht, den Code gemäß Beispiel here von smartbelix zu ändern, aber es hat nicht funktioniert:

Do 
    Set objWMIcimv2 = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
    Set objList = objWMIcimv2.ExecQuery("select * from win32_process where name='" & strTerminateThis & "'") 
    If objList.Count > 0 Then 
     For Each objProcess In objList 
      intError = objProcess.Terminate 'Terminates a process and all of its threads. 
      'Return value is 0 for success. Any other number is an error. 
      If intError <> 0 Then Exit For 
     Next 
    End If 
Loop While objList.Count > 0 

Antwort

1

Unter Ihrer Function ShellExecute, fügen Sie diese beiden:

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

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _ 
     (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 

Und dann hier das ist TerminateApp code:

Dim hWnd As Long 
Dim nRet As Long 

Const WM_CLOSE As Long = &H10 

hWnd = FindWindow("AcrobatSDIWindow", vbNullString) 

If hWnd <> 0 Then 
    nRet = SendMessage(hWnd, WM_CLOSE, 0, 0) 
End If 

Versuchen Sie es und lassen Sie mich wissen, ob das funktioniert oder nicht.

P.S. Ich habe nur mit einem PDF open und close getestet.

+0

Perfekt, das macht den Job. Wenn zwei PDF-Dateien vorhanden sind, wird nur die Datei geschlossen, die ich zuvor in PDFExtract geöffnet habe. Aber das ist eigentlich perfekt. Vielen Dank. – Selrac

Verwandte Themen