【问题标题】:Speeding up Excel VBA macro that searches subfolders加速搜索子文件夹的 Excel VBA 宏
【发布时间】:2020-06-07 22:37:42
【问题描述】:

首先,我不得不说我对 VBA 还是很陌生。我已经使用 Excel 几年了,并且非常了解它,但是 VBA 编辑器对我来说是一种新事物。

我需要创建一个宏来设法找到具有特定名称的文件夹所在的父文件夹并打开它。我设法做到了(见下面的代码)。但是,搜索速度太慢了。该脚本的整个建议是为了节省时间和准确,目前,在 Windows 资源管理器中查找文件夹更快。宏大约需要 1-2 分钟,而资源管理器需要 10 秒。

我想知道是否有办法加快速度。任何帮助将不胜感激。

Option Explicit
Dim FileSystem As Object
Dim S As Boolean
Dim HostFolder As String

Sub FindFolder()
HostFolder = "W:\Branches\City\Name\NAME QUOTING"
Set FileSystem = CreateObject("Scripting.FileSystemObject")
S = False
DoFolder FileSystem.GetFolder(HostFolder)
If S = False Then
    MsgBox "Folder not found"
End If
End Sub
Sub DoFolder(Folder)
    Dim SubFolder
    Dim StockCode As String
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
        StockCode = Selection.Value
        If SubFolder.Name Like "*" & StockCode & "*" Then
            Call Shell("explorer.exe " & SubFolder.ParentFolder, vbNormalFocus)
            S = True
            Exit For
        End If
    Next SubFolder
End Sub

【问题讨论】:

  • 当你找到你的文件时,你需要退出整个递归。也许将Exit For 更改为Exit Sub 并在DoFolder SubFolder 之后添加一行If S Then Exit Sub

标签: excel vba foreach


【解决方案1】:
Option Explicit

Sub FindFolder()

'edited section******
dim stockcode As String
Stockcode = activecell.text
if stockcode = "" then exit sub
'end of edit 
'****************************

stockcode = "*" & stockcode & "*"  'concaternation is expensive, do only once
Dim fso As New filesystemobject
Dim topfol As Folder
Dim fol As Folder
Dim s As String
Set topfol = fso.GetFolder("W:\Branches\City\Name\NAME QUOTING") ' we start here

For Each fol In topfol.SubFolders
    If fol.Name Like stockcode Then
        s = fol.Path
        Exit For
    End If
    s = SearchFolder(fol, stockcode)
    If s <> "" Then
        Exit For
      End If


Next fol
ShowFolder s
End Sub

Sub ShowFolder(s As String)
If Len(s) > 0 Then
Shell "Explorer.exe " & s, vbNormalFocus
End If
End Sub

Public Function SearchFolder(fol As Folder, stockcode As String) As String

Dim ff As Folder
For Each ff In fol.SubFolders
    If ff.Name Like stockcode Then

        SearchFolder = ff.Path
        Exit For
    End If
    If SearchFolder(ff, stockcode) <> "" Then
     SearchFolder = ff.Path
        Exit For
    End If
 Next ff
End Function

请注意,此版本使用对 Microsoft Scripting Runtime 的引用,以便提前绑定到 FileSystemObject。我相信这可以优化

【讨论】:

  • 非常感谢这个,骚扰爸爸,但我担心由于某种原因我无法运行它。我不知道我是否做错了什么,但是当我点击“运行”按钮时,宏框显示为空。
  • 啊-您将股票代码作为所选单元格传递。等一下……对 - 见上面的编辑
  • 由于您特别提到了早期绑定,我要补充一点,确实,早期绑定确实提供了性能优势,并且在这种情况下是显而易见的。对于一次性案例(例如从模板创建新的 Outlook 邮件)而言,好处往往可以忽略不计,但对于文件系统,有时是字典,根据我的经验,它有一些明显的影响
  • 你好。非常感谢所有的帮助,伙计们。我已经尝试过了,即使它让我运行它,它也会给我一个错误,上面写着“用户定义的类型不是定义器”并且它不起作用。 Excel 紧随其后突出显示以下内容: Public Function SearchFolder(fol As Folder, stockcode As String) As String
  • 您是否引用过 Microsoft Scripting Runtime?这是该消息的最常见原因。在 VB 编辑器中转到 Tools,References 并确保选中运行时
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多