在while循环中循环没有find文件
循环正在工作,直到我添加了If / ElseIf语句来区分以“N”或“V”开头的两个不同文件。所有东西似乎都没问题,但是在最初循环之后,它会跳过If语句elseif。 我正在看本地窗口,正确地分配下一个文件,但是脚本把它看作是在开始的时候没有“V”,当它真的的时候。 build议? 谢谢!
这件事有麻烦:
folderPath = myDir If Right(folderPath, 1) <> "\" Then folderPath = folderPath + "\" filename = Dir(folderPath & "*.xls") Do While filename <> "" Application.ScreenUpdating = False Set wbkCS = Workbooks.Open(folderPath & filename) If filename = Dir(folderPath & "V*" & "*.xls") Then wbkCS.Worksheets("Cut Sheet").Range("S4:S2000").Copy With wbkVer.Worksheets("Cutsheets") .Range("A" & .Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues End With ElseIf filename = Dir(folderPath & "N*" & "*.xls") Then wbkCS.Worksheets("PON Cut Sheet").Range("AV3:AV2000").Copy With wbkVer.Worksheets("Cutsheets") .Range("A" & .Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues End With End If filename = Dir Loop Application.ScreenUpdating = True
正如Remy Porter指出的那样,您每次使用Dir函数时都会重复使用它们。
If filename = Dir(folderPath & "V*" & "*.xls") Then
这条线将再次从这条路线上获取V**.xls
的第一个匹配。 这当然不是你想要的。
在Excel VBA中,您可以使用like
最简单的解决scheme:
If filename like "N*.xls" Then
(你不应该使用这些双**
)
而不是: –
If filename = Dir(folderPath & "V*" & "*.xls") Then
- 使用正则
Regex
执行以下操作
码:
Function ContainsAMatch(ByRef fileName as String) as Boolean Dim regex as Object Dim strtxt As String strtxt = fileName Set regex = CreateObject("VBScript.RegExp") With regex '-- matches first letter to be V and last set to be .xls .Pattern = "^(V)[a-zA-Z0-9]+(.xls)$" .Global = True If regex.Test(strTxt) Then containsAMatch = True Else containsAMatch = False End If End With End Sub
- 另一种方法来查找是否有使用
instr
的V
和.xls
例如Filename =“Vvtmvy89file.xls”
码:
If InStr(Left(filename,1),"V") > 0 then If InStr(filename, ".xls") > 0 then '-- Do Something End If End IF
PS:更新了代码,以确切的正则Regex
。
Dir是一种混乱的function。 调用没有参数的Dir会回顾最后一次调用Dir,并获取符合该条件的下一个文件。 所以你的最后一行, filename = Dir
现在得到下一个文件,要么符合if或elseif中的Dir标准。
您应该使用文件系统对象 。