gpt4 book ai didi

excel - 我的代码如何确定它是作为 VBScript、.HTA 还是 VBA 运行的?

转载 作者:行者123 更新时间:2023-12-04 21:49:16 26 4
gpt4 key购买 nike

(最终编辑:我最终整理的有效代码在下面,这可能是该线程中的最终回复。:-))

我正在尝试编写可以在独立的 VBScript(.vbs 文件)、.hta 文件和 VBA(例如,在 Excel 文件中)中工作的通用复制和粘贴代码。为此,我需要一些方法让代码本身告诉它正在运行的引擎。

到目前为止,我听到的最好的想法是测试某些对象是否存在,但是在 VBA 中,这在编译时会失败(所以我不能用 On Error 绕过它),所以没有成功。试图找出它正在运行的文件的名称最终并不可行。这是根据代码运行在三个脚本引擎中的哪一个而做不同的事情之一。
我很想有这样简单的东西,但不知道用什么来填写:

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

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的限制在 VBA 实现中使这比其他情况更困难(没有它是单线)......具有讽刺意味的是,它也成为解决方案的关键。
如果您不将自己限制为单个功能,则可以通过执行以下操作来摆脱它:

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 中的类型不匹配,它被解释为试图 Set一个 VariantEmpty ,这不是兼容的类型。同一行代码在 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
<HTML>
<BODY>
<script type="text/vbscript">
Dim hta

Sub Test()
MsgBox HostType
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
</script>
<button onclick="vbscript:Test()">Click me</button>
</BODY>
</HTML>

编辑:

FWIW,如果 Option Explicit,上面引用的单行不需要就是这样:
Function HostString()
HostString = Application & document & WScript
End Function

所有三个对象都有一个返回 String 的默认属性。 .在 VBScript 中,这将返回“Windows 脚本宿主”。在 VBA 中,它将返回主机的名称(即 Excel 中的“Microsoft Excel”)。在 HTA 中,它将返回“[object]”。

关于excel - 我的代码如何确定它是作为 VBScript、.HTA 还是 VBA 运行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54679157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com