Excel VB循环文件夹并运行宏

Excel VB循环文件夹并运行宏,excel,vba,Excel,Vba,我试过这个代码,但似乎不起作用。谁能告诉我为什么 Sub ProcessFiles() Dim Filename, Pathname As String Dim wb As Workbook Pathname = ActiveWorkbook.Path & "C:\Macro\" Filename = Dir(Pathname & "*.xls") Do While Filename <> "" Set wb

我试过这个代码,但似乎不起作用。谁能告诉我为什么

Sub ProcessFiles()
    Dim Filename, Pathname As String
    Dim wb As Workbook

    Pathname = ActiveWorkbook.Path & "C:\Macro\"
    Filename = Dir(Pathname & "*.xls")
    Do While Filename <> ""
        Set wb = Workbooks.Open(Pathname & Filename)
        DoWork wb
        wb.Close SaveChanges:=True
        Filename = Dir()
    Loop
End Sub

Sub DoWork(wb As Workbook)
    With wb
       Range("A1").Select
        ActiveCell.FormulaR1C1 = "Name"
        Range("B1").Select
        ActiveCell.FormulaR1C1 = "Anil"
        Range("A2").Select
    End With
End Sub
子进程文件()
Dim文件名,路径名为字符串
将wb设置为工作簿
Pathname=ActiveWorkbook.Path&“C:\Macro\”
Filename=Dir(路径名和“*.xls”)
文件名“”时执行此操作
设置wb=Workbooks.Open(路径名和文件名)
销钉wb
wb.Close SaveChanges:=真
Filename=Dir()
环
端接头
子工作(wb作为工作簿)
与wb
范围(“A1”)。选择
ActiveCell.FormulaR1C1=“名称”
范围(“B1”)。选择
ActiveCell.FormulaR1C1=“Anil”
范围(“A2”)。选择
以
端接头

我发现了两个值得关注的领域。首先,

Pathname=ActiveWorkbook.Path&“C:\Macro\”

这将返回类似于“C:\Users\[USER NAME]\[FILELOCATION]C:\Macro\(这是我的输出C:\Users\Developer\DesktopC:\Macro\”)的内容

检查这一点的简单方法是放置

MsgBox路径名

之后

Pathname=ActiveWorkbook.Path&“C:\Macro\”

Pathname=ActiveWorkbook.Path&“C:\Macro\”

MsgBox路径名

并运行代码。这将向您显示主要问题的路径名。如果您计划打开/修改的excel文件与ActiveWorkbook位于同一目录中,则这将正常工作

Pathname=ActiveWorkbook.Path&“\”

(完成后删除Msgbox路径名。)

第二个问题是Do While循环。您当前将其设置为仅在文件名不等于“”时执行循环。但是,当您进入循环时,将文件名设置为“”,文件名为Dir()。如果不打算遍历文件夹,则可以使用单个If语句。如果确实打算遍历文件夹,请继续执行do While语句,但最终需要修改Filename=Dir()


希望能有所帮助。

这可能是您的问题:

Pathname=ActiveWorkbook.Path&“C:\Macro\”

ActiveWorkbook.Path
已返回
C:\yourtPathToWorkbook
,因此您的
路径名可能类似于:

C:\yourpathtoworkbookC:\Macro\


您应该使用F8单步执行代码,并在变量以黄色突出显示时将鼠标悬停在变量上方。

此问题的原始帖子中已给出可能重复的答案。+1可帮助提醒您使用调试器。您可以“悬停”或(我的首选项)您可以将变量和表达式添加到“监视”窗口中,这样您就可以在不悬停的情况下查看多个变量的变化(而且,悬停并不总能得到您想要的)。您还可以使用Debug.print(您的表达式)并查看“立即”窗口(您可以在“查看”菜单下找到该窗口)@Floris完全同意调试方面的观点。实际上,我自己更喜欢本地窗口,但我注意到,除非你速度快,否则很难在这里找到答案。因此,为了简洁起见,我省略了这个细节