将 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 失败 - 知道吗?