#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
там был.