首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VBA缺少引用- PI Osisoft

Excel VBA缺少引用- PI Osisoft
EN

Stack Overflow用户
提问于 2014-09-03 01:46:25
回答 2查看 2.1K关注 0票数 2

我有一个VBA代码,其中我使用了来自PISDK的许多对象,我必须将这些对象添加到我的项目中作为引用。

我必须显式地声明变量,否则代码将无法工作。我也不知道原因。例如,如果我声明pt as object而不是PIPoint,Excel将抛出错误(“类型不匹配”)。

下面是我的代码的一部分:

代码语言:javascript
复制
Dim srv As Server
Dim pt As PIPoint
Dim pv As PIValue
Dim dt As New PITimeFormat

问题是:当用户没有安装这个引用时,Excel会给我一个编译错误,所以不可能捕获和处理这个错误。由于此代码在用户定义的函数上运行,因此只要用户打开工作簿,就会遇到编译错误。

我必须能够捕捉到这个错误。

我找不到在这段代码上完全实现后期绑定的文档。我不知道是否真的可以做到这一点。我知道它可以解决我的问题。

另外,我知道我可以通过以下方式检查是否安装了引用:

代码语言:javascript
复制
thisworkbook.vbproject.references

但是,如果用户不允许访问“Excel选项”下的vbaProject对象,我就不能这样做。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2014-09-04 19:40:19

我设法解决了我的问题,将所有东西都声明为对象,然后使用createobject。这样做的主要问题是使用函数,就像这样:我有一个函数"arcValue“。它接受三个参数: arcValue(TimeStamp作为PITimeFormat,模式作为RetrievelTypeConstants,可选的asynchStatus作为PIAyncnStatus)我使用它进行早期绑定的方式是:

代码语言:javascript
复制
dim pt as PIPoint
dim pv as PIValue
set pv = pt.data.arcValue("01/09/2014 17:00:00", rtInterpolated)

这是可行的。但当我这么做的时候:

代码语言:javascript
复制
Dim myPISDK As Object
Dim srv As Object
Dim pt As Object
Dim pd as Object
Dim pv as Object
Set myPISDK = CreateObject("PISDK.PISDK")
Set pv = CreateObject("PISDK.PIValue")
Set srv = myPISDK.Servers.defaultserver
Set pd = pt.DATA
Set pt = srv.PIPoints("piTAG")
Set pv = pd.ArcValue("01/09/2014 17:00:00", rtInterpolated)

它不起作用。但是为什么呢?有两个问题:首先:当我使用后期绑定(createobject)时,我不能访问"rtInterpolated“常量,所以我必须使用它的等价数。

代码语言:javascript
复制
Set pv = pd.ArcValue("01/09/2014 17:00:00", 3)

但这仍然不起作用。所以我必须这样做才能让它工作:

代码语言:javascript
复制
Set pv = pd.ArcValue("01/09/2014 17:00:00", 3, Nothing)

然后一切都开始运转了。我不知道为什么,但是VBA让我写一些做所有参数的东西,即使它们是可选的。

这样,我就能够在运行时检测到错误,所以我使用了以下代码:

代码语言:javascript
复制
If myPISDK Is Nothing Then
    piVerified = "Erro PI"
    Exit Function
End If

此外,我必须删除所有引用(无论如何,它们都不再使用了),因为当引用丢失时,它会导致与此无关的代码其他部分出现故障。

票数 1
EN

Stack Overflow用户

发布于 2014-09-03 14:04:37

你可以使用类似这样的东西:

代码语言:javascript
复制
Sub NotUsed()
    Dim pt As PIPoint
End Sub

Function ReferenceCheck() As Boolean
    On Error GoTo NoRef
    pt = Acrobat.AV_DOC_VIEW ' PIPoint

    ReferenceCheck = True
    Exit Function

NoRef:
    ReferenceCheck = False
End Function

Sub Test()
    If ReferenceCheck Then NotUsed
End Sub

该功能指的是对象的属性。如果引用可以,则返回true,否则返回false。

在init阶段,你可以像这样检查。

NotUsed,请勿创建错误,因为未调用...

在我的示例中,我使用了ADOBE对象...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25629310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档