Do While,Loop在初始循环后没有找到文件

时间:2012-12-31 15:47:04

标签: excel vba

循环工作,直到我添加了If / ElseIf语句来区分以“N”或“V”开头的两个不同文件。一切似乎都没问题,但是在它最初循环后它会跳过如果声明进入elseif。我正在本地窗口观看并正确分配下一个文件,但脚本将其视为开头时没有“V”,当它确实存在时。建议?谢谢!

这件事有问题:

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

3 个答案:

答案 0 :(得分:3)

正如Remy Porter所说,你每次使用Dir函数时都会重复使用Dir函数。

If filename = Dir(folderPath & "V*" & "*.xls") Then
此行将再次从该路径中抓取V**.xls的第一个匹配项。这当然不是你想要的。

在Excel VBA中,您可以使用like作为最简单的解决方案:
If filename like "N*.xls" Then

(你不应该使用那些双**

答案 1 :(得分:2)

而不是: -

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
  • 使用V
  • 查找.xlsinstr的另一种方法

e.g。 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

答案 2 :(得分:1)

Dir是一种混乱的功能。在没有参数的情况下调用Dir会返回对Dir的 last 调用,并获取符合该条件的下一个文件。所以你的最后一行filename = Dir现在正在获取下一个文件,该文件符合if或elseif中的Dir标准。

您应该使用the filesystem objects代替。