循环工作,直到我添加了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
答案 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
.xls
和instr
的另一种方法
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代替。