Ошибка компиляции из-за позиции оператора Private Declare - PullRequest
4 голосов
/ 23 апреля 2019

Я пытаюсь использовать альтернативу CreateObject("Scriptlet.TypeLib").GUID, предоставленную на на этой странице поддержки Microsoft (с некоторыми изменениями), но получаю "Ошибка компиляции: только комментарии могут появляться после End Sub, End Function или EndНедвижимость "на линии Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (guid As GUID_TYPE) As LongPtr.

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

Я попытался переместить две строки Private Declareгде-то внутри функции, чтобы увидеть, решит ли это проблему, но продолжает ли та же ошибка.

Public Function GetGUID() As String
  Private Type GUID_TYPE
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
  End Type

  Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (guid As GUID_TYPE) As LongPtr
  Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr

  Dim guid As GUID_TYPE
  Dim strGuid As String
  Dim retValue As LongPtr
  Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
  retValue = CoCreateGuid(guid)
  If retValue = 0 Then
    strGuid = String$(guidLength, vbNullChar)
    retValue = StringFromGUID2(guid, StrPtr(strGuid), guidLength)
    If retValue = guidLength Then
      ' valid GUID as a string
      GetGUID = strGuid
    End If
  End If
End Function

Эта функция используется в модуле, предназначенном для копирования событий календаря из календаря по умолчанию в другой указанный календарь,

Этот код можно найти здесь .Опять же, он заменяет строку GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) в этом коде.

Что является причиной этой ошибки и есть ли решение?

1 Ответ

4 голосов
/ 23 апреля 2019

Declare операторы принадлежат на уровне модуля. Разрежьте две строки и переместите их в самый верх модуля, чуть ниже того места, где должно быть Option Explicit.

Ошибка компиляции немного неуклюжа / вводит в заблуждение: это та же самая ошибка компиляции, которую вы получите, если бы у вас было Declare операторов или объявлений переменных между двумя процедурами в модуле.

Option Explicit
'legal here
Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (guid As GUID_TYPE) As LongPtr

Public Sub Foo()
End Sub

'illegal here
Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (guid As GUID_TYPE) As LongPtr

Private Function Bar()
    'illegal here
    Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (guid As GUID_TYPE) As LongPtr
End Sub

Declare операторы должны находиться в секции модуля (declarations) - посмотрите на левый верхний выпадающий список в верхней части окна панели кода: если он не говорит (declarations), то вы находитесь в области действия процедуры ; Declare операторы не могут быть ограничены областью действия на уровне процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...