使用 vbscript 将宏设置为 运行 时无法保存结果
Macro unable to save results when it is made to run using vbscript
我创建了一个宏来从网页上抓取帖子的标题。当我手动尝试时,宏 运行 没问题。
但是,我的意图是 运行 并使用 .vbs
文件保存结果通过 .bat
文件执行,以便我最终可以通过 windows task scheduler
.[=23= 使用它]
当我点击这个 .bat
文件来检查它是否有效时,它确实打开了那个宏使用 .vbs
并按照预期抓取内容。
我面临的唯一问题是我做不到 .vbs
文件将结果保存在该工作簿中。如何保存结果?*
.vbs
包含:
RunMacro
Sub RunMacro()
Dim xl, path, xlBook
path = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".")
Set xl = CreateObject("Excel.application")
Set xlBook = xl.Workbooks.Open(path & "\basicScraper.xlsm", 0, True)
xl.Application.Visible = False
xl.DisplayAlerts = False
xl.Application.Run "basicScraper.xlsm!MyMacro.GetPosts"
xl.ActiveWorkbook.Save
xl.ActiveWindow.Close
End Sub
.bat
包含:
cscript macro.vbs "C:\Users\WCS\Desktop\vba scheduler\macro.vbs"
这是我正在使用的宏(模块名称:MyMacro
):
Sub GetPosts()
Dim S$, r&, post As Object
With New XMLHTTP
.Open "GET", "https://whosebug.com/questions", False
.send
S = .responseText
End With
With New HTMLDocument
.body.innerHTML = S
For Each post In .getElementsByClassName("question-hyperlink")
r = r + 1: Cells(r, 1) = post.innerText
Next post
End With
End Sub
@robots.txt
您想使用 Windows 任务计划程序,创建一个调用 .vbs
的任务
.vbs 应该看起来像
Set XLObj = CreateObject("Excel.Application")
XLObj.visible = true
XLObj.Workbooks.Open "T:\he\path\to\basicScraper.xlsm"
XLObj.Run "'T:\he\path\to\basicScraper.xlsm'!MyMacro.GetPosts"
XLObj.quit
set XLObj = nothing
如果我正确理解了您的代码,您尝试将每个 link 的内部文本插入到一些单元格中:尝试指定您要放置它的确切位置(例如工作表“(第 1 册”)。单元格(r, 1)).
Dim xHttp As MSXML2.XMLHTTP
Dim hDoc As MSHTML.HTMLDocument
Dim objCollection As Object
Dim objElement As Object
Dim strLink As String
Set xHttp = New MSXML2.XMLHTTP
xHttp.Open "GET", "https://whosebug.com/questions", False
xHttp.send
Do Until xHttp.READYSTATE = 4
DoEvents
Loop
If xHttp.Status = 200 Then
Set hDoc = New MSHTML.HTMLDocument
hDoc.body.innerHTML = xHttp.responseText
Set objCollection = hDoc.getElementsByClassName("question-hyperlink")
For Each objElement In objCollection
strLink = objElement.InnerText
Worksheets("Book 1").Cells(r, 1) = strLink
r = r + 1
Next
End If
ActiveWorkbook.Save
您应该在第 1 册第 1 行到第 n 行中找到您的结果。
找到解决办法了!!!
The .bat
file should contain:
@echo off
echo %~dp0
cd /d %~dp0
"C:\Users\WCS\Desktop\New folder\macro.vbs" "C:\Users\WCS\Desktop\New folder\basicScraper.xlsm"
And the .vbs
file should contain:
Dim xl, args
Set args = Wscript.Arguments
Set xl = CreateObject("Excel.application")
xl.Workbooks.Open args(0)
xl.Application.Visible = False
xl.Application.Run "GetPosts"
xl.ActiveWorkbook.Save
xl.ActiveWorkbook.Close
xl.Quit
The basicScraper.xlsm
should be as it is. That's it.
现在,把.bat
的完整地址
文件的位置到调度程序 program/script
inputbox in Action
选项卡就可以了。
Post 脚本:我在执行前将所有三个文件 .bat
、.vbs
和 .xlsm
保存在一个文件夹中,并得到了预期的结果。
我创建了一个宏来从网页上抓取帖子的标题。当我手动尝试时,宏 运行 没问题。
但是,我的意图是 运行 并使用 .vbs
文件保存结果通过 .bat
文件执行,以便我最终可以通过 windows task scheduler
.[=23= 使用它]
当我点击这个 .bat
文件来检查它是否有效时,它确实打开了那个宏使用 .vbs
并按照预期抓取内容。
我面临的唯一问题是我做不到 .vbs
文件将结果保存在该工作簿中。如何保存结果?*
.vbs
包含:
RunMacro
Sub RunMacro()
Dim xl, path, xlBook
path = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".")
Set xl = CreateObject("Excel.application")
Set xlBook = xl.Workbooks.Open(path & "\basicScraper.xlsm", 0, True)
xl.Application.Visible = False
xl.DisplayAlerts = False
xl.Application.Run "basicScraper.xlsm!MyMacro.GetPosts"
xl.ActiveWorkbook.Save
xl.ActiveWindow.Close
End Sub
.bat
包含:
cscript macro.vbs "C:\Users\WCS\Desktop\vba scheduler\macro.vbs"
这是我正在使用的宏(模块名称:MyMacro
):
Sub GetPosts()
Dim S$, r&, post As Object
With New XMLHTTP
.Open "GET", "https://whosebug.com/questions", False
.send
S = .responseText
End With
With New HTMLDocument
.body.innerHTML = S
For Each post In .getElementsByClassName("question-hyperlink")
r = r + 1: Cells(r, 1) = post.innerText
Next post
End With
End Sub
@robots.txt 您想使用 Windows 任务计划程序,创建一个调用 .vbs
的任务.vbs 应该看起来像
Set XLObj = CreateObject("Excel.Application")
XLObj.visible = true
XLObj.Workbooks.Open "T:\he\path\to\basicScraper.xlsm"
XLObj.Run "'T:\he\path\to\basicScraper.xlsm'!MyMacro.GetPosts"
XLObj.quit
set XLObj = nothing
如果我正确理解了您的代码,您尝试将每个 link 的内部文本插入到一些单元格中:尝试指定您要放置它的确切位置(例如工作表“(第 1 册”)。单元格(r, 1)).
Dim xHttp As MSXML2.XMLHTTP
Dim hDoc As MSHTML.HTMLDocument
Dim objCollection As Object
Dim objElement As Object
Dim strLink As String
Set xHttp = New MSXML2.XMLHTTP
xHttp.Open "GET", "https://whosebug.com/questions", False
xHttp.send
Do Until xHttp.READYSTATE = 4
DoEvents
Loop
If xHttp.Status = 200 Then
Set hDoc = New MSHTML.HTMLDocument
hDoc.body.innerHTML = xHttp.responseText
Set objCollection = hDoc.getElementsByClassName("question-hyperlink")
For Each objElement In objCollection
strLink = objElement.InnerText
Worksheets("Book 1").Cells(r, 1) = strLink
r = r + 1
Next
End If
ActiveWorkbook.Save
您应该在第 1 册第 1 行到第 n 行中找到您的结果。
找到解决办法了!!!
The
.bat
file should contain:
@echo off
echo %~dp0
cd /d %~dp0
"C:\Users\WCS\Desktop\New folder\macro.vbs" "C:\Users\WCS\Desktop\New folder\basicScraper.xlsm"
And the
.vbs
file should contain:
Dim xl, args
Set args = Wscript.Arguments
Set xl = CreateObject("Excel.application")
xl.Workbooks.Open args(0)
xl.Application.Visible = False
xl.Application.Run "GetPosts"
xl.ActiveWorkbook.Save
xl.ActiveWorkbook.Close
xl.Quit
The
basicScraper.xlsm
should be as it is. That's it.
现在,把.bat
的完整地址
文件的位置到调度程序 program/script
inputbox in Action
选项卡就可以了。
Post 脚本:我在执行前将所有三个文件 .bat
、.vbs
和 .xlsm
保存在一个文件夹中,并得到了预期的结果。