如何从vba中查找和调用javascript方法 [英] How to find and call javascript method from vba
问题描述
我相信我需要调用javascript方法而不是尝试触发按钮。我尝试了以下示例,我认为我的问题是我不知道应该使用哪些代码部分.. 点击按钮或用VBA执行JavaScript功能这个 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
I believe I need to call a javascript method instead of trying to fire buttons. I have tried the following examples and I think my problem is that I don't know which parts of the code I should use..Click button or execute JavaScript function with VBA and this http://www.vbaexpress.com/forum/showthread.php?9690-Solved-call-a-javascript-function and http://www.vbforums.com/showthread.php?650771-RESOLVED-How-to-Call-a-JavaScript-function-From-Visual-Basic-6-WITH-wanted-parameters
我无法发布链接,因为它需要登录才能访问它...如果您需要更大的代码示例,请告诉我我的问题
I can't post a link because it requires a login to access it... Please let me know if you need a larger sample of the code to make sense of my question.
我相信我需要一个引用导出为CSV的函数,但我不确定要调用哪个函数以及要在调用中包含哪些函数部分...以下是来自catalog.js
I believe I need a function that references "Export as CSV" but I am not sure which function to call and which parts of function to include in the call... The following is from 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 ...
This next sample is from 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脚本中试过这些选项..
I have tried these options in my vba script..
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 ......
I am trying to run this from VBA so I couldnt use 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")
当我尝试运行它时,我得到该对象不支持此属性或方法错误。
I got "The object doesnt support this property or method" error when I tried to run it.
任何建议都非常棒。
我刚刚遇到了另一个可能是我想要的功能,但我仍然不知道我应该用它来调用哪一部分。我试着只调用_getExportItems:function()但是由于错误80020101(评估js时出错)我得到RUN TIME ERROR无法完成操作
I just came across another function that could be the one I want but I still don't know what part of it I should use to call. I tried to call just _getExportItems:function() but I get RUN TIME ERROR could not complete the operation due to error 80020101 (error while evaluating js)
_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})}
推荐答案
这里使用窗口的
对象。它调用名为 execScript
方法的简单示例 myFunc
和 myFuncWithParams
的全局函数。 代码已经过IE 11测试。
Here simple example which uses execScript
method of the window
object. It calls a global functions named myFunc
and myFuncWithParams
. Code was tested with 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] })"
objIE.Quit
Set objIE = Nothing
End Sub
evalExample.html
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);
}
</script>
</head>
<body>
<div>eval test</div>
</body>
</html>
这篇关于如何从vba中查找和调用javascript方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!