首页 > 解决方案 > VBA 循环遍历文件夹中的非模式文件(征求意见)[编辑]

问题描述

我在这里寻求任何建议或意见,因为我想遍历文件夹中的每个 excel 文件。正如您从我所附的图片中看到的那样,我的 excel 文件在文件类型(.xls <> .xlsx)和文件名(尤其是 2018 年)方面都不同。我还需要遍历“已修订”或“已修订”文件,因为下次可能会修改任何文件。

是的,我也对此进行了一些研究。我的理解是,在构建 VBA 循环之前,我需要将所有文件名修改为模式一。起初,我考虑将所有文件名分解并以模式形式放回,但这听起来太理想化了。另一种方法是使用每个文件中的日期来标记工作簿名称,但我再次发现这些日期具有不同的样式。一些文件使用诸如“2012 年 1 月”或“2014 年 3 月”之类的字符串来标记日期,而其他文件则使用诸如“19/08/2013”​​之类的日期形式。

因此,如果有人可以建议我,我将不胜感激;

  1. 如何在同一个 VBA 中处理不同的文件名(.xls 和 .xlsx)?
  2. 我应该如何处理这些不同的文件名(有些文件在后面有“修订”;有些在“Cons”和日期之间没有“-”;有些使用月份名称而不是数字)?它们是我忽略的任何模式吗?

请注意,我只是一个新手 VBA 编码器,所以如果您在回答中留下解释或任何类型的示例,那就太好了。

非常感谢。

-------------------------------------------------- - - - [编辑] - - - - - - - - - - - - - - - - - - - - - --------------------------

首先对我之前的糟糕解释感到抱歉。我提供的信息太少,无法理解整体情况。让我们重新开始。

  1. 我的数据是有关部门每月发布的钢铁消费数据。我的任务是收集所有这些数据(例如每行中每个数据的生产、导入、导出和消费)并生成时间序列模式(请参阅附件的 excel 屏幕)xxx

  2. 由于这些数据可能会随时修改,因此我决定每个月每次都下载所有这些文件(每个月一个文件)。除了那些修改过的文件外,当局还会意外地重命名这些文件,例如,从“Cons 201601.xlsx”到“Cons 201601 - modified.xlsx)”。这让我更难处理这个问题(请参阅附件文件夹以供参考)。在此处输入图像描述

  3. 此外,该权限似乎在文件命名方面存在问题,因为与现在相比,它们过去的文件名模式不同。示例如下表所示;

    缺点 201701-Revised.xlsx
    缺点 201710-Revised1.xlsx
    缺点 201711.xlsx
    缺点200902.xls
    Cons-201212_revise.xls
    Cons-201401-revised.xls

  4. 我提到上面的文件名是为了创建一个 VBA 来遍历这些文件,选择一些内容并按时间顺序粘贴到另一个工作簿中。这意味着我不能在我的 VBA 中使用“Loop while 或 Do while 函数”。起初我决定使用两个整数变量,它们都设置为年和月(例如For i = 2009 to 2018For j = 1 to 12),以创建文件名系统(例如filename = "Cons" & "-" & i & j)。但是,正如我之前所说,权威的非模式名称阻止了我创建这种循环。

  5. 我还尝试使用图 1 中单元格 B2 中的日期来标记日期,以创建我之前已经解释过的循环。然而,该机构再次没有使用相同的模式来记录月份和年份。在我检查了许多文件后,这些是单元格 B2 中日期样式的示例

    2012 年 1 月(字符串)
    2009 年 2 月(字符串)
    1 月 16 日(自定义格式的 2016 年 1 月 1 日日期)

  6. 鉴于上述限制,你们能否再次建议我任何可能的方法来创建时间循环,以便将数据复制并粘贴到另一个工作簿以形成每个产品的一组时间序列数据?

谢谢你的热心帮助 :)

标签: vbaexcel

解决方案


首先,使用FileSystemObject(在您的 VBA 项目中包含对的引用Microsoft Scripting Runtime)其中包含一些有用的功能。你总是可以自己编写代码,但为什么要在这种情况下重新发明轮子呢?

今天早上没有时间编写代码,所以这里是伪代码:

Open a Folder using your known filepath
Loop through all the files in the Folder (For each f in Folder.Files
    extract the date code from your filename (e.g. using RegEx)
    Add to a collection (e.g. array or Dictionary item) of the filename and the extracted date code (your key).
(end loop)
Sort your collection based on the extracted date code

现在,这为您提供了一个有序的文件列表,您可以依次打开并提取数据。一个额外的好处是集合中的键为您提供了一致的日期表示,您可以将其用作整理信息中的索引。


推荐阅读