【问题标题】:VBA - How to search Active Workbooks, and match a filename against string?VBA - 如何搜索活动工作簿,并将文件名与字符串匹配?
【发布时间】:2016-10-12 14:24:09
【问题描述】:

我正在编写一个用于工作的快速自动化项目,我无法指定用于打开工作簿的文件路径,因为它用于特殊软件中,VBA 不容易访问。

如果用户 A 打开此文件:“ABC_todaysdate”... 我将如何告诉 Excel 循环浏览活动工作簿(用户 A 可以打开 5-6 个工作簿),在 Activeworkbook 文件名中找到字母 ABC,然后使用在我的其他职能中?

到目前为止的 VBA 代码:

Sub CopyDemand()
Dim filename As String
Dim Wb As Workbook
Dim ws As Worksheet
Dim Wb2 As Workbook

Set Wb = ThisWorkbook
For Each Wb2 In Application.Workbooks
filename = ActiveWorkbook.FullName
If filename Like "demand" Then
Debug.Print ("Found")
''' Insert function to use WB2 and copy over data, compare workbooks etc.
Next
Wb.Activate

End Sub

【问题讨论】:

  • 您缺乏清晰性(我不确定您想做什么),并且您没有向我们提供您迄今为止尝试过的内容(如果您尝试过任何事情)。
  • 请编辑您的问题并在其中发布您的代码。
  • 已编辑 OP 帖子,谢谢!我对格式和一切都很陌生

标签: excel vba


【解决方案1】:

您可以迭代每个工作簿,但我认为这里的关键是使工作簿处于活动状态,以便您可以使用路径信息检索 FullName。

Option Explicit

Function getWbName(SearchStr As String) As String
On Error GoTo ErrHand:
    Application.ScreenUpdating = False
    Dim wb As Workbook

    getWbName = vbNullString

    For Each wb In Workbooks
        If InStr(1, wb.Name, SearchStr, vbTextCompare) > 0 Then
            wb.Activate
            getWbName = ActiveWorkbook.FullName
            Exit For
        End If
    Next

    'Return the active window and exit
    ThisWorkbook.Activate
    Application.ScreenUpdating = True
    Exit Function

ErrHand:
    Application.ScreenUpdating = True
    MsgBox (Err.Number & " has occured, with description: " & Err.Description)
End Function

Sub Example()
    Debug.Print getWbName("Book2")
End Sub

编辑

更新了上面的代码,改为返回 WorkBook 对象。

Option Explicit

Function getWorkBookByName(SearchStr As String) As Workbook
    Dim wb As Workbook

    For Each wb In Workbooks
        If InStr(1, wb.Name, SearchStr, vbTextCompare) > 0 Then
            Set getWorkBookByName = wb
            Exit Function
        End If
    Next
End Function

Sub Example()
    Dim myWb As Workbook: Set myWb = getWorkBookByName("Book2")
    If Not myWb Is Nothing Then Debug.Print myWb.FullName
End Sub

【讨论】:

  • 这也很有效,它更适合我想要实现的目标。我假设在 If 语句之后,一旦找到 InStr 搜索,我可以将此“WB”分配给公共变量并在“子示例”方法中使用它?
  • 你可以,或者只是让函数返回一个 WorkBook 对象。我了解您将 Path 返回到 WorkBook 对象的要求,但是返回 Workbook 对象也可以。只需将getWbName(SearchStr As String) As String 更改为getWbName(SearchStr As String) As Workbook 并将getWbName = ActiveWorkbook.FullName 更改为getWbName = wb。同时删除 wb.ActivateThisWorkbook.ActivategetWbName = vbNullString
  • 啊,那应该可以完美解决。我会试一试,昨天一整天都在努力解决这个问题。我从你的 cmets 那里学到了很多东西。非常感谢。
  • 刚试过这个,出于某种原因在“子示例”中
  • 刚刚试过这个,在“子示例”中,我试着说“getWbName.activate”和“msgbox(“完成”)来测试我是否通过了getWbName,但我一直遇到“参数不是可选的”错误
【解决方案2】:

您可以尝试捕获Application对象的WorkbookOpen事件。

这是一种方法:将以下代码复制到主工作簿的ThisWorkbook 对象中。

Option Explicit

Private WithEvents myApp As Application

Private Sub myApp_WorkbookOpen(ByVal Wb As Workbook)
    MsgBox "Openned " & Wb.FullName
End Sub

Private Sub Workbook_Open()
    Set myApp = Application
End Sub

然后关闭您的工作簿并在启用宏的情况下重新打开。此工作簿的名称以及打开时打开的每个后续工作簿都将显示在消息框中。

【讨论】:

  • 哇!谢谢文森特,我不知道设置工作簿开放捕手,我真的很喜欢这个想法。我可以将其声明为公共函数并在 ThisWorkbook 的其他模块中使用变量,还是仅与“thisWorkbook”隔离
  • 好吧,Application 无处不在,myApp 的唯一用途是捕获 WorkbookOpen 事件,以便在用户打开工作簿时收到警报。从事件中,您将能够调用您想要的任何函数或设置您需要处理的任何变量。这里的目标是不必定期寻找新打开的工作簿进行测试。您还可以在其他对象或类模块中以相同的方式捕获事件。
猜你喜欢
  • 2016-11-18
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
相关资源
最近更新 更多