1

循环一直在工作,直到我添加了 If/ElseIf 语句来区分以“N”或“V”开头的两个不同文件。一切似乎都很好,但在它最初循环之后,它会直接通过 If 语句跳到否则。我在本地窗口中观看,它正在正确分配下一个文件,但是脚本将其视为开始时没有“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
4

3 回答 3

3

正如 Remy Porter 所指出的,您对 Dir 函数的重复使用会在每次使用时抓取混乱的条目。

If filename = Dir(folderPath & "V*" & "*.xls") Then
这条线将再次V**.xls从该路径中获取第一个匹配项。这肯定不是你想要的。

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

(而且你不应该使用那些 double **

于 2012-12-31T16:08:34.067 回答
2

而不是这个: -

If filename = Dir(folderPath & "V*" & "*.xls") Then
  • 使用 a 执行以下操作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.xls使用的方法instr

例如文件名=“Vvtmvy89file.xls”

代码:

If InStr(Left(filename,1),"V") > 0 then 
  If InStr(filename, ".xls") > 0 then
    '-- Do Something
  End If
End IF

PS:更新了代码以获得准确的Regex.

于 2012-12-31T16:05:03.007 回答
1

Dir 是一种混乱的功能。不带参数调用 Dir 会回顾对 Dir 的最后调用,并获取满足该条件的下一个文件。因此,您的最后一行filename = Dir现在正在获取满足 if 或 elseif 中的 Dir 标准的下一个文件。

您应该改用文件系统对象

于 2012-12-31T16:05:07.577 回答