2014-09-02 153 views
2

我有一個VBA代碼,我使用PISDK中的很多對象,我必須添加它作爲我的項目的參考。Excel VBA缺少參考 - PI Osisoft

我必須顯式聲明變量,否則代碼將無法工作。我不知道爲什麼。如果我聲明,Excel會拋出一個錯誤(「類型不匹配」),例如,pt as object而不是PIPoint

這裏是我的代碼部分:

Dim srv As Server 
Dim pt As PIPoint 
Dim pv As PIValue 
Dim dt As New PITimeFormat 

的問題是:當用戶不具有此引用安裝,Excel中給我的編譯錯誤,所以這是不可能捕獲和處理這個錯誤。由於此代碼在用戶定義的函數上運行,只要用戶打開工作簿,他就會陷入編譯錯誤。

我必須能夠捕捉到這個錯誤。

我無法找到文檔來完全實現此代碼的後期綁定。我不知道是否真的有可能做到這一點。我知道它可以解決我的問題。

另外,我知道,我可以檢查是否安裝了直通參考:

thisworkbook.vbproject.references 

但是,如果用戶不允許訪問在Excel選項中的VBAProject對象,我沒有能夠做到這一點。

有什麼想法?

回答

0

您可以使用類似的東西:

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對象...

+1

你好。我沒有檢查它,但我認爲它不會工作,因爲就像我說的那樣,這是一個編譯錯誤。所以即使我只寫了一個函數,即使它從未被調用過,Excel也會給出一個錯誤。我設法找到一個解決方案,我已經發布了它。謝謝。 – hend 2014-09-04 11:41:34

1

我設法解決我的問題,宣佈一切爲對象,然後使用CREATEOBJECT之後。 這樣做的主要問題是使用函數,像這樣: 我有函數「arcValue」。它有三個參數: arcValue(時間戳PITimeFormat,模式爲RetrievelTypeConstants,可選asynchStatus爲PIAyncnStatus) 我用它做早期綁定的方法是:

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 

此外,我不得不刪除所有引用(它們不再被使用,反正),因爲這是造成在我的代碼的其他部分發生故障時,與參考代碼不匹配時這些代碼不相關。