【问题标题】:Open Dialog IE Automation VBA打开对话框 IE 自动化 VBA
【发布时间】:2024-03-09 16:35:02
【问题描述】:

我正在尝试登录一个网站,然后上传一些照片,但我没有进一步了解。当对话框打开时,我无法以编程方式控制它。我试图将一个对象定义为FileDialog 并使用Application.SendKeys,但似乎对话框不是应用程序。

【问题讨论】:

  • 您应该将代码添加到问题中
  • 我相信您需要处理 Internet Explorer 对象而不是 FileDialog。但请先发布一些代码。

标签: vba excel automation internet-explorer-10 openfiledialog


【解决方案1】:

你好,我的代码是这样的:

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 

谢谢保罗,我今天就试试看!

最好的问候

乌达尔

【讨论】:

    【解决方案2】:

    您必须使用带有类似以下代码的浏览器对象:

    .

    Set browser = CreateObject("InternetExplorer.Application")
    
    browser.Visible = True
    
    brwser.navigate "http://*.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

    • “Sleep”使用的 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 功能的链接:

    .

    编辑您的 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 说只有 cmets 可能出现在 End Sub...”之后。

    这是一个声明,所以它必须放在模块的顶部(在任何其他函数之前)

    • 我应该写什么来代替“vbNullString”和“dialogCaption”??

    您仍然可以使用“vbNullString”作为第一个参数,但您必须将“dialogCaption”替换为对话框的标题

    • 不要为 vbNullString 使用引号
    • 请在对话框标题中使用引号

    【讨论】:

    • 我应该写什么来代替“vbNullString”和“dialogCaption”??
    • 我在使用该功能时出现错误。 64位系统的代码必须更新的东西
    • 当我复制函数时,VBA 说只有 cmets 可能出现在 End Sub、End Function 和 End Property 之后我应该将它粘贴到哪里?
    • 谢谢大家的功能,但现在当我尝试时出现错误:findwindow 在应用程序启动之前“需要对象”
    • 你可能不得不让代码等到你的对话框弹出;你可以使用我前面提到的“睡眠”API