Excel VBA отсутствует ссылка - PI Osisoft

У меня есть код VBA, где я использую много объектов из PISDK, которые я должен добавить в качестве ссылки на мой проект.

Я должен явно объявить переменные, иначе код не будет работать. Я не знаю почему. 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

Но если пользователь не разрешает доступ к объекту vbaProject в параметрах Excel, я не могу этого сделать.

Любая идея?

2 ответа

Мне удалось решить мою проблему, объявив все как объект, а затем используя createobject. Основной проблемой для этого было использование таких функций, как эта: у меня есть функция "arcValue". Он принимает три аргумента: arcValue(TimeStamp как PITimeFormat, Mode как 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

Кроме того, мне пришлось удалить все ссылки (они больше не используются, во всяком случае), потому что это вызывало сбой в других частях моего кода, не связанных с этим, когда ссылки отсутствовали.

Вы можете использовать что-то вроде этого:

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

Другие вопросы по тегам