2016-06-24 4 views
1

Я пытаюсь сохранить PDF-файл. С приведенным ниже кодом я должен изменить имя файла, но затем после команды SendMessageByString hWnd, WM_SETTEXT, Len(Sample), Sample диалоговое окно теряет фокус, а затем я не могу сохранить файл.Невозможно написать имя файла и одновременно нажать кнопку «Сохранить» ... Код VBA

Файл: enter image description here

Из Интернета. Я попытался загрузить прямо из URL-адреса, но он не работает.

Команда:

timeout = Now + TimeValue("00:00:20") 
    Do 
    hWnd = FindWindow(vbNullString, "Save As") 'Finding the save as window 
    DoEvents 
    Sleep 200 
    Loop Until hWnd Or Now > timeout 

утра с помощью получить дескриптор диалогового окна для. Если я пишу ту же команду после

SendMessageByString hWnd, WM_SETTEXT, Len(Sample), Sample 

Я могу получить фокус диалогового окна, но команда не сохраняет файл с именем измененного файла. Это экономит как оригинальное название OnlineStmtResultsPremDis.Do который выглядит как enter image description here

Как изменить имя файла и сохранить PDF-файл.

Мой код: **** Навигация через веб-страницу **** затем

Do While IE.Busy Or IE.ReadyState <> 4: Loop 
     Application.Wait (Now + TimeValue("00:0:03")) 
     IE.Navigate "https://www..com/CWRWeb/OnlineStmtResultsPremDis.do" 'Final PDF 
     Application.Wait (Now + TimeValue("00:0:18")) 
     Set HTMLDoc5 = IE.document 
     Application.SendKeys "+^{S}" 'Save Key ShortCut 
     Application.Wait (Now + TimeValue("00:0:03")) 

     'Finding the Save As Dialog Box 

     timeout = Now + TimeValue("00:00:20") 
     Do 
     hWnd = FindWindow(vbNullString, "Save As") 'Finding the save as window 
     DoEvents 
     Sleep 200 
     Loop Until hWnd Or Now > timeout 

     If hWnd Then 

     SetForegroundWindow hWnd 

     'Find the child DUIViewWndClassName window 

     hWnd = FindWindowEx(hWnd, 0, "DUIViewWndClassName", vbNullString) 

    End If 


     If hWnd Then 

     'Find the child DirectUIHWND window 

     hWnd = FindWindowEx(hWnd, 0, "DirectUIHWND", "") 

    End If 

    If hWnd Then 

     'Find the child FloatNotifySink window 

     hWnd = FindWindowEx(hWnd, 0, "FloatNotifySink", "") 

    End If 

     'If hWnd Then 
     'hWnd = FindWindowEx(hWnd, 0, "ComboBox", vbNullString) 'Child Combo Box 
     'End If 


     If hWnd Then 
     hWnd = FindWindowEx(hWnd, 0, "ComboBox", "") 'Child Combo Box 

     End If 

     If hWnd Then 
     SetForegroundWindow (hWnd) 'Chilf Edit Window 
     Sleep 600 
     hWnd = FindWindowEx(hWnd, 0, "Edit", "") 'Child Combo Box 

     End If 


     Sample = "80287.pdf" 'Misc. need to delete 

     If hWnd Then 
     SetForegroundWindow (hWnd) 'changing the folder name 
     Sleep 600 
     SendMessageByString hWnd, WM_SETTEXT, Len(Sample), Sample 
     End If 


     'Do 
     'hWnd = FindWindow(vbNullString, "Save As") 'Finding the save as window 
     'DoEvents 
     'Sleep 200 
     'Loop Until hWnd Or Now > timeout 

     If hWnd Then 
     SetForegroundWindow (hWnd) 
     hWnd = FindWindowEx(hWnd, 0, "Button", "&Save") 'Finding the Save button on the window 
     End If 

     If hWnd Then 
     SetForegroundWindow (hWnd) 'Click on the Save As window 
     Sleep 600 
     SendMessage hWnd, BM_CLICK, 0, 0 
     End If 

     End Sub 

Декларация:

Option Explicit 

Public Declare PtrSafe Sub Sleep Lib "kernel32" _ 
    (ByVal dwMilliseconds As Long) 


Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Public Declare PtrSafe Function FindWindowEx Lib "user32" _ 
            Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _ 
            ByVal lpsz1 As String, ByVal lpsz2 As String) As Long 

Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, _ 
                  ByVal wParam As LongPtr, lParam As Any) As LongPtr 

Public Declare PtrSafe Function SetForegroundWindow Lib "user32" _ 
    (ByVal hWnd As Long) As LongPtr 


