我有一个VBA代码,其中我使用了PISDK中的许多对象,我必须将这些对象添加为对我的项目的引用。
我必须明确声明变量,否则代码将无法工作。我不知道为什么。例如,如果我声明pt as object
而不是PIPoint
,Excel会抛出一个错误("类型不匹配")。
这是我的部分代码:
Dim srv As Server
Dim pt As PIPoint
Dim pv As PIValue
Dim dt As New PITimeFormat
问题是:当用户没有安装这个引用时,Excel会给我一个编译错误,所以不可能捕捉和处理这个错误。由于此代码运行在用户定义的函数上,因此用户一打开工作簿,就会遇到编译错误。
我一定能抓住这个错误。
我找不到完全实现此代码后期绑定的文档。我不知道这是否真的有可能。我知道它可以解决我的问题。
此外,我知道我可以通过检查参考是否已安装
thisworkbook.vbproject.references
但是,如果用户不允许访问Excel选项下的vbaProject对象,我将无法执行此操作。
知道吗?
我设法解决了将所有内容声明为对象,然后使用createobject的问题。这样做的主要问题是使用函数,如以下函数:我有一个函数"arcValue"。它需要三个论点:arcValue(TimeStamp为PITimeFormat,Mode为RetrievelTypeConstants,可选asyncStatus为PISyncnStatus)我使用它进行早期绑定的方式是:
dim pt as PIPoint
dim pv as PIValue
set pv = pt.data.arcValue("01/09/2014 17:00:00", rtInterpolated)
这是有效的。但当我这样做时:
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"常量,所以我必须使用它的等价数。
Set pv = pd.ArcValue("01/09/2014 17:00:00", 3)
但这仍然不起作用。所以我必须这样做才能让它发挥作用:
Set pv = pd.ArcValue("01/09/2014 17:00:00", 3, Nothing)
然后一切都开始运转了。我不知道为什么,但VBA让我编写一些"无所不能"的参数,即使它们是可选的。
通过这种方式,我能够在运行时检测错误,所以我使用了以下代码:
If myPISDK Is Nothing Then
piVerified = "Erro PI"
Exit Function
End If
此外,我不得不删除所有引用(无论如何,它们不再使用),因为当引用丢失时,它会导致我代码中与此无关的其他部分出现故障。
您可以使用类似的东西:
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
在初始化阶段,您可以这样检查
子NotUsed,不要创建错误,因为未调用
在我的示例中,我使用ADOBE对象。。。