热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我的代码如何知道它是以VBScript,.HTA还是VBA运行?

如何解决《我的代码如何知道它是以VBScript,.HTA还是VBA运行?》经验,为你挑选了1个好方法。

编辑:到目前为止,大多数响应都涉及检查可能不存在的对象,这些对象在使用Option Explicit on的VBA中完全不起作用(它会抛出编译时错误,因此On Error不起作用,并且关闭Option Explicit不是一个选项).还有其他一些环形/开箱即用的方法来找出这里需要什么吗?

我正在尝试编写通用的复制粘贴代码,这些代码可以在独立的Vbscript(.vbs文件),.hta文件和VBA(例如,在Excel文件中)中使用.要做到这一点,我需要一些方法让代码本身告诉它运行的引擎.

到目前为止我听到的最好的想法是测试某些对象是否存在,但在VBA中,在编译时失败(因此我无法绕过On Error),因此无法解决问题.试图找出它运行的文件的名称并不是最终可行的; 根据代码运行的三个脚本引擎中的哪一个,这是不同的事情之一.我希望有这样简单的东西,但我不确定要填写什么:

Option Explicit

'--- Returns a string containing which script engine this is running in,
'--- either "Vbscript", "VBA", or "HTA".

Function ScriptEngine()

    If {what goes here?} Then ScriptEngine="VBS"
    If {what goes here?} Then ScriptEngine="VBA"
    If {what goes here?} Then ScriptEngine="HTA"
    End Function

如果填写正确,您应该能够将该功能复制并粘贴到任何VBA,VBS或HTA文件中而无需修改,调用它,并获得结果而不是错误,即使启用了Option Explicit也是如此.最好的方法是什么?



1> Comintern..:

Option ExplicitVBA实施中对要求的限制使得这比其他情况要困难得多(没有它就是单线)......具有讽刺意味的是,它也是解决方案的关键.如果你不限制自己只使用一个函数,你可以通过这样做来逃避它:

Dim hta

Sub window_onload()
     hta = True
End Sub

Function HostType()
    On Error Resume Next
    If hta Then
        HostType = "HTA"
    Else
        Dim foo
        Set foo = foo
        If Err.Number = 13 Then
            HostType = "VBA"
        Else
            HostType = "VBS"
        End If
    End If
End Function

它的工作方式如下 - 如果它是通过HTA文件加载的,则window_onload事件处理程序运行,将hta变量设置为True.这是第一次测试.第二个"测试"是关于线路抛出的错误Set foo = foo.这是在VBA中,它被理解为试图类型不匹配SetVariantEmpty,这是不兼容的类型.同一行代码在Vbscript中抛出错误424(需要对象),因为它不是强类型语言.这意味着跳过VBA的类型检查,它会尝试实际执行分配(失败).其余的只是弄清楚它是如何投掷并返回结果的.

测试代码

VBA

Option Explicit

Dim hta

Sub Test()
    Debug.Print HostType    'VBA
End Sub

Sub window_onload()
     hta = True
End Sub

Function HostType()
    On Error Resume Next
    If hta Then
        HostType = "HTA"
    Else
        Dim foo
        Set foo = foo
        If Err.Number = 13 Then
            HostType = "VBA"
        Else
            HostType = "VBS"
        End If
    End If
End Function

Vbscript中

WSCript.Echo HostType

Dim hta

Sub window_onload()
     hta = True
End Sub

Function HostType()
    On Error Resume Next
    If hta Then
        HostType = "HTA"
    Else
        Dim foo
        Set foo = foo
        If Err.Number = 13 Then
            HostType = "VBA"
        Else
            HostType = "VBS"
        End If
    End If
End Function

HTA

    
        
         
    


编辑:

如果Option Explicit不需要FWIW,上面提到的单线程就是这样:

Function HostString()
    HostString = Application & document & WScript
End Function

所有三个对象都有一个返回a的默认属性String.在Vbscript中,这将返回"Windows Script Host".在VBA中,它将返回主机的名称(即Excel中的"Microsoft Excel").在HTA中它将返回"[object]".


哇,这是一个聪明的黑客.
@Cyber​​Taco很高兴为您效劳."ReDim WScript(0)"在HTA中运行而不是Vbscript的原因是因为在Vbscript中它是应用程序对象,因此你会遇到类型不匹配的问题.在HTA中,它将是一个未声明的变量(默认为"Variant").`Redim`只是将它重新定义为具有一个(空)元素的`Variant`数组.
@Cyber​​Taco - 这是正常的范围分辨率.`ReDim`语句计为一个声明(如果指定了'Option Explicit`,它甚至可以在没有`Dim`的情况下单独使用).新变量"隐藏"在其定义范围内的变量.请参阅[VBA规范]中"ReDim"的"Static Sematics"下的第二个项目符号(https://msdn.microsoft.com/en-us/库/ ee156854.aspx).
推荐阅读
author-avatar
白宇2502858015
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有