我对 vba excel 还不太熟悉,正在尝试重新组织一个非常大的文件结构。基本上,我们所有的设备都有一个标签,格式为 [AZ][0-9]0-9][0-9][AZ],例如 J452G 是压缩机。每台设备都有一个带有其名称的文件夹(例如“C:\Users\Ron\Documents\J452G”包含图纸、子文件夹、excel、pdf 等)。问题是我想将这些设备文件夹复制到一个新目录中,以便所有设备标签都在一个目录中有一个文件夹(以便于按字母顺序搜索)。现在这些文件夹分布在一个树状文件夹结构中,其中包含许多子文件夹。
我想做的是
- 提取文件路径(例如“C:\Users\Ron\Documents\J452G”)'我已经设法做到了
- 查找模式 [AZ][0-9]0-9][0-9][AZ] 并将所有文件和子文件夹复制到以设备名称命名的新目录中。
结果应该是一个主文件夹(例如 C:\Users\Ron\Documents),其中包含每个设备标签的文件夹以及相应的文档。
我特别困惑于如何从字符串中提取模式 [AZ][0-9]0-9][0-9][AZ](如果找到)并将其分配给目标:=
例如 C:\Users\Ron\Documents\Nieuwe map \iets\Drogers\F941E\ 将内容和子文件夹复制到 C:\Users\Ron\Documents\F941E\
提前谢谢了!
答案1
VBA 处理文件的速度太慢,我认为 Python 是更好的选择。以下是您可以使用的示例代码:
import os, re, shutil
rootDir = raw_input("Please enter the search directory: ") #use forward slashes
destDir= raw_input("Please enter the destination directory: ")
directoryList = []
for fold,subFold, f in os.walk(rootDir):
match = re.search(r'.*[A-Z]\d\d\d[A-Z]', fold) #your pattern
if match:
directoryList.append(match.group()) #adds to a list of paths
directoryList = set(directoryList) #eliminate duplicates
for dir in directoryList:
#takes the last part as the folder name
folderName = dir.split('/')[-1]
pasteDir = destDir+folderName
shutil.copytree(dir, pasteDir) #creates the new folder and save files and subfldrs
答案2
事实证明,VBA 可以处理正则表达式。太酷了。 有人问如何在 Stack Overflow 中。这应该可以满足您的任何模式匹配需求。如果您不熟悉正则表达式,它甚至还很好地解释了如何使用正则表达式。
如果您只想在当前文件夹/文件名中搜索该模式,这里有一个代码片段可以将完整路径缩短到最后一位(无论是文件夹还是文件):
'Setup. This is probably not necessary for your already established code
Dim fPath As String, fName As String
fPath = "C:\Users\Ron\Documents\Nieuwe map \iets\Drogers\F941E\"
'Remove any trailing slashes
Do Until Right(fPath, 1) <> Application.PathSeparator
fPath = Left(fPath, Len(fPath) - 1)
Loop
'Extract the last entry
fName = Mid(fPath, InStrRev(fPath, Application.PathSeparator) + 1)
'Print the result (again, probably not necessary for your application)
Debug.Print fName