【问题标题】:How to check if "afile.xlsm:2" is already open VBA如何检查“afile.xlsm:2”是否已经打开 VBA
【发布时间】:2019-06-06 18:38:24
【问题描述】:

我在 Excel 工作表中建立了一个搜索栏,用户单击 [搜索];它将根据一些FormControl按钮对指定的表格列进行排序,然后在当前工作簿上打开一个NewWindow,选择Sheet2并在Sheet2上搜索指定的列。下次有人在不手动关闭第二个窗口的情况下进行搜索时,我无法防止这种情况再次发生。我目前只需要一次打开两个活动窗口。所以我不希望 Excel 打开第三个 ActiveWindow 等等。

我对函数的使用不太熟悉。我已经粘贴了我的宏 Sub 和 Function。我尝试了不同的配置/变体,认为我缺少一些简单的东西(希望如此)。

在我看来,我的 AlreadyOpen 功能不正确。当 afile.xlsm:2 已经打开时,我似乎无法让我的第一个 IF...True 语句工作。

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 并排序 Table1。但是,如果第二个窗口已经打开,那么只需对 Table24 进行排序。

【问题讨论】:

  • 如果我没看错,你希望排序发生在 Workbooks("afile.xlsm:2") 中,不管它是否必须打开窗口,对吗?
  • 排序将在工作簿中(“afile.xlsm”),但我需要 VBA 来识别工作簿的第二个窗口是否打开。 ("afile.xlsm:2") 和 ("afile.xlsm:1) 是第二个打开后我想使用的窗口。

标签: excel vba function if-statement


【解决方案1】:

WorkbookWindow 不同,这绝对是您的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

【讨论】:

  • 感谢您的反馈。您对此答案的编辑效果很好!
  • 很高兴有帮助!
猜你喜欢
  • 2019-04-29
  • 2012-08-30
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多