Автоматически открывать книгу Excel, но только если она еще не открыта - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть серия рабочих книг Excel, которые по некоторым данным зависят от отдельной рабочей книги.Итак, мне нужно, чтобы рабочая книга данных открывалась автоматически при открытии основной рабочей книги.Для простоты для моих нетехнических конечных пользователей я скрываю рабочую книгу данных.Однако мне нужно уметь работать с обеими книгами одновременно.Итак, я попытался установить флаг (links_opened), чтобы указать, была ли книга данных уже открыта при открытии основной книги.Для справки, это мой первый случай с VBA, и я нахожу это действительно странным.

Вот соответствующая часть моего кода:

Option Explicit

Dim w As Workbooks
Dim links_opened As Boolean
links_opened = False ' This is where VBA reports an error

Function IsWorkBookOpen(FileName As String)
    ' Code here tests whether the workbook is already open
    ' Omitted for brevity
End Function

Private Sub Workbook_Open()
    Dim fn As String
    fn = ThisWorkbook.Path & "\Work Instructions\Links.xlsx"
    If !IsWorkBookOpen(fn) Then
        Set w = Workbooks
        Application.ScreenUpdating = False
        w.Open FileName:=fn, UpdateLinks:=False, ReadOnly:=True
        ActiveWindow.Visible = False
        ThisWorkbook.Activate
        Application.ScreenUpdating = True
        links_opened = True
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If links_opened Then
        w.Item(2).Saved = True
    End If
End Sub

Когда я пытаюсь запуститьэтот код, VBA говорит, указывая на строку, которую я отметил выше:

Ошибка компиляции:

Недопустимая внешняя процедура

Я понимаю, что VBA по какой-то причинене позволяет устанавливать переменные на верхнем уровне.Но я не знаю другого способа сделать это.Он отлично работает на других языках, которые я регулярно использую.

Как установить флажок, чтобы отслеживать, был ли файл данных открыт моим кодом или вручную?Или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 22 февраля 2019
links_opened = False ' This is where VBA reports an error

Это операция присваивания, которая является исполняемым оператором.В VBA не декларативные исполняемые операторы запрещены вне области действия процедуры.Кроме того, переменная Boolean автоматически инициализируется как False, поэтому в любом случае присвоение будет недопустимым.

If !IsWorkBookOpen(fn)

Это будет следующая ошибка компиляции;! существует в VBA, но это либо подсказка типа , либо оператор взрыва , ни один из которых не имеет ничего общего с отрицанием логического значения.Для этого вы хотите использовать ключевое слово Not:

If Not IsWorkbookOpen(fn)

А затем функция IsWorkbookOpen возвращает Boolean:

Private Function IsWorkBookOpen(ByVal FileName As String) As Boolean
    On Error Resume Next
    Dim wb As Workbook
    Set wb = Application.Workbooks(FileName) ' throws error 9 if non-existing
    Err.Clear
    On Error GoTo 0
    IsWorkbookOpen = Not wb Is Nothing
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...