我相信我需要调用javascript方法而不是尝试触发按钮。我尝试了以下示例,我认为我的问题是我不知道应该使用哪些代码部分.. Click button or execute JavaScript function with VBA以及此http://www.vbaexpress.com/forum/showthread.php?9690-Solved-call-a-javascript-function和http://www.vbforums.com/showthread.php?650771-RESOLVED-How-to-Call-a-JavaScript-function-From-Visual-Basic-6-WITH-wanted-parameters
我无法发布链接,因为它需要登录才能访问它...如果您需要更大的代码示例来理解我的问题,请告诉我。
我相信我需要一个引用“导出为CSV”的函数,但我不确定要调用哪个函数以及要在调用中包含哪些函数...以下是来自catalog.js
function()
{var a=window.Ext4||window.Ext;a.define ("Rally.alm.ui.page.plugins.PageToolFactory",{singleton:true,mixins: {messageable:Rally.Messageable},PRINT:"PRINT",IMPORT:"IMPORT",EXPORT:"EXPORT",ge t:function(c,b)
{var d=[];
if(this._shouldHaveRowAction(this.PRINT,c))
{
if(b.getPlugin("printplugin"))
{
d.push({text:"Print...",handler:b.getPlugin("printplugin").print,cls:"page- tools",scope:b.getPlugin("printplugin"),addInteractionClass:true})}}
if(this._shouldHaveRowAction(this.IMPORT,c))
{
if(b.getPlugin("printplugin"))
{
d.push({text:"Import User Stories...",handler:a.emptyFn})}}
if(this._shouldHaveRowAction(this.EXPORT,c))
{
if(b.getPlugin("printplugin"))
{
d.push({text:"Export as CSV",handler:a.emptyFn})}} return d}
下一个样本来自yui.js ...
(function()
{
RALLY.ui.menu.AvailablePageTools=Ext.extend(Object, {constructor:function()
{
this.PRINT={text:'Print...',slug:'print'};
this.EMAIL={text:'Email...',slug:'email'};
this.SAVE={text:'Save...',slug:'save'};
this.CSV_IMPORT={text:'Import User Stories...',slug:'csvimport'};
this.CSV_IMPORT_PORTFOLIO_ITEM={text:'Import Portfolio Items...',slug:'csvimport'};
this.CSV_EXPORT={text:'Export as CSV',slug:'csvexport'};
this.PDF_EXPORT={text:'Export as PDF',slug:'pdfexport'};
我在我的vba脚本中试过这些选项..
Dim objIE As SHDocVw.InternetExplorer 'microsoft internet controls (shdocvw.dll)
Dim htmlDoc As MSHTML.HTMLDocument 'Microsoft HTML Object Library
Dim htmlInput As MSHTML.HTMLInputElement
Dim htmlColl As MSHTML.IHTMLElementCollection
Dim CurrentWindow As HTMLWindowProxy
'Set objIE = Nothing
Set objIE = New SHDocVw.InternetExplorer
ThisWorkbook.Worksheets("Sheet1").Activate
With objIE
.navigate "website"
.Visible = 1
Do While .readyState <> 4: DoEvents: Loop
Application.Wait (Now + TimeValue("0:00:02"))
Set htmlDoc = .document
objIE.document.all.Item
'Set CurrentWindow = objIE.htmlDoc.parentWindow
'no error no export
'Call objIE.document.parentWindow.execScript("_exportHandler:Function()", "JavaScript")
'no error no export
'Call objIE.document.parentWindow.execScript("_getExportItems:Function()", "JavaScript")
'RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
'Call objIE.document.parentWindow.execScript("_a.define()", "JavaScript")
'run time error the object invoked has disconnected from its clients,
'RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
'Call objIE.document.parentWindow.execScript("_b.push()", "JavaScript")
'run time error the object invoked has disconnected from its clients,
'RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
'Call objIE.document.parentWindow.execScript("handler:function(){window.location=Rally.ui.grid.GridExport.buildCsvExportUrl(this.gridboard.getGridOrBoard())}", "JavaScript")
'Call objIE.document.parentWindow.execScript("b.push()", "JavaScript")
'Call objIE.document.parentWindow.execScript("c.push()", "JavaScript")
'RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
'Call objIE.document.parentWindow.execScript("this.CSV_Export()", "JavaScript")
'error the remote server machine does not exist or is unavailable
'Call objIE.document.parentWindow.execScript("constructor:function()", "JavaScript")
'Call objIE.document.parentWindow.execScript("constructor:function()", "JavaScript")
'object
Call CurrentWindow.execScript("d.push({text:CHR(34)Export as CSV CHR(34),handler:a.emptyFn})")
'ofile.SaveAs scrapeRally:=ofile.Name
'ofile.Close savechanges:=False
'objIE.Quit
Set objIE = Nothing
End With
End Sub
我试图从VBA运行它,所以我不能使用var ...
Dim getFunction = "get:function (_shouldhaverowaction(this.export,C)),(b.getPlugin(chr(34)printplugin chr(34)))"
Dim exportNow
eval ("exportNow = new" + getFunction + ";")
我也试过
Call objIE.HTMLDocument.eval("get:function (_shouldhaverowaction(this.export,C)),(b.getPlugin( chr(34) printplugin chr(34)))", "JavaScript")
当我尝试运行它时,我得到“该对象不支持此属性或方法”错误。
任何建议都会非常棒。
我刚刚遇到了另一个可能是我想要的功能,但我仍然不知道我应该用它来调用哪一部分。我试图只调用_getExportItems:function()但由于错误80020101(评估js时出错)我得到RUN TIME ERROR无法完成操作
_getExportItems:function(){
var b=[];
if(this.enableCsvExport){
b.push({
text:"Export to CSV...",
handler:function(){
window.location=Rally.ui.grid.GridExport.buildCsvExportUrl (this.gridboard.getGridOrBoard())},scope:this})}
答案 0 :(得分:1)
这里使用execScript
对象的window
方法的简单示例。它调用名为myFunc
和myFuncWithParams
的全局函数。 代码已使用IE 11进行测试。
Option Explicit
Private Const Url As String = "c:\Temp\evalExample.html"
Public Sub Test()
Dim objIE As SHDocVw.InternetExplorer
Dim currentWindow As HTMLWindowProxy
Set objIE = New SHDocVw.InternetExplorer
objIE.navigate Url
objIE.Visible = 1
Do While objIE.readyState <> 4
DoEvents
Loop
Set currentWindow = objIE.document.parentWindow
' Here the function without parameters is called.
currentWindow.execScript code:="myFunc()"
' Here the function with parameters is called.
' First parameter is numeric, then string, then boolean and finally object.
' The object has three properties, numeric, string and array.
currentWindow.execScript code:="myFuncWithParams(123, 'Some text', true, { property1: 555, property2: 'hi there from object', property3: [111,222,333] })"
' And here function which receives parameters and returns value.
' The return value is then available through hidden property of document named 'Script'.
' Thanks to this answer: https://stackoverflow.com/questions/9005914/retrieve-return-value-of-a-javascript-function-in-the-webbrowser-control-in-vb6
currentWindow.execScript code:="func = function(){return myFuncReturns(2,3);}; retVal = func();"
Dim result As Long
result = objIE.document.Script.retVal
Debug.Print result ' for 2 and 3 prints 5
objIE.Quit
Set objIE = Nothing
End Sub
evalExample.html
<!-- saved from url=(0016)http://localhost -->
<html>
<head>
<script type="text/javascript">
function myFunc() {
var date = new Date();
alert("Hi from my parameter-less 'myFunc'. Day of the month: " + date.getDate());
}
function myFuncWithParams(a, b, c, d) {
var number = a + 100,
text = b + " from my func2",
bool = !c,
obj = d;
var alertText = "\nNumber = '" + number + "'" +
"\nText = '" + text + "'" +
"\nBoolean = '" + bool + "'" +
"\nObject.property1 = '" + obj.property1 + "'" +
"\nObject.property2 = '" + obj.property2 + "'" +
"\nObject.property3.lenght = '" + obj.property3.length + "'" +
"\nObject.property3[2] = '" + obj.property3[2] + "'";
alert("Hi from my 'myFunc2' with parameters.\n" + alertText);
}
function myFuncReturns(a, b) {
return a + b;
}
</script>
</head>
<body>
<div>eval test</div>
</body>
</html>