Public Declare PtrSafe Function SendMessageByString Lib "user32" Alias "SendMessageA" _ 
    (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As LongPtr 


Public Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" _ 
    (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPtr 


Public Declare PtrSafe Sub keybd_event Lib "user32" _ 
    (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) 



    Public Const BM_CLICK = &HF5 
    Public Const WM_SETTEXT = &HC 
    Public Const WM_GETTEXT = &HD 
    Public Const WM_GETTEXTLENGTH = &HE 

    Public Const VK_KEYDOWN = &H0 
    Public Const VK_KEYUP = &H2 
    Public Const VK_CONTROL = &H11 
+0

Я не понимаю, как вы доберетесь до окна «Сохранить как». Вы делаете это вручную или звоните в SaveAs где-то? –

+0

Application.SendKeys "+^{S}" .... используя этот короткий ключ ctrl + shift + s – Shank

+0

Возможно, вам стоит попробовать [Как загрузить файл с помощью VBA] (http://stackoverflow.com/questions/ 17877389/как-делать-я-загрузка-а-файлы с помощью-VBA-без интернет-исследователь). – BitAccesser

ответ

0

Так что я изменил код, чтобы добавить PostMessage в то время как фокус on Edit Box: код работает, но я не знаю, как ....

If hWnd Then 
    'SetForegroundWindow (hWnd) 'changing the folder name 
    'Sleep 200 
    SendKeys "{BACKSPACE}" 
    Sleep 200 
    For x = 1 To Len(Sample) 
    lngPM = PostMessage(hWnd, WM_SETTEXT, Asc(Mid(Sample, x, 1)), 1&) 
    Sleep 200 
    Next x 
Sleep 200 
    SendMessageByString hWnd, WM_SETTEXT, Len(Sample), Sample 
    End If 

    Application.Wait (Now + TimeValue("00:0:03")) 

Я использую 32-битную версию Ms exce l 2016 Ms Office ... windows 7 64 bit ... полный код:

Do 
    hWnd = FindWindow("#32770", "Save As") 'Finding the save as window 
    DoEvents 
    Sleep 200 
    Loop Until hWnd Or Now > timeout 

    If hWnd Then 

    'SetForegroundWindow hWnd 

    'Find the child DUIViewWndClassName window 

    hWnd = FindWindowEx(hWnd, 0, "DUIViewWndClassName", vbNullString) 

End If 


    If hWnd Then 

    'Find the child DirectUIHWND window 

    hWnd = FindWindowEx(hWnd, 0, "DirectUIHWND", "") 

End If 

If hWnd Then 

    'Find the child FloatNotifySink window 

    hWnd = FindWindowEx(hWnd, 0, "FloatNotifySink", "") 

End If 

    'If hWnd Then 
' hWnd = FindWindowEx(hWnd, 0, "ComboBoxEx32", vbNullString) 'Child Combo Box 
    'End If 


    If hWnd Then 
    hWnd = FindWindowEx(hWnd, 0, "ComboBox", "") 'Child Combo Box 
    End If 

    If hWnd Then 
    SetForegroundWindow (hWnd) 'Chilf Edit Window 
    Sleep 600 
    hWnd = FindWindowEx(hWnd, 0, "Edit", "") 'Child Combo Box 
    End If 


    Filename1 = Cells(I, 2).Value 
    Filename2 = Cells(I, 3).Value 
    Sample = "D:\Test\" & Filename1 & "_" & Filename & "_" & Filename2 & ".pdf" 'CHANGE : FILE NAME 
    If hWnd Then 
    'SetForegroundWindow (hWnd) 'changing the folder name 
    'Sleep 200 
    SendKeys "{BACKSPACE}" 
    Sleep 200 
    For x = 1 To Len(Sample) 
    lngPM = PostMessage(hWnd, WM_SETTEXT, Asc(Mid(Sample, x, 1)), 1&) 
    Sleep 200 
    Next x 
Sleep 200 
    SendMessageByString hWnd, WM_SETTEXT, Len(Sample), Sample 
    End If 

    Application.Wait (Now + TimeValue("00:0:03")) 

    Do 
    hWnd = FindWindow(vbNullString, "Save As") 'Finding the save as window 
    DoEvents 
    Sleep 200 
    Loop Until hWnd Or Now > timeout 

    If hWnd Then 
    'SetForegroundWindow (hWnd) 
    hWnd = FindWindowEx(hWnd, 0, "Button", "&Save") 'Finding the Save button on the window 
    End If 

    If hWnd Then 
    'SetForegroundWindow (hWnd) 'Click on the Save As window 
    Sleep 600 
    SendMessage hWnd, BM_CLICK, 0, 0 
    End If 
Label1: 
     IE.Quit 
     Application.Wait (Now + TimeValue("00:0:10")) 
     I = I + 1 
     Loop 
     End Sub 

 Смежные вопросы

  • Нет связанных вопросов^_^