将 Staad 与 VBS 一起使用(将 VBA 文档转换为 VBscript)

Posted

技术标签:

【中文标题】将 Staad 与 VBS 一起使用(将 VBA 文档转换为 VBscript)【英文标题】:Using Staad with VBS (Convert VBA documentation to VBscript) 【发布时间】:2015-05-24 19:42:45 【问题描述】:

我正在尝试使用 vbscript 从 Staad(一个结构分析程序)中提取数据。

Staad 有一个 API 允许这样做,但是,所有文档都在 VBA 中。所以我正在尝试将 VBA 转换为 VBscript,但我遇到了错误。

例如,以下是 Staad 文档中的一些 VBA,用于获取模型中的节点总数:

Dim objOpenSTAAD As Output
Dim pnNodes As Integer
Set objOpenSTAAD = CreateObject("OpenSTAAD.Output.1")
objOpenSTAAD.SelectSTAADFile "C:\SPRO2003\STAAD\Examp\US\examp08.std"
objOpenSTAAD.GetNodesCount pnNodes

我尝试将其作为 vbscript 运行,我所做的唯一更改是从变量中删除数据类型。我得到的错误是:

Type mismatch: 'GetNodesCount'

任何人都可以提供任何想法吗? 如果有帮助,这里是 GetNodesCount 函数的 Staad 文档:

GetNodesCount

VB 语法

整数GetNodesCount(整数pnNodes)

参数

pnNodes

一个整数变量,用于存储函数检索到的节点数。

备注

此函数检索当前打开的 STAAD 文件中的节点数。

示例

将 pnNode 变暗为整数

objOpenSTAAD.GetNodesCount pnNodes

【问题讨论】:

【参考方案1】:

您的代码的问题可能是您没有为pnNodes 分配任何内容。在 VBA 中,这没关系,因为它被强类型化为 Integer,这意味着它被隐式地赋予了默认值 0。在 VBScript 中,它没有被赋予默认值,因为没有类型。您可以提前为它分配一个0,它可能会起作用:

Dim objOpenSTAAD As Output
Dim pnNodes As Integer
Set objOpenSTAAD = CreateObject("OpenSTAAD.Output.1")
objOpenSTAAD.SelectSTAADFile "C:\SPRO2003\STAAD\Examp\US\examp08.std"
pnNodes = 0
objOpenSTAAD.GetNodesCount pnNodes

不过,您最有可能将此值设为0(我只是在猜测),这意味着此转换过程已帮助您找到错误:) p>

【讨论】:

谢谢,我已经尝试过了,但我仍然遇到同样的错误。我认为您的想法是正确的,似乎类型不匹配错误表明它不会分配值,因为变量未声明为整数。 尝试将objOpenSTAAD.GetNodesCount pnNodes 更改为objOpenSTAAD.GetNodesCount CInt(pnNodes) 是的,这消除了错误,谢谢。但现在我的问题是它实际上并没有为 pnNodes 分配一个新值,它仍然输出0 虽然这可能是一个不同的问题。实际访问文件中的结果可能是个问题。 对,就像我说的,你需要在使用前设置正确的值。如果您对此回答满意,请接受。 啊,我明白了。是的,该函数的目的是从 .std 文件中提取节点数并将该数分配给 pnNodes 变量。所以你认为这是一个错误,并且实际上不能在 VBScript 中完成?【参考方案2】:

使用 CInt(pnNodes) 作为参数将函数的结果而不是可写变量传递给 .GetNodesCount。 Voodoo,但易于测试:

Dim objOpenSTAAD : Set objOpenSTAAD = CreateObject("OpenSTAAD.Output.1")
Dim pnNodes : pnNodes = CInt(0) ' initialized to sub type Integer
Dim nNodes ' uninitialized (Empty)
objOpenSTAAD.SelectSTAADFile "C:\SPRO2003\STAAD\Examp\US\examp08.std"
objOpenSTAAD.GetNodesCount pnNodes ' may work
nNodes = objOpenSTAAD.GetNodesCount(pnNodes) ' fallback

更新评论:

正如你所说的使用objOpenSTAAD.GetNodesCount CInt(pnNodes)“摆脱错误”,试试

nNodes = objOpenSTAAD.GetNodesCount(CInt(pnNodes)) 

并希望nNodes得到无法写入CInt(pnNodes)的结果。

三思而后行:

根据this post,pnNodes 参数所需的数据类型可能Long(而不是Integer)。因此,请尝试使用CLng 而不是CInt 进行上述变体。

【讨论】:

嗯,我仍然收到最后两行的类型不匹配错误 使用nNodes = objOpenSTAAD.GetNodesCount(CInt(pnNodes)) 似乎将1 的值传递给nNodes。这很奇怪,因为值应该是16。但无论如何,这都是进步。使用CLng 似乎没有任何影响,它仍然使用上述方法传递1 的值,并在我尝试使用您建议的其他方法时给我一个类型不匹配错误。但是,我尝试了 VBA 中的代码,它只有在我使用 Dim pnNodes As Long 时才能正常工作。当我使用Dim pnNodes As Integer 时出现相同的类型不匹配错误,因此类型应该是Long 似乎是真的。

以上是关于将 Staad 与 VBS 一起使用(将 VBA 文档转换为 VBscript)的主要内容,如果未能解决你的问题,请参考以下文章

如果从 Excel vba 执行 vbs,则从 vbs 运行 Access ImportExport 失败 - 知道吗?

vba代码中的数组公式与应对公式

将 dbSeeChanges 应用于所有记录集 VBA

将 Access 和 Outlook 与 VBA 集成以进行定期报告

VBA,语法,将单元格范围组合在一起以获取公共变量

将 MapVirtualKeyA 与 Shift 和 Ctrl Alt 一起使用