weixin_47730444 2023-09-27 16:36 采纳率: 30%
浏览 10
已结题

关于vba使用HTMLfile执行js函数问题

**

```
帮忙看下如下的vba代码执行js函数,运行后是空值「引用的jse库是正确的,这是公司内网的,在浏览器上控制台调试,能反回加密后的值」
Sub EncryptMessage()
'Dim HTMLFile As Object
Dim script As String
Dim publicKey As String
Dim message As String
Dim encrypted As String
' 创建HTMLFile对象
Set oDom = CreateObject("HTMLFILE")
Set oWindow = oDom.parentWindow
' 写入JavaScript代码和库文件内容
publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSGzsEzw5f85xQW8hbs46Tc/+5d+tOKO5nYaUnb4ViOCDUg8NziZ3oyj4gh3E7oqFP7eX6Wt2wqUQJ0YbnBfkPvqezCLMeefWBfquxhykuKU1E3wicDjvy8HI/oAOvZm2ytvI2+iEYSmAJZCQaqsrF9B+M0KoXaC2Nutq/1EfFpQIDAQAB"
message = "Hello World!"
script = "var encrypt = new JSEncrypt(); encrypt.setPublicKey('" & publicKey & "'); var encrypted = encrypt.encrypt('" & message & "');"
'script = "var encrypt = new JSEncrypt(); encrypt.setPublicKey('" & publicKey & "');"
oDom.Write ""
' 执行JavaScript代码
' Debug.Print ""
encrypted = oWindow.encrypted
' 输出加密结果
MsgBox encrypted
' 释放对象

End Sub

```**

  • 写回答

8条回答 默认 最新

  • 急速光粒 2023-09-28 08:36
    关注

    这个代码中没有引入jse库,所以无法调用解密方法得到解密的值。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 专家-赤兔[在线] 2023-09-27 16:43
    关注

    引自免费微信小程序-皆我百晓生,希望对题主有所帮助,如有帮助,还望采纳。


    您好,您的VBA代码中存在以下问题。

    1. 您创建了一个HTMLFile对象,并将其命名为oDom,但是在执行JavaScript之前,您并没有将任何HTML内容写入该对象中。因此,它无法执行任何JavaScript代码。
    2. 即使您在oDom中写入了HTML内容,也无法直接获取JavaScript代码的结果。您需要通过oWindow对象来执行JavaScript,并通过调用oWindow对象的方法或属性来获取所需的结果。

    以下是修改后的代码,可正确执行JavaScript并获取结果:

    Sub EncryptMessage()
        Dim oDOM As Object
        Dim oWindow As Object
        Dim publicKey As String
        Dim message As String
        Dim encrypted As String
    
        ' 创建HTMLFile对象
        Set oDOM = CreateObject("HTMLFILE")
        Set oWindow = oDOM.parentWindow
    
        ' 写入JavaScript代码和库文件内容
        publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSGzsEzw5f85xQW8hbs46Tc/+5d+tOKO5nYaUnb4ViOCDUg8NziZ3oyj4gh3E7oqFP7eX6Wt2wqUQJ0YbnBfkPvqezCLMeefWBfquxhykuKU1E3wicDjvy8HI/oAOvZm2ytvI2+iEYSmAJZCQaqsrF9B+M0KoXaC2Nutq/1EfFpQIDAQAB"
        message = "Hello World!"
    
        oDOM.Write "<script type='text/javascript' src='http://www.yourdomain.com/path/to/JSEncrypt.js'></script>"
        oDOM.Write "<script type='text/javascript'>"
        oDOM.Write "var encrypt = new JSEncrypt();"
        oDOM.Write "encrypt.setPublicKey('" & publicKey & "');"
        oDOM.Write "var encrypted = encrypt.encrypt('" & message & "');"
        oDOM.Write "encrypted;"
        oDOM.Write "</script>"
    
        ' 执行JavaScript代码
        encrypted = oWindow.eval(oDOM.documentElement.outerHTML & ";encrypted;")
    
        ' 输出加密结果
        MsgBox encrypted
    
        ' 释放对象
        Set oDOM = Nothing
        Set oWindow = Nothing
    End Sub
    

    请注意,您需要将您所使用的JSEncrypt.js库文件的URL替换为真实的URL。另外,eval函数会执行整个HTML内容并返回最后一行的结果。因此,我们使用oDOM.documentElement.outerHTML来获取整个HTML内容,并在最后一行执行encrypted变量。

    评论
  • Leodong. 2023-09-27 16:45
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    从你提供的代码来看,你在尝试使用VBA执行JavaScript加密函数。但是,你的代码中存在一些问题,导致无法正确执行加密操作。我将为你提供修改后的代码,以解决这些问题。
    首先,你需要确保已经正确地引用了JSEncrypt库。你可以在HTML文件中添加以下代码来引入该库:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.min.js"></script>
    

    接下来,修改VBA代码如下:

    Sub EncryptMessage()
        'Dim HTMLFile As Object
        Dim script As String
        Dim publicKey As String
        Dim message As String
        Dim encrypted As String
        ' 创建HTMLFile对象
        Set oDom = CreateObject("HTMLFILE")
        Set oWindow = oDom.parentWindow
        ' 写入JavaScript代码和库文件内容
        publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSGzsEzw5f85xQW8hbs46Tc/+5d+tOKO5nYaUnb4ViOCDUg8NziZ3oyj4gh3E7oqFP7eX6Wt2wqUQJ0YbnBfkPvqezCLMeefWBfquxhykuKU1E3wicDjvy8HI/oAOvZm2ytvI2+iEYSmAJZCQaqsrF9B+M0KoXaC2Nutq/1EfFpQIDAQAB"
        message = "Hello World!"
        script = "var encrypt = new JSEncrypt(); encrypt.setPublicKey('" & publicKey & "'); var encrypted = encrypt.encrypt(message);"
        'script = "var encrypt = new JSEncrypt(); encrypt.setPublicKey('" & publicKey & "');"
        oDom.Write ""
        ' 执行JavaScript代码
        ' Debug.Print ""
        encrypted = oWindow.encrypted
        ' 输出加密结果
        MsgBox encrypted
        ' 释放对象
    
    End Sub
    

    主要的修改是将var encrypted = encrypt.encrypt('" & message & "');这一行代码中的单引号去掉,因为在这个上下文中,它们可能会导致语法错误。现在,你应该能够正确地执行JavaScript加密函数并获取加密结果。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论
  • 程序员Ale-阿乐 2023-09-27 17:06
    关注

    你在 JavaScript 代码中创建了 encrypt 对象,但在 VBA 代码中并没有直接执行 JavaScript 代码。你需要在 VBA 代码中执行 JavaScript 代码以初始化 encrypt 对象。在执行 JavaScript 代码后,你需要从 JavaScript 环境中获取执行的结果。
    以下是修正后的 VBA 代码,在这个修正后的代码中,将 JavaScript 代码包装在 <script> 标签中,然后使用 oWindow.execScript 执行它,并通过 evalencrypted 值从 JavaScript 环境中获取。然后,你可以在 VBA 中获取并显示加密后的值。

    Sub EncryptMessage()
        Dim script As String
        Dim publicKey As String
        Dim message As String
        Dim encrypted As String
        Dim oDom As Object
        Dim oWindow As Object
        
        ' 创建HTMLFile对象
        Set oDom = CreateObject("HTMLFILE")
        Set oWindow = oDom.parentWindow
        
        ' 写入JavaScript代码和库文件内容
        publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSGzsEzw5f85xQW8hbs46Tc/+5d+tOKO5nYaUnb4ViOCDUg8NziZ3oyj4gh3E7oqFP7eX6Wt2wqUQJ0YbnBfkPvqezCLMeefWBfquxhykuKU1E3wicDjvy8HI/oAOvZm2ytvI2+iEYSmAJZCQaqsrF9B+M0KoXaC2Nutq/1EfFpQIDAQAB"
        message = "Hello World!"
        script = "var encrypt = new JSEncrypt(); encrypt.setPublicKey('" & publicKey & "'); var encrypted = encrypt.encrypt('" & message & "'); encrypted;"
        
        ' 写入 JavaScript 代码到 HTML 文件对象
        oDom.Write "<script>" & script & "</script>"
        
        ' 执行 JavaScript 代码
        oWindow.execScript "encrypted = eval(encrypted);"
        
        ' 获取执行结果
        encrypted = oWindow.encrypted
        
        ' 输出加密结果
        MsgBox encrypted
        
        ' 释放对象
        Set oDom = Nothing
        Set oWindow = Nothing
    End Sub
    
    评论
  • 玥轩_521 2023-09-27 17:49
    关注

    援引通义千问:
    在VBA中,使用HTMLFILE对象执行JavaScript函数时,需要注意以下几点:

    1. HTMLFILE对象不能直接执行JavaScript函数,需要将JavaScript代码写入到HTMLFILE对象中,然后通过HTMLFILE对象的parentWindow属性获取到对应的浏览器窗口对象,再通过该对象执行JavaScript代码。
    2. 在JavaScript代码中,需要确保引用的JSEncrypt库文件是有效的,并且已经被加载到浏览器中。如果JSEncrypt库文件不存在或者加载失败,那么执行JavaScript代码时将会抛出错误。
    3. 在执行JavaScript代码时,需要确保JavaScript代码是有效的,并且能够正确地访问和操作JSEncrypt对象。如果JavaScript代码存在语法错误或者逻辑错误,那么执行JavaScript代码时将会抛出错误。

    根据你提供的代码,你可以尝试以下方法来解决问题:

    1. 将JavaScript代码写入到HTMLFILE对象中,然后通过HTMLFILE对象的parentWindow属性获取到对应的浏览器窗口对象,再通过该对象执行JavaScript代码。
    2. 确保引用的JSEncrypt库文件是有效的,并且已经被加载到浏览器中。
    3. 确保JavaScript代码是有效的,并且能够正确地访问和操作JSEncrypt对象。

    注意,上述方法可能无法解决所有的问题。如果你仍然无法解决问题,你可以尝试联系VBA的开发者或技术支持人员,寻求他们的帮助。

    评论
  • 杨得江-君临天下wyj 2023-09-27 20:43
    关注
    
    Sub EncryptMessage()
        Dim oDOM As Object
        Dim oWindow As Object
        Dim publicKey As String
        Dim message As String
        Dim encrypted As String
        ' 创建HTMLFile对象
        Set oDOM = CreateObject("HTMLFILE")
        Set oWindow = oDOM.parentWindow
        ' 写入JavaScript代码和库文件内容
        publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSGzsEzw5f85xQW8hbs46Tc/+5d+tOKO5nYaUnb4ViOCDUg8NziZ3oyj4gh3E7oqFP7eX6Wt2wqUQJ0YbnBfkPvqezCLMeefWBfquxhykuKU1E3wicDjvy8HI/oAOvZm2ytvI2+iEYSmAJZCQaqsrF9B+M0KoXaC2Nutq/1EfFpQIDAQAB"
        message = "Hello World!"
        oDOM.Write "<script type='text/javascript' src='http://www.yourdomain.com/path/to/JSEncrypt.js'></script>"
        oDOM.Write "<script type='text/javascript'>"
        oDOM.Write "var encrypt = new JSEncrypt();"
        oDOM.Write "encrypt.setPublicKey('" & publicKey & "');"
        oDOM.Write "var encrypted = encrypt.encrypt('" & message & "');"
        oDOM.Write "encrypted;"
        oDOM.Write "</script>"
        ' 执行JavaScript代码
        encrypted = oWindow.eval(oDOM.documentElement.outerHTML & ";encrypted;")
        ' 输出加密结果
        MsgBox encrypted
        ' 释放对象
        Set oDOM = Nothing
        Set oWindow = Nothing
    End Sub
    
    
    
    评论
  • 数据大魔王 2023-09-27 21:59
    关注

    修改后的代码:

    Sub EncryptMessage()
        Dim oDom As Object
        Dim oWindow As Object
        Dim script As String
        Dim publicKey As String
        Dim message As String
        Dim encrypted As String
        
        ' 创建HTMLFile对象
        Set oDom = CreateObject("HTMLFILE")
        Set oWindow = oDom.parentWindow
        
        ' 写入JavaScript代码和库文件内容
        publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSGzsEzw5f85xQW8hbs46Tc/+5d+tOKO5nYaUnb4ViOCDUg8NziZ3oyj4gh3E7oqFP7eX6Wt2wqUQJ0YbnBfkPvqezCLMeefWBfquxhykuKU1E3wicDjvy8HI/oAOvZm2ytvI2+iEYSmAJZCQaqsrF9B+M0KoXaC2Nutq/1EfFpQIDAQAB"
        message = "Hello World!"
        script = "var encrypt = new JSEncrypt(); encrypt.setPublicKey('" & publicKey & "'); var encrypted = encrypt.encrypt('" & message & "');"
        
        ' 添加JavaScript代码到HTMLDOM对象
        oDom.Write "<script src='引入jse库的地址'></script>"   ' 将引入库的地址替换成实际地址
        oDom.Write "<script>" & script & "</script>"
        
        ' 执行JavaScript代码
        oWindow.execScript "encrypted = encrypt.encrypt('" & message & "');", "JavaScript"
        
        ' 获取加密结果
        encrypted = oWindow.encrypted
        
        ' 输出加密结果
        MsgBox encrypted
        
        ' 释放对象
        Set oWindow = Nothing
        Set oDom = Nothing
    End Sub
    
    评论
  • bug菌¹ Java领域优质创作者 2023-09-28 01:11
    关注

    该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


    根据你的代码,我发现在执行 JavaScript 代码之前,没有将其添加到 HTML 文件中。

    你可以将 JavaScript 代码添加到 HTML 文件中,然后执行代码。

    以下是修改后的代码:

    Sub EncryptMessage()
        Dim HTMLFile As Object
        Dim script As String
        Dim publicKey As String
        Dim message As String
        Dim encrypted As String
        
        ' 创建HTMLFile对象
        Set HTMLFile = CreateObject("HTMLFILE")
        
        ' 加载必需的 JavaScript 库文件
        HTMLFile.Write "<script type=""text/javascript"" src=""https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.min.js""></script>"
        
        ' 设置公钥和消息
        publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSGzsEzw5f85xQW8hbs46Tc/+5d+tOKO5nYaUnb4ViOCDUg8NziZ3oyj4gh3E7oqFP7eX6Wt2wqUQJ0YbnBfkPvqezCLMeefWBfquxhykuKU1E3wicDjvy8HI/oAOvZm2ytvI2+iEYSmAJZCQaqsrF9B+M0KoXaC2Nutq/1EfFpQIDAQAB"
        message = "Hello World!"
        
        ' 写入加密 JavaScript 代码
        script = "var encrypt = new JSEncrypt(); encrypt.setPublicKey('" & publicKey & "'); var encrypted = encrypt.encrypt('" & message & "');"
        HTMLFile.parentWindow.execScript script, "JavaScript"
        
        ' 获取加密结果
        encrypted = HTMLFile.parentWindow.encrypted
        
        ' 输出加密结果
        MsgBox encrypted
        
        ' 释放对象
        Set HTMLFile = Nothing
    End Sub
    

    另外,你还可以尝试使用 execScript 函数来执行 JavaScript 代码,并且需要注意执行代码的时机(比如在加载 JavaScript 库文件之后)。

    希望这能帮助到你。

    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 10月6日
  • 已采纳回答 9月28日
  • 修改了问题 9月27日
  • 创建了问题 9月27日

悬赏问题

  • ¥30 哈夫曼编码译码器打印树形项目
  • ¥20 求完整顺利登陆QQ邮箱的python代码
  • ¥15 怎么下载MySQL,怎么卸干净原来的MySQL
  • ¥15 网络打印机Ip地址自动获取出现问题
  • ¥15 求局部放电案例库,用于预测局部放电类型
  • ¥100 QT Open62541
  • ¥15 stata合并季度数据和日度数据
  • ¥15 谁能提供rabbitmq,erlang,socat压缩包,记住版本要对应
  • ¥15 Vue3 中使用 `vue-router` 只能跳转到主页面?
  • ¥15 用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色