我们的服务器上有一个包含办公文档的巨大文件夹。IT 想要将文件夹的名称从 更改为Mehper_repository
。Planning_reports
由于子文件夹中的大多数 Excel 文件都相互链接,因此我需要查找并替换包含 的每个单元格内容\\FileSrv\Mehper_repository\
。\\FileSrv\Planning_reports\
问题是,Excel 的查找/替换实用程序只能在工作表或工作簿中搜索。我如何才能在文件夹/子文件夹中搜索公式并替换该表达式?
答案1
我建议商业产品电力GREP:
PowerGREP 是一款功能强大的 Windows grep 工具。快速搜索 PC 或网络上的大量文件,包括文本和二进制文件、压缩档案、MS Word 文档、Excel 电子表格、PDF 文件、OpenOffice 文件等。使用强大的文本模式(正则表达式)指定您想要的形式而不是文字文本来查找您想要的信息。搜索和替换使用一个或多个正则表达式来全面维护网站、源代码、报告等。从日志文件和大型数据集中提取统计数据和知识。
答案2
以 TomWij 的答案为基础,循环遍历所有单元格,查找对“\FileSrv\Mehper_repository\”的引用,并将其替换为“\FileSrv\Planning_reports\”。您可能能够使用 Cells 集合来更快地完成此操作,但这可能会以不良方式弄乱公式(尤其是因为该字符串不会被隔离)。
尝试在 StackOverflow 上询问有关编写 VBA 的问题,与在 SuperUser 上相比,您更有可能在那里获得与编程相关的回复。
答案3
宏观方法:
我无法准确回答这个问题,但是如果使用宏程序,你唯一要做的就是逐个打开文件并运行宏,那会怎么样?如果集合不是太大,这可能是可行的,如果不是,你可能不得不想出一个自定义解决方案的编程...
编写自定义自动解决方案:
根据 A. Scagnelli 的回答,你可以采用自己喜欢的 .NET 语言并执行(C# 示例):
- 递归地枚举子目录。
- 枚举每个文件在找到的所有目录中,过滤 excel 扩展名。
- 按如下方式自动化 Microsoft Excel:http://support.microsoft.com/kb/302084
- 并以如下方式替换文本:如何替换 Excel 电子表格中的文本?
伪代码:
openExcel
// Fills the list recursively with aboslute paths of the subfolders of path.
enumerateFolder(list, path)
// Enumerate paths.
foreach(path in list)
{
// Enumerate files
foreach(file in path)
{
openFileInExcel
replaceFileContents
closeFileInExcel
}
}
closeExcel
解释:
递归调用时,只需传递父目录的路径和列表的引用即可。这样,您就可以获得可以在双循环中枚举文件的文件夹列表。
在整个算法过程中保持 Excel 打开,只需在内部循环中“打开、替换和关闭”即可。