Как проверить, открыт ли "afile.xlsm: 2" VBA - PullRequest
0 голосов
/ 11 января 2019

Я построил панель поиска на рабочем листе 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.

1 Ответ

0 голосов
/ 11 января 2019

A Workbook - это не то же самое, что Window, что определенно является ошибкой вашего оператора If. Вам нужно изменить свою функцию, чтобы отразить это.

Function AlreadyOpen(sFname As String) As Boolean
    Dim wkb As Window
    On Error Resume Next
    Set wkb = Windows(sFname)
    wkb.Activate
    AlreadyOpen = Not wkb Is Nothing
    Set wkb = Nothing
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...