从input框中跳过具有相同名称的目录中的文件

我正在创build一个打开的代码,并从基于客户名称select的文件中导入数据。 每打开一个客户端,都会为他们保存一个文件,其中包含他们的姓名和出生date(不含斜杠)。

示例文件看起来像C:\Data\Clients\John Doe 01011900.xlsx 。 单击button上的InputBox提供了一个客户端的名字,但是如果在文件夹中有两个或更多的John Does,

 Check = Application.InputBox(prompt:="What is your client's first and last name?", Type:=2) FilePath = "C:\Data\Clients\" & Check & "*.xlsx" If Dir(FilePath, vbDirectory) = "" Then Exit Sub End If DOB = MsgBox("Is this your client's date of birth? " & " " & Chr(149) & " " & Mid(Dir(FilePath), Len(Dir(FilePath)) - 12, 2) & "/" & Mid(Dir(FilePath), Len(Dir(FilePath) - 10, 2) & "/" & Mid(Dir(FilePath), Len(Dir(FilePath) - 8, 4) & " " & Chr(149), vbYesNoCancel) If DOB = vbYes Then Workbooks.Open (FilePath) 'Transfer Data ActiveWorkbook.Close False ElseIf DOB = vbNo Then 'Try again. ElseIf DOB = vbCancel Then 'Do nothing. End If 

我的困惑发生在DOB = vbNo,当有人说出生date不匹配(意味着下一个同名的客户需要被选中)。 到目前为止,其他一切都很好,所以我只需要重新select下一个具有相同名称的文件。

您可以在循环结束处添加一个strDir = Dir循环所有匹配项,在匹配成功并且不被接受后退出(因为StrDir的长度为0)

更新

我意识到代码看起来有点奇怪,但是这是Dir工作方式,也就是说每次调用它时都会查找与初始Dir相同的匹配,直到到达列表的末尾。 请参阅使用VBA循环访问文件夹中的文件?

 Do While Len(strDir) > 0 DOB = MsgBox("Is this your client's date of birth?", vbYesNoCancel) If DOB = vbCancel Then Exit Do If DOB = vbYes Then Workbooks.Open (filepath) ActiveWorkbook.Close False Exit Do End If strDir = Dir Loop 

这是我会做的:首先,使用string比较来查找以John Doe开头的目录中的所有文件,并将它们存储在一个dynamic数组中。

使用For...Each语句通过文件,并使用Dir(FilePath) LIKE "John Doe*"find你的候选人。

然后使用Do...While循环遍历数组中的文件,直到find匹配项。

我可以为你写完整的代码,但是你会错过所有的乐趣…