【问题标题】:Manipulate IE with VBA and a modal form使用 VBA 和模态表单操作 IE
【发布时间】:2017-07-31 23:16:17
【问题描述】:

我正在尝试自动将 Excel 文档上传到特定网页。我无法链接它,因为它需要一个帐户。有一个带有浏览部分的表单(类型=文件,所以我不能只设置值)和一个使用该输入值的上传按钮。

我可以导航到单击浏览按钮,也可以单击上传按钮,但是当我单击浏览按钮时,会弹出一个名为“选择要上传的文件”的文件浏览器窗口,这意味着我无法与任何其他人进行交互IE 窗口并暂停我的 VBA 代码,直到它关闭,这意味着我无法自动将文件路径传递给它。

页面上的相关HTML是

<form method="post" name="uploadSkillForm" ENCTYPE="multipart/form-data"  action='uploadSkills.do?operation=upload'>        

  <tr>

</tr> 

<tr class="text1">

</tr> 


<tr width="100%">
    <td colspan="100%">
        <table width="100%">
            <tr>
                <th align="left" colspan=3 width="60%">
                    <input type="file" name="uploadedFile"  size="34" id="filePath" class="buttonStyle" style="height:20px"/>&nbsp;&nbsp;
                    <input type="button" name="upload" class="buttonStyle" value="Upload" onclick="javascript:fnUploadData()">
                </th>
            </tr>
        </table>
    </td>
</tr>

理想情况下,我只是希望能够保持 VBA 运行并与对话框交互以放入文件路径,但是任何将值设置为路径的方法都可以。

VBA 目前只是打开网页并单击按钮,因此没有必要发布它。

任何帮助将不胜感激!

【问题讨论】:

  • 很多年前我刚开始开发时就遇到了这个问题。我通过创建一个简单的程序解决了这个问题,该程序的唯一目的是监视该弹出窗口是否出现然后将其杀死。这不是最好的解决方法,但 100% 有效。希望对您有所帮助。
  • @Mickers 不会放在文件路径中吗?我是否必须从 VBA 运行脚本,并将路径作为参数,才能做到这一点?
  • 对不起,我错过了你问题的那一部分。在我看来,那个按钮只是激活了模态,而模态本身调用了一个函数并传递了文件路径。这已经很长时间了,但我记得 VBA 有一些方法可以执行 javascript。在您杀死窗口后,我会找到要调用的函数并尝试从 vba 执行该函数。抱歉,我不能提供更多帮助。
  • 经过快速搜索,我找到了一个如何从 vba vbaexpress.com/forum/… 调用 js 函数的示例。希望对您有所帮助。

标签: html excel vba internet-explorer modal-dialog


【解决方案1】:

所以经过大量挖掘后,我决定让 VBA 运行一个外部脚本来检查窗口并输入文件名,然后按 Enter。目前的问题是它专注于文件窗口,所以如果你不在正确的文件夹中它不起作用,但如果你是它会选择正确的文件并点击打开!

vba:

Dim retval As Variant
retval = Shell("PowerShell .'" & path & "upload_tester.ps1 file_name'", 1)

路径是存储的地方,upload_tester.ps1 是脚本名,file_name 是传递给脚本以输入到文件浏览器。

脚本:

param(
[Parameter(Mandatory=$true)][string]$a
)

$wshell = new-object -com wscript.shell

while(! $wshell.appactivate("Choose File to Upload")){
start-sleep -milliseconds 100
}

$wshell.appactivate("Choose File to Upload")
start-sleep -milliseconds 500;
$wshell.sendkeys($a)
$wshell.sendkeys("{ENTER}")

这将检查直到文件资源管理器窗口打开,输入文件名以匹配它,然后按 Enter 选择它。如果有人知道如何让它专注于文本框部分而不是文件浏览器部分,那就太好了,否则这符合我的目的!

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多