Como extrair o padrão de um caminho de pasta (Excel VBA)

0

Eu sou muito novo para o excel e tentando reorganizar uma estrutura de arquivos muito grande. Basicamente, todo o nosso equipamento tem um tag na forma de [A-Z] [0-9] 0-9] [0-9] [A-Z], e. J452G sendo um compressor. Cada equipamento tem uma pasta com o seu nome (por exemplo, "C: \ Users \ Ron \ Documents \ J452G" consiste em desenhos, subpastas, excel, pdfs, ..). O problema é que eu gostaria de copiar essas pastas de equipamentos para um novo diretório, de modo que todas as tags de equipamentos tenham uma pasta dentro de um único diretório (para facilitar a busca alfabética). Agora essas pastas são distribuídas em uma estrutura de pastas em forma de árvore com muitas subpastas.

O que eu gostaria de fazer é

  1. Extraia os caminhos de arquivo (por exemplo, "C: \ Users \ Ron \ Documents \ J452G") "Isso eu já consegui fazer
  2. Procure o padrão [A-Z] [0-9] 0-9] [0-9] [A-Z] e copie todos os arquivos e subpastas para um novo diretório com o nome do equipamento.

O resultado deve ser uma pasta principal (por exemplo, C: \ Users \ Ron \ Documents) contendo uma pasta para cada tag de equipamento com os documentos correspondentes em anexo.

Estou particularmente empenhado em como extrair o padrão [AZ] [0-9] 0-9] [0-9] [AZ] de uma string, se encontrado, e a atribuição é para o destino: =

por exemplo. C: \ Usuários \ Ron \ Documentos \ Nieuwe map \ iets \ Drogers \ F941E \ copiar conteúdo e subpastas para C: \ Users \ Ron \ Documents \ F941E \

Muito obrigado antecipadamente!

    
por Glenn 23.10.2014 / 09:43

2 respostas

0

O VBA é muito lento para lidar com arquivos, acho que o Python seria a melhor escolha para este. Aqui está um código de exemplo que você pode usar:

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
    
por 24.10.2014 / 14:26
0

Então, o VBA pode lidar com expressões regulares. Legal. Alguém perguntou como Estouro de pilha . Isso deve lidar com qualquer necessidade de correspondência de padrões que você tenha. Ele ainda tem uma boa explicação de como usar expressões regulares se você não estiver familiarizado.

Se você quiser pesquisar apenas o nome atual da pasta / arquivo para esse padrão, aqui está um snippet para cortar um caminho completo até o último bit (seja uma pasta ou arquivo):

'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
    
por 24.10.2014 / 14:58