【发布时间】:2015-01-07 01:53:08
【问题描述】:
使用 Microsoft Excel 2010,此宏在文本报告文件夹中搜索短语列表。对于每个短语,它会搜索所有报告并列出包含该短语的每个报告。
我找到了一些更好的宏来处理宏的每个部分 - 例如枚举目录或在文本文件中查找短语 - 尽管我很难成功地将它们组合在一起。尽管它并不完美,但它可能对遇到相同问题的其他人有所帮助,我希望关于如何改进和优化宏的一些反馈。
基本概述:
- A 列:文本报告的完整路径列表(例如,“C:\path\to\report.txt”)
- B 列:报告名称(如“report.txt”)
- C 列:要搜索的短语列表
- D+ 列:输出显示包含短语的每个报告(C 列)
需要改进的地方:
- 让宏运行得更快! (360 份报告和 1100 个短语需要一个多小时)
- 从弹出窗口或其他功能中选择报告和报告文件夹(当前使用另一个宏输入到电子表格中)
- 按文件名过滤报告(例如,仅检查文件名中包含单词或短语的报告)
- 按文件扩展名过滤报告(例如,只检查 .txt 文件而不检查 .xlsx 文件)
- 检测报告和短语的数量(目前这是硬编码的)
- 其他建议/需要改进的地方
代码:
Sub findStringMacro()
Dim fn As String
Dim lineString As String
Dim fileName As String
Dim searchTerm As String
Dim findCount As Integer
Dim i As Integer
Dim j As Integer
For i = 2 To 1109
searchTerm = Range("C" & i).Value
findCount = 0
For j = 2 To 367
fn = Range("A" & j).Value
fileName = Range("B" & j).Value
With CreateObject("Scripting.FileSystemObject").OpenTextFile(fn)
Do While Not .AtEndOfStream
lineString = .ReadLine
If InStr(1, lineString, searchTerm, vbTextCompare) Then
findCount = findCount + 1
Cells(i, 3 + findCount) = fileName
GoTo EarlyExit
End If
Loop
EarlyExit:
.Close
End With
Next j
Next i
End Sub
【问题讨论】:
-
花时间打开 407003 个文件 (1109 * 367)。
-
使用原生
Workbooks.Open Filename:= fn, ReadOnly:= True而不是使用CreateObject()函数可能会缩短项目时间。 -
InStr()是一个循环函数。要避免循环,请使用Like运算符:msdn.microsoft.com/en-us/library/swf8kaxw.aspx。而不是If InStr(1, lineString, searchTerm, vbTextCompare) Then,试试If .Cells(1,1) Like "*" & searchTerm & "*" Then -
@bp_
Like可以做任何Instr所做的事情,甚至更多。如果切换到更通用的功能可以更快地运行,我会感到非常惊讶。 -
@Degustaf 你测试过这个吗?如果您可以提供一些反馈,我很想知道哪个是最好的。另外,@metronomadic,如果可以避免的话,使用
vbBinaryCompare会比vbTextCompare快得多。