VBA:IE-如何在没有弹出文件上传表单的情况下将路径名分配给文件输入标签?

时间:2016-01-15 03:20:31

标签: windows vba excel-vba internet-explorer automation

我目前正在进行文件上传自动化

以下是输入文件标记的HTML标记:

 <input name="file" title="Type the path of the file or click the Browse button to find the file." id="file" type="file" size="20">

以下是按钮HTML标记:

<input name="Attach" title="Attach File (New Window)" class="btn" id="Attach" onclick="javascript:setLastMousePosition(event); window.openPopup('/widg/uploadwaiting.jsp', 'uploadWaiting', 400, 130, 'width=400,height=130,resizable=no,toolbar=no,status=no,scrollbars=no,menubar=no,directories=no,location=no,dependant=no', true);" type="submit" value="Attach File">

我的VBA编码是:

Dim filee As Object
Set filee = mydoc.getElementById("file")
filee.Value = filenamepath

Set attach = mydoc.getElementsByName("Attach")
attach(0).Click

当我运行此编码时,输入文件路径框不会分配路径名,所以我选择了文件路径。

查找附加截图。 enter image description here

最后我尝试了以下代码,但发送密钥没有执行

Dim filee As Object
    Set filee = mydoc.getElementById("file")
    filee.Click

obj.SetText filename
obj.PutInClipboard
SendKeys "^v"
SendKeys "{ENTER}"

Set attach = mydoc.getElementsByName("Attach")
    attach(0).Click

Set finall = mydoc.getElementsByName("cancel")
    finall(0).Click

请告诉我windows API程序在打开的精细名称输入框中指定我的文件名目录选择要打开的文件资源管理器,然后点击打开按钮。

3 个答案:

答案 0 :(得分:6)

我通过运行外部VBScript包含文件路径来修复此问题,在发送Enter键后使用SendKeys方法将其设置为“选择要上载的文件”弹出窗口,关闭此弹出窗口,这样运行成功,因为extranl VBScript运行另一个过程因此它不会停留在VBA代码上。

注意: 1-我从VBA代码动态创建外部VBScript并将其保存在Temp文件夹之后我使用WScript.Shell.Run运行此脚本以在另一个线程上执行它 1-在外部VBScript开始时,我设置1秒延迟,以确保已从VBA打开的“选择要上载的文件”弹出窗口。

这是完整的代码:

....
....

Set filee = mydoc.getElementById("file")

    CompleteUploadThread MyFilePath
    filee.Foucs
    filee.Click

....
....

Private Sub CompleteUploadThread(ByVal fName As String)
    Dim strScript As String, sFileName As String, wsh As Object
    Set wsh = VBA.CreateObject("WScript.Shell")
    '---Create VBscript String---
    strScript = "WScript.Sleep 1000" & vbCrLf & _
                "Dim wsh" & vbCrLf & _
                "Set wsh = CreateObject(""WScript.Shell"")" & vbCrLf & _
                "wsh.SendKeys """ & fName & """" & vbCrLf & _
                "wsh.SendKeys ""{ENTER}""" & vbCrLf & _
                "Set wsh = Nothing"
    '---Save the VBscript String to file---
    sFileName = wsh.ExpandEnvironmentStrings("%Temp%") & "\zz_automation.vbs"
    Open sFileName For Output As #1
    Print #1, strScript
    Close #1
    '---Execute the VBscript file asynchronously---
    wsh.Run """" & sFileName & """"
    Set wsh = Nothing
End Sub

答案 1 :(得分:1)

由于安全原因禁用了设置文件输入元素的值,“发送密钥”方法似乎是使用IE API自动上传文件的唯一选项。

我偶然发现同样的问题,即Click之后的代码似乎没有被执行 - 也就是说,除非关闭对话框。这表明Click方法正在阻塞,因此无法与宏内的对话框进行交互。

我可以通过使用其他方法打开对话框来解决这个问题:将焦点设置为Focus的文件元素,然后使用SendKeys发送空格键。

在您的情况下,请替换

filee.Click

filee.Focus
SendKeys " "

答案 2 :(得分:0)

leemes的方法(向IE上的文件选择按钮发送密钥)是自动执行文件选择过程的简便方法。

此外,如果IEObject.Visible有时无法将焦点放在IE窗口上,  我们最好先使用Windows API将IE窗口发送到最高位置,然后再使用“ SendKeys”,如下所示:

#If VBA7 Then
    Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As LongPtr
#Else
    Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
#End If

Sub Test()

   'first create or get IE object
   Set IE= ...
   ...

   'second, send IE window to the foreground
   Dim TargetWnd
   TargetWnd = FindWindow("IEFrame", vbNullString)  'find IE window
   If TargetWnd = 0 Then Debug.Print "Window not found." 'Else Debug.Print TargetWnd
   SetForegroundWindow (TargetWnd)

   'sendkeys
   set filee = getElement....
   filee.Focus
   SendKeys " "     'send Space key instead of .Click method
   SendKeys "filePath"     ' "C:\path\filename"  ' Type-in the filename 
   SendKeys "{Enter}"    'closes the file dialog

   'finally submit       
   ...
   ...

end Sub