【问题标题】:Using Staad with VBS (Convert VBA documentation to VBscript)将 Staad 与 VBS 一起使用(将 VBA 文档转换为 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

【问题讨论】:

    标签: vba vbscript strong-typing weak-typing


    【解决方案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 似乎是真的。
    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2023-03-26
    • 2018-12-31
    • 1970-01-01
    • 2014-01-28
    • 2011-06-10
    • 2018-01-27
    相关资源
    最近更新 更多