Extrair caracteres do caminho da pasta no Excel

3

Eu tenho uma lista enorme de caminhos de pasta como texto em uma planilha do Excel da qual eu gostaria de extrair o número após cada barra invertida. Esses números precisam ser compilados em uma referência abreviada. Por exemplo:

Link original (digamos na célula A1):

c:_Folder_Folder_Folder

Referência abreviada (resultado desejado):

1.2.3

Corrija-me se estiver errado, mas não acho que isso seja possível usando uma fórmula. Se requer o uso de VBA, isso está muito além das minhas habilidades atualmente.

Você pode sugerir uma solução?

    
por BobJim 17.02.2014 / 15:50

5 respostas

4

Este VBA fará o que você quiser. Por favor, note que o meu exemplo apenas olhou da célula A1 para a célula A10 - você precisa atualizar isso para refletir o que você precisa (o intervalo de células)!

Caso você não saiba como fazer isso, adicione o desenvolvedor à faixa de opções. Nos controles, clique em inserir e adicione um botão. Adicione uma nova macro. Insira o seguinte dentro da sub rotina ...

    Dim i As Integer
    i = 1
    For Each c In Worksheets("Sheet1").Range("A1:A10").Cells 'UPDATE THIS ROW ONLY WITH THE RANGE YOU WANT TO USE. This loops through all the cells in the range
        Dim resultsString As String
        resultsString = ""
        Dim splitString() As String
        splitString = Split(c, "\") ' split the value of the current cell by \

        For Each v In splitString
            If v <> "" Then 'only check those with a value
                Dim numberOfDigits As Integer
                numberOfDigits = 0
                For charCount = 1 To Len(v)
                    If IsNumeric(Left(v, charCount)) Then
                        numberOfDigits = charCount ' read how many characters there are (which are numbers)
                    End If
                Next

                If (numberOfDigits > 0) Then
                    resultsString = resultsString & Left(v, numberOfDigits) & "." 'if there are numbers, then read that number of digits from the left
                End If
            End If
        Next

        Dim iLength As Integer
        iLength = Len(resultsString)
        If (iLength > 0) Then ' if there are any values
            Range("B" & i).Value = Left(resultsString, iLength - 1) 'UPDATE THIS ROW ONLY IF YOU WANT TO USE A DIFFERENT COLUMN THAN B TO SHOW RESULTS. This takes the value - 1 character (sicne the last character is a .
        End If

        i = i + 1
    Next  

Eu adicionei uma tela dos resultados

    
por 17.02.2014 / 16:15
3
  1. Ir para dados - texto para colunas
  2. Delimite com base no \
  3. Então você pode usar uma fórmula como =LEFT(A2,1)&"."&LEFT(B2,1)&"."&LEFT(C2,1)

VBA - supondo que seus dados estejam na coluna A

Sub Search_DelimitedSubString_In_String()
Application.ScreenUpdating = False
Dim strFolder As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
j = 1
'Loop through cells
For Each c In Range("A:A")
    'Select non-blanks
    If c.Value <> "" Then
        On Error Resume Next
        For i = 1 To Len(c.Value)
            If Mid(c.Value, i, 1) = "\" Then
                If IsNumeric(Mid(c.Value, i + 1, 1)) Then
                strFolder = strFolder & Mid(c.Value, i + 1, 1) & "."
                End If
            End If

        Next

    Cells(j, 2) = strFolder
    j = j + 1
    End If
 strFolder = ""
 Next c

 For Each c In Range("B:B")
 If c.Value <> "" Then
    k = Len(c.Value)
    c.Value = Left(c.Value, k - 1)
 End If
 Next

Application.ScreenUpdating = True
End Sub
    
por 17.02.2014 / 15:53
2

Supondo que todos os seus dados estão na coluna A, a coluna B se parece com:

DimREAsObjectSetRE=CreateObject("VBScript.RegExp")
RE.Global = True
RE.Pattern = "\(\d+)"

For Each c In UsedRange.Columns(1).Cells
    Set matches = RE.Execute(c)
    ReDim all(matches.Count - 1)
    For i = 0 To matches.Count - 1
        all(i) = matches.Item(i).Submatches(0)
    Next
    c.Offset(0, 1) = Join(all(), ".")
Next

Eu usei o VBA Regex, dois loops e uma matriz Join

O VBA RegEx não suporta lookbehinds ou você pode usar (?<=\)\d+ .

    
por 17.02.2014 / 18:10
0

é importante usar o vba? se você estiver usando a versão 2013 do Excel é muito mais fácil usar o recurso "Flash Fill" para fazer isso ...

O Flash Fill é um recurso para preencher as células pelo padrão das células próximas a elas:

preencha o A1, A2, A3, ... com as strings das quais você deseja extrair caracteres, preencha o B1 como você quer responder:

emB2pressioneCTRL+E,oexcelpreencheráoutrascélulascomovocêdeseja:

    
por 17.02.2014 / 21:21
-1

Se "Pasta" for realmente "Pasta" (e não um nome comum para nomes de pastas especiais), essa fórmula será a mais rápida. Digite-o em B1 e arraste-o para baixo ou clique duas vezes no preenchimento mais:

= SUBSTITUTO (SUBSTITUTO (SUBSTITUTO (A1, "_ Pasta \", "."), "c: \", ""), "_ Pasta", "")

    
por 18.02.2014 / 08:09