Я построил панель поиска на рабочем листе Excel, где пользователь нажимает кнопку [поиск]; он отсортирует указанный столбец таблицы на основе некоторых кнопок FormControl, затем откроет NewWindow из текущей рабочей книги, выберет Sheet2 и выполнит поиск в указанном столбце на Sheet2. У меня проблемы с предотвращением повторения этого в следующий раз, когда кто-то ищет, не закрывая второе окно вручную. В настоящее время мне нужно открыть только два активных окна одновременно. Поэтому я не хочу, чтобы Excel открывал третье окно ActiveWindow и т. Д.
Я не слишком знаком с использованием функций. Я вставил свой макрос Sub и Function. Я пробовал разные конфигурации / варианты, думая, что мне не хватает чего-то простого (надеюсь).
Мне кажется, моя функция AlreadyOpen неверна. Кажется, я не могу заставить работать мое первое IF...True
утверждение, когда afile.xlsm: 2 уже открыт.
Function AlreadyOpen(sFname As String) As Boolean
Dim wkb As Workbook
'Dim sFname As String
sFname = "afile.xlsm:2"
On Error Resume Next
Set wkb = Workbooks(sFname)
AlreadyOpen = Not wkb Is Nothing
Set wkb = Nothing
End Function
Private Sub Search_cmd1_Click()
'PURPOSE: Filter Data on User-Determined Column & Text/Numerical value
Dim myButton As OptionButton
Dim SearchString As String
Dim ButtonName As String
Dim sht As Worksheet
Dim myField As Long
Dim DataRange As Range
Dim mySearch As Variant
'Load Sheet into A Variable
Set sht = ActiveSheet
'Unfilter Data (if necessary)
On Error Resume Next
sht.ShowAllData
On Error GoTo 0
'Filtered Data Range (include column heading cells)
Set DataRange = sht.ListObjects("Table1").Range 'Table
'Retrieve User's Search Input
mySearch = sht.OLEObjects("SearchBox1").Object.Text & "*" 'ActiveX Control ''must include "*" for partials
'Determine if user is searching for number or text
If IsNumeric(mySearch) = True Then
SearchString = "=" & mySearch
Else
SearchString = "=*" & mySearch & "*"
End If
'Loop Through Option Buttons
For Each myButton In sht.OptionButtons
If myButton.Value = 1 Then
ButtonName = myButton.Text
Exit For
End If
Next myButton
'Determine Filter Field
On Error GoTo HeadingNotFound
myField = Application.WorksheetFunction.Match(ButtonName, DataRange.Rows(1), 0)
On Error GoTo 0
'Filter Data
DataRange.AutoFilter _
Field:=myField, _
Criteria1:=SearchString, _
Operator:=xlAnd
Dim sFilename As String
sFilename = "afile.xlsm:2"
If AlreadyOpen(sFilename) Then
Sheets("Sheet2").ListObjects("Table24").Range.AutoFilter Field:=5, Criteria1:=SearchString
Else
If myButton.Text = "SITE" Then
Sheets("Sheet1").Select
ActiveWindow.NewWindow
Windows("afile.xlsm:1").Activate
Windows("afile.xlsm:2").Activate
Windows.Arrange ArrangeStyle:=xlVertical
Sheets("Sheet2").Select
ActiveWindow.Zoom = 55
ActiveSheet.ListObjects("Table24").Range.AutoFilter Field:=5, Criteria1:=SearchString
End If
End If
Exit Sub
End Sub
Я хочу, чтобы Excel открыл NewWindow ("afile.xlsm: 2"), выберите Sheet2 и Sort Table1. Но, если второе окно уже открыто, просто сортируйте Table24.