VBA遍历文件夹文件至Excel时,如何排除含指定关键词的文件?
解决VBA遍历文件夹排除指定文件名的问题
我来帮你搞定这个问题!你用InStr函数的时候踩了个典型的小坑——InStr在找不到目标字符串时返回的是0,而不是负数,所以你的判断条件InStr(oFile.Name, "Position") < 0永远不会触发,自然没法排除包含"POSITION"的文件。
问题根源拆解
InStr函数的返回逻辑是:
- 如果找到匹配的字符串,返回它在目标文本中的起始位置(从1开始计数)
- 如果完全找不到匹配,返回
0
你之前的判断条件不仅写反了逻辑,还误用了比较值,这就是代码不生效的核心原因。
正确实现方案
这里分两种场景给出代码,你可以根据需求选择:
1. 严格区分大小写(仅排除含"Position"的文件)
把判断条件改成检查InStr的返回值是否为0,也就是当文件名里没有"Position"时才写入Excel:
Dim oFSO As Object Dim oFolder As Object Dim oFile As Object Dim i As Integer Dim DNDsh As Worksheet Dim wb As Workbook Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder("H:\Desktop\FILES") Set wb = Workbooks("DOC.xlsm") Set DNDsh = wb.Worksheets("DO NOT DELETE") DNDsh.Range("A:A").ClearContents i = 0 ' 显式初始化计数器,让代码更规范 For Each oFile In oFolder.Files ' 当文件名中不包含"Position"时才写入 If InStr(oFile.Name, "Position") = 0 Then DNDsh.Cells(i + 1, 1) = oFile.Name i = i + 1 End If Next oFile
2. 忽略大小写(排除所有含"POSITION"变种的文件,比如POSITION、position等)
如果需要不区分大小写匹配,给InStr加上vbTextCompare参数即可:
Dim oFSO As Object Dim oFolder As Object Dim oFile As Object Dim i As Integer Dim DNDsh As Worksheet Dim wb As Workbook Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder("H:\Desktop\FILES") Set wb = Workbooks("DOC.xlsm") Set DNDsh = wb.Worksheets("DO NOT DELETE") DNDsh.Range("A:A").ClearContents i = 0 ' 显式初始化计数器 For Each oFile In oFolder.Files ' 忽略大小写检查,不包含任何形式的POSITION就写入 If InStr(1, oFile.Name, "POSITION", vbTextCompare) = 0 Then DNDsh.Cells(i + 1, 1) = oFile.Name i = i + 1 End If Next oFile
另外补充个小细节:原代码里的i变量没有显式初始化,虽然VBA会默认把未初始化的Integer设为0,但手动写i = 0能让代码逻辑更清晰,也避免潜在的未知问题。
内容的提问来源于stack exchange,提问作者Nikolajs
相关产品推荐
相关产品推荐

