【问题标题】:VBA to loop through files in subfoldersVBA循环遍历子文件夹中的文件
【发布时间】:2015-02-20 12:53:53
【问题描述】:

我需要修改多个 Excel 文件中的列标题。这些文件位于我要循环遍历的文件夹下两级的子文件夹中(每个文件夹中有 28 个 .xlsx 文件,每个期间一个文件夹)。

文件结构为: "c:\...文件路径...\Period *\Daily Attributions\*.xlsx"

我已经设法得到一些代码来循环遍历文件夹中的每个文件,但我需要帮助来为每个文件夹中的所有文件重复相同的循环。

这是我目前所拥有的。

Sub FirstLast()
'
' FirstLast Macro
'
  Dim sPath As String
  Dim sFile As String
  Dim wb As Workbook

  sPath = "C:\...filepath...\Period 1\Daily Attributions\"
  sFile = Dir(sPath & "*.xlsx")

Do While sFile <> ""

Set wb = Workbooks.Open(sPath & sFile, UpdateLinks:=False)

    Range("E1").Select
    ActiveCell.FormulaR1C1 = "FirstLast"
    ActiveWorkbook.Save
    ActiveWindow.Close
sFile = Dir

  Loop


End Sub

【问题讨论】:

  • 使用与dir() 相同的逻辑创建一个存储在periods 目录中的集合,然后使用For each loop 使用上面相同的代码运行该集合!你离答案不远了。
  • @brettdj 这可能是我对 vba 的理解很差(我对它很陌生),但我已经看到了答案,你建议这是...的副本,我想那是指遍历目录中的文件。我的问题说明我有一个解决方案,但我还需要遍历不同的文件夹。
  • @HalBaggot Aploges,你是对的。这个链接给出了子文件夹,stackoverflow.com/questions/9827715/get-list-of-subdirs-in-vba/…
  • 谢谢,我没有看到这个问题,因为它只使用word 标签。
  • @brettdj 你有没有机会删除或修改去重复标记?除非您专门搜索与单词相关的标签,否则您将找不到链接到的答案。

标签: vba excel


【解决方案1】:

这个答案是我上面评论的说明:

我已经测试过它,它就像魅力一样工作:

Sub FirstLast()
  Dim sPath As String
  Dim sFile As String
  Dim wb As Workbook
  Dim subfolder As String
  Dim subdir As Collection
  Set subdir = New Collection
  Dim maindir As String: maindir = "D:\main\" 
  'Above line is the main directory which is "C:\...filepath...\"
  subfolder = Dir(maindir, vbDirectory)
  Do While subfolder <> ""
  subdir.Add Item:=subfolder
  subfolder = Dir(, vbDirectory)
  Loop
  ' remove . and ..
  subdir.Remove (1)
  subdir.Remove (1)
  For Each m In subdir
  sPath = maindir & "\" & m & "\Daily Attributes"
  sFile = Dir(sPath & "*.xlsx")
  Do While sFile <> ""
  ' do stuff:
  'Set wb = Workbooks.Open(sPath & sFile, UpdateLinks:=False)
  'Range("E1").Select
  'ActiveCell.FormulaR1C1 = "FirstLast"
  'ActiveWorkbook.Save
  'ActiveWindow.Close
  sFile = Dir
  Loop
  Next


End Sub

【讨论】:

  • 就像一个魅力,谢谢...稍作调整以反映我的文件位于子文件夹中。我改变了:sPath = maindir &amp; "\" &amp; m &amp; "\" ...到... sPath = maindir &amp; "\" &amp; m &amp; "\Daily Attributes"
【解决方案2】:
  Sub FirstLast()
'
' FirstLast Macro
'
  Dim sPath As String
  Dim sFile As String
  Dim wb As Workbook

  sPath = "C:\...filepath...\Period 1\Daily Attributions\"
  sFile = Dir(sPath & "*.xlsx")

for i = 1 to 3
'pseudo code 
'"open foldername " & i
'looping through files in folder

Do While sFile <> ""

Set wb = Workbooks.Open(sPath & sFile, UpdateLinks:=False)

Range("E1").Select
ActiveCell.FormulaR1C1 = "FirstLast"
ActiveWorkbook.Save
ActiveWindow.Close
sFile = Dir

 Loop

next i

End Sub

【讨论】:

    【解决方案3】:
    Sub M_snb()
      sn=split(createobject("wscript.shell").exec("cmd /c Dir ""C:\...filepath...\Period *\Daily Attributions\*.xls"" /b /s").stdout.readall,vbcrlf)
    
      for j=0 to ubound(sn)
        with getobject(sn(j))
          .sheets(1).cells(1,5)="firstlast"
          .close -1
        end with
      next
    end sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2021-10-16
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多