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