Я пытаюсь войти в веб-сайт, а затем загрузить несколько фотографий, но я не буду дальше. Когда откроется диалоговое окно, я не могу программно его контролировать. Я попытался определить объект как FileDialog
, а также использовать Application.SendKeys
, но кажется, что диалог не является приложением.Open Dialog IE Automation VBA
ответ
Вы должны будете использовать объект браузера с кодом похожее на это:
.
Set browser = CreateObject("InternetExplorer.Application")
browser.Visible = True
brwser.navigate "http://stackoverflow.com/..." 'your address
Sleep 1000 'wait for 1 second
With browser.Document
Set txtUsr = .getElementsByName("Username")
Set txtPass = .getElementsByName("UserPass")
Set btnLogin = .getElementById("btnLogin")
End With
txtUsr.innerText = "User Name"
txtPass.innerText = "Password"
btnLogin.Click
.
и так далее ...
Использование DOM и попытаться избежать SendKeys, если это возможно
«Сон» использует API, который может быть объявлен в верхней части модуля, как это :
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
.
Редактировать: Я заметил, что вы на самом деле пытаетесь взаимодействовать с диалоговым окном, а не с страницей браузера. Если это так, вам нужно будет использовать функции Windows API, чтобы иметь возможность сначала идентифицировать его из VBA; Я предложил бы использовать "FindWindow":
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (_
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long
и вызывать его из VBA, как это:
setMyDialog = FindWindow(vbNullString, dialogCaption)
затем отправить ключи к нему; вы можете отправить клавишу «Tab», чтобы перейти от одного текстового поля к следующему
Если веб-сайт использует это диалоговое окно для выбора нескольких изображений, это будет сложнее автоматизировать; вам придется использовать другие методы записи, чтобы имитировать выбор нескольких файлов или действия перетаскивания и падение с помощью мыши
Вот некоторые ссылки, которые могут помочь с функциями API:
- How To Get a Window Handle Without Specifying an Exact Title (microsoft.com)
- API Declarations for VB and VBA (microsoft.com)
- stackoverflow.com/questions/25098263/ (Как использовать FindWindow)
.
Редактировать для 3 вопроса:
- «Я получаю сообщение об ошибке, когда я использую функцию Что-то с 64-битной системой ....» - у вас есть 64 разрядной версия Excel так заменить это заявление
.
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (_
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long
с этим:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (_
ByVal lpClassName As String, _
ByVal lpWindowName As String
) As LongPtr
.
- «Когда я скопировать функцию VBA говорит, что только комментарии могут появиться после End Sub ...»
Это заявление, поэтому он должен быть размещен в верхней части модуля (до любой другие функции)
- Что следует писать вместо «vbNullString» и «dialogCaption» ??
Вы все еще можете использовать «vbNullString» в качестве первого аргумента, но вы должны заменить «dialogCaption» с названием вашего диалогового окна
- не используют кавычки для vbNullString
- используем кавычки для заголовка диалогового
Что я должен писать вместо «vbNullString» и «dialogCaption» ?? – Udarnicus
Я получаю сообщение об ошибке при использовании функции. Что-то с 64-битной системой, что код должен быть обновлен – Udarnicus
Когда я копирую функцию VBA говорит, что после End Sub, End Function и End Property могут появляться только комментарии. Где я должен вставлять ее? – Udarnicus
Привет мой код выглядит так:
1.I define an obj as internetexplorer.aplication
2.I login and then I want to upload a photo so I click the button for upload
' all works till now
3.Now I try to interact with the dialog that let's me to choose the photos programmatically and their is my problem
Спасибо, Пол, я попробую сегодня!
С наилучшими пожеланиями
Удар
вы должны добавить код на вопрос – 0m3r
я считаю, вы должны работать на объекте браузера Internet Explorer, а не FileDialog. Но сначала отправьте код. – nhee