Excel VBA - явная ссылка на текущий экземпляр приложения - PullRequest
0 голосов
/ 08 мая 2018

Следующий код - это функция, которая принимает в качестве входных данных имя целевой рабочей книги для проверки, если она уже открыта, а также экземпляр приложения Excel, в котором она может быть открыта. Затем функция будет циклически перебирать открытые книги в этом экземпляре приложения. Если целевая рабочая книга открыта, то возвращается объект рабочей книги. Если книга еще не открыта, целевая рабочая книга открывается и затем возвращается.

Я пытаюсь трактовать аргумент "app" как необязательный вход, так как обычно это будет только один экземпляр Excel. Однако в следующем формате я получаю следующую ошибку компиляции: «Требуется постоянное выражение».

Function wbOpen(currFile, Optional app As Application = Application) As Workbook

    Dim oWB As Workbook

    currFile = StrConv(currFile, vbLowerCase)

    For Each oWB In app.Workbooks

        oWBName = StrConv(oWB.name, vbLowerCase)
        If oWBName = currFile Then

            fileOpen = True
            Exit For

        End If

    Next oWB

    If Not fileOpen Then Set oWB = Workbooks.Open(currFile)

    Set wbOpen = oWB

End Function

Всякий раз, когда я ссылаюсь на текущее приложение в методе, я могу просто написать «Приложение. [Метод или свойство]».

Как явно указать ссылку на активный экземпляр приложения Excel, чтобы иметь его в качестве значения по умолчанию для аргумента "app"?

Если возможно, я бы предпочел, чтобы у "app" не было значения по умолчанию, а затем проверил, равно ли это значение нулю в коде.

1 Ответ

0 голосов
/ 08 мая 2018

При попытке вернуть объект, для которого требуется постоянное выражение, проверьте, является ли выражение ничем в коде, и затем установите его там (я обычно делаю это, когда возвращаю правильную рабочую книгу в качестве необязательной рабочей книги, т.е. ThisWorkbook).

Я не уверен в целесообразности возврата такого приложения - я никогда не пробовал.

Public Function wbOpen(currFile As String, Optional app As Application) As Workbook

    Dim oWB As Workbook

    If app Is Nothing Then
        Set app = Application
    End If

    currFile = StrConv(currFile, vbLowerCase)

    For Each oWB In app.Workbooks

        oWBName = StrConv(oWB.Name, vbLowerCase)
        If oWBName = currFile Then

            fileOpen = True
            Exit For

        End If

    Next oWB

    If Not fileOpen Then Set oWB = Workbooks.Open(currFile)

    Set wbOpen = oWB

End Function  

Если возможно, я бы предпочел, чтобы у «app» не было значения по умолчанию и затем проверьте, является ли значение ноль в коде.

... Я не знаю, есть ли другой способ.

...