在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 
  • 另一种方法来查找是否有使用instrV.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标准。

您应该使用文件系统对象 。