【发布时间】:2017-04-12 10:58:37
【问题描述】:
好的,所以我认为自己是 Excel VBA 专家(尽管我已经有一段时间没有做太多事情了)但我对这个问题感到困惑 - 这显然意味着它非常简单,但我忽略了由于我的傲慢:D
我正在使用分配给全局变量的 FileSystemObject(称为“myFSO” - 原始的,我知道...)并使用另外两个全局变量 - xFolder 和 xFile - 来遍历文件夹中的所有文件,并且对文件夹中的每个文件执行操作。
这是代码:
Global myFSO As FileSystemObject
Global xFolder As Scripting.Folder
Global xFile As Scripting.File
Public Sub GetData()
Set bgd = ThisWorkbook.Sheets("BGD")
Set myFSO = New FileSystemObject
Set xFolder = myFSO.GetFolder(bgd.Range("C4").Value)
For Each xFile In xFolder.Files
<do stuff here>
Next xFile
End Sub
因此,当我单步执行代码时,我可以看到 xFolder 已正确分配。如果我添加手表或插入
Debug.Print xFolder.Files.Count
在代码中,它会返回正确的文件数,所以一切似乎都设置得很好,可以进入 For 循环并做它需要做的事情。
一旦我越过 For Each... 语句行,代码就会运行到例程的末尾,完全忽略了嵌套在 For Each... Next 代码中的整个代码。它甚至没有进入“Next xFile”行。如果我将循环修改为
For i = 1 to xFolder.Files.Count
并以这种方式执行该过程,它可以正常工作。所以,这不是生死攸关的问题,因为我可以做我想做的事,我只是想知道是否有人能说出为什么“For Each”方法不起作用。
【问题讨论】:
-
你可以在你的
For Each xFile In xFolder.Files中发布你的代码吗,当我用bgd.Range("D" & i).Value = xFile.Name测试它时,它会在“D”列中显示我所有的文件名。 -
只是很生气,为什么你将这些变量声明为
global,至少对于Global xFile As Scripting.File来说,拥有这个global没有任何意义? -
你的错误设置是什么?如果它直接转到
End Sub,则可能意味着生成了一个被设置掩盖的错误。检查 Err 对象。 -
@peh - 老实说,没有理由为什么它们是全局的,通常我在更大的项目中使用这些相同的变量名,其中变量在单个例程之外使用......我想我只是这样做是出于习惯:)
-
@VincentG - 代码中没有错误处理,总体思路是我过去成功使用了 100 次。如果我添加一个错误处理程序,它不会被调用,表明没有实际错误