Открывать и скрывать от просмотра документ Excel

#excel #vba

#excel #vba

Вопрос:

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

Он создан для того, чтобы сначала проверить, открыта ли уже книга, однако недавно я заметил, что если они запустят его несколько раз, то будут открыты две одинаковые книги.

показывать книги

Это проблематично, потому что мои товарищи по команде могут иногда отображать этот документ, чтобы получить доступ к некоторому содержимому на листе, и они путаются, когда видят две одинаковые книги.

Я попытался удалить .NewWindow , однако затем он начинает скрывать неправильные окна.

Смотрите мой полный код ниже. Что я делаю не так?

 Function IsWBOpen(WorkbookName As String) As Boolean
' check if WorkbookName is already opened

    Dim wb As Variant
    Dim NAME As String, searchfor As String
    Dim pos As Integer

    searchfor = LCase(WorkbookName)
    For Each wb In Workbooks
        pos = InStrRev(wb.NAME, ".")
        If pos = 0 Then                           ' new wb, no extension
            NAME = LCase(wb.NAME)
        Else
            NAME = LCase(Left(wb.NAME, pos - 1))  ' strip extension
        End If
        If NAME = searchfor Then
            IsWBOpen = True
            Exit Function
        End If
    Next wb
    IsWBOpen = False
End Function


Sub openmacros()

    If IsWBOpen("RP Macro Wrkbk") Then
        GoTo Message:
        Else
        Set RP = Workbooks.Open(Filename:="file:///\FPSFILES1ReviewPricingMacro DataRP Macro Wrkbk.xlsb", ReadOnly:=True).NewWindow
        ActiveWindow.Visible = False
    End If
Message:
    MsgBox "RP Macros enabled", _
                    vbOKOnly, "RP Macros"

End Sub
  

Ответ №1:

Рассмотрите возможность использования пользовательской надстройки

Первое решение, которое я хотел бы предложить вам, — это создать надстройку с вашими инструментами. Я не буду вдаваться в подробности того, как это сделать, но это добавило бы много преимуществ вашим пользователям, одним из которых является то, что им не нужно будет открывать его каждый раз.

Вам нужно будет предоставить им все необходимое содержимое, поскольку у вас не будет доступа к show книге.

Проблемы с вашей функцией

Когда вы открываете свою книгу, вы также вызываете .NewWindow , который создает копию вновь открытой книги.

 Set RP = Workbooks.Open( _
         Filename:="file:///\FPSFILES1ReviewPricingMacro DataRP Macro Wrkbk.xlsb", _
         ReadOnly:=True).NewWindow
  

Удаление .NewWindow должно предотвратить это.

Дополнительные примечания

Ваши функции более сложны, чем им нужно.

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

 Public Function IsWorkbookOpen(ByVal workbookName As String) As Boolean
    Dim wb As Workbook
    For Each wb In Workbooks
        If UCase(wb.NAME) Like UCase(workbookName) Then
            IsWorkbookOpen = True
            Exit Function
        End If
    Next wb
End Function
  

Ваша вторая функция содержит ненужный goto оператор. Перемещение вашего условного обозначения немного очистит его и будет легче следовать.

 Public Sub OpenMacros()
    If Not IsWorkbookOpen("RP Macro Wrkbk*") Then
        Set RP = Workbooks.Open( _
                    Filename:="file:///\FPSFILES1ReviewPricingMacro DataRP Macro Wrkbk.xlsb", _
                    ReadOnly:=True)
    End If
    MsgBox "RP Macros enabled", vbOKOnly, "RP Macros"
End Sub
  

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

Комментарии:

1. Это вообще не касается моего вопроса. Спасибо за упрощение моего кода, но где мой ActiveWindow.Visible = False ? Это основа вопроса. Есть причина, по которой у меня .NewWindow там был.