【发布时间】:2021-07-27 03:45:24
【问题描述】:
你好 Stacked Overflow 社区,
以前有人问过这个问题,但没有涉及到一个特定的元素; 自动化通过 VBS
- 总而言之,我希望每天自动下载一个文件
- 有一个已知的用户名和密码
- 下载文件来自一个没有关联 URL 的实际按钮 (HTMLButton.Click)
- 我正在使用 SendKeys 执行保存文件操作以通过“您要打开还是保存文件”窗口
- 在宏中执行时一切正常(从 Excel 运行);
- 但是,我希望它能够与 Windows 任务计划程序一起运行,并且我已经编写了一个批处理文件,该批处理文件调用了上述的 Visual Basic 脚本,当然在第 4 步中中断
批号:
@echo off
echo Success! Code ALG_Excel_01 %date:~-10,2%.%date:~-7,2%.%date:~-2,2% ^& %time:~0,8% >> "C:\Users\dchacon\Desktop\ALG_DCCS02\Logs_DCCS02.txt"
cscript C:\Users\dchacon\Desktop\ALG_DCCS02\ALG_Excel_01.vbs
timeout 7
exit
VBS 代码:
Dim objExcel, objWB
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWB = ObjExcel.Workbooks.Open("C:\Users\dchacon\Desktop\ALG_DCCS02\ALG_Triple_Check.xlsm")
ObjWB.Application.Run("ExportSequence")
objExcel.DisplayAlerts = False
'Set ObjExcel = Nothing
objExcel.ActiveWorkbook.Save
objExcel.ActiveWorkbook.Close
objExcel.Application.Quit
'WScript.Echo "Finished."
'WScript.Quit
VBA 代码:
Sub ExportSequence()
Dim ie As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLLogin As MSHTML.IHTMLElement
Dim HTMLPassword As MSHTML.IHTMLElement
Dim HTMLButton As MSHTML.IHTMLElement
Dim HTMLFrom As MSHTML.IHTMLElement
Dim HTMLTo As MSHTML.IHTMLElement
Dim HTMLJob As MSHTML.IHTMLElement
Dim HTMLName As MSHTML.IHTMLElement
Dim URL As String
URL = "https://Vendor_Website.com/login.aspx"
ie.Visible = True
ie.navigate URL
Do While ie.ReadyState <> ReadyState_Complete
Loop
Set HTMLDoc = ie.Document
Set HTMLLogin = HTMLDoc.getElementById("ctl00$ContentPlaceHolder1$uxAlgLogin$txtUserName")
Set HTMLPassword = HTMLDoc.getElementById("ctl00$ContentPlaceHolder1$uxAlgLogin$txtPassword")
HTMLLogin.Value = "UserName"
HTMLPassword.Value = "Password"
Set HTMLButton = HTMLDoc.getElementById("ContentPlaceHolder1_uxAlgLogin_lnkLogin")
HTMLButton.Click
Do While ie.ReadyState <> ReadyState_Complete
Loop
Application.Wait (Now + TimeValue("0:00:03"))
'****New Logic**********
Set HTMLFrom = HTMLDoc.getElementById("ContentPlaceHolder1_txtPoolDateStart")
Set HTMLTo = HTMLDoc.getElementById("ContentPlaceHolder1_txtPoolDateEnd")
Set HTMLJob = HTMLDoc.getElementById("ContentPlaceHolder1_txtJobNum")
Set HTMLName = HTMLDoc.getElementById("ContentPlaceHolder1_txtJobName")
Application.Wait (Now + TimeValue("0:00:02"))
HTMLFrom.Value = "1/01/2021"
HTMLTo.Value = "7/30/2021"
'HTMLJob.Value = str_Job
'HTMLName.Value = str_Name
'***Search Button****
Set HTMLButton = HTMLDoc.getElementById("btnSearch")
HTMLButton.Click
Do While ie.ReadyState <> ReadyState_Complete
Loop
'***Export Button Sequence***
Set HTMLButton = HTMLDoc.getElementById("ContentPlaceHolder1_btnExport")
HTMLButton.Click
Application.Wait (Now + TimeValue("0:00:08"))
'Debug.Print ie.ReadyState, ie.Application, ie.Document, ie.Container
'Application.SendKeys "%{S}"
SendKeys "%S"
'Call Download
End Sub
我同时输入了 Do while ReadyState_Complete 和 Application.Wait,我知道这是多余的,但代码在整个过程中运行良好。最大的问题是当我通过 VBS 调用代码时,我似乎无法正常工作的 SendKeys "%S"。只要它可以通过 VBS 工作就可以了,因为我知道批处理触发器会很好地执行;我只是想为什么不包含它并分享我认为实际上非常酷的代码。我尝试过尝试调用和更改前景窗口,但无济于事。任何帮助表示赞赏。
【问题讨论】:
-
很好的解释,但你忘了一件事。定时任务是如何配置的?
-
任务正在运行;我触发批处理文件没有问题,每次使用
echo Success!Line 从批处理执行代码时,我都会写入日志 -
任务调度程序会话的 MS 应用程序执行可能存在一些问题。使用这个solution "create Desktop"
-
非常有趣的链接 @Daemon-5 我在通过非交互式用户运行 MS Excel 之前遇到了问题;但是,我正在与当前用户一起运行任务计划程序以避免这些问题。也许我应该在我的原始陈述中进一步澄清,但问题是 VBS 调用 Excel 宏时。并且整个宏执行,只是我不知道如何指向 Internet Explorer 应用程序并强制它保存文档。所以要么我需要 VBS 或 VBA 中的代码,它直接与强制应用程序保存文件有关。
标签: excel vba batch-file vbscript scheduled-tasks