Extrai o número da string complexa se cair em um determinado intervalo

4

Eu preciso de uma fórmula do Excel (ou macro VBA) que me permita extrair um valor de uma string. A string é uma sequência de palavras, separadas por espaços, em uma única célula. Eu quero a palavra (representando um tamanho de bicicleta) que seja

  • um número (presumivelmente um inteiro, mas isso não é especificado) entre 47 e 60 (ou algum outro intervalo, talvez para ser especificado dinamicamente), ou
  • uma das strings "sm", "med" ou "lg".

Espero que exista exatamente uma palavra qualificadora na string, então, qualquer resposta razoável de tratamento de erros para

  • sem palavras de qualificação ou
  • várias palavras qualificadoras

será aceitável. O tamanho pode estar em várias posições na string. Exemplos:

Cervelo P2 105 5800 56 '15                        the number 56 is the desired result
Cervelo P2 105 54 6000 '15                        the number 54 is the desired result
Cervelo P3 105 5800 60 '15                        the number 60 is the desired result
Cervelo P2 105 5800 sm '15                        the string sm is the desired result

Estou interessado apenas em palavras inteiras então 58 (substring de "5800") não se qualifica.

Neste momento, estou removendo o '15 e, em seguida, extraindo os dois últimos dígitos. Mas essa abordagem funciona somente se o tamanho da bicicleta for o segundo ao último valor. No entanto, como mostrado acima, há casos em que o tamanho está em outras posições na string.

Como posso fazer isso com uma fórmula ou macro VBA no Excel?

    
por carroll 23.08.2015 / 17:55

1 resposta

5

Eu fiz uma solução usando o VBA:

Public Function BikeSize(MinSize As Integer, MaxSize As Integer, datainput As String)
    Dim dataoutput() As Variant
    ReDim dataoutput(0)
    BikeSize = 0
    datasplitted = Split(datainput, " ")
    arraysize = UBound(datasplitted)
    j = 1
    For i = 0 To arraysize
        m = datasplitted(i)
        If m >= MinSize And m <= MaxSize Then
            ReDim Preserve dataoutput(j)
            dataoutput(j) = m
            j = j + 1
        End If
        If m = "sm" Or m = "med" Or m = "lg" Then
            ReDim Preserve dataoutput(j)
            dataoutput(j) = m
            j = j + 1
        End If
    Next i
    totalresults = UBound(dataoutput)
    Select Case totalresults
        Case 0
            BikeSize = 0
        Case 1
            BikeSize = dataoutput(totalresults)
        Case Else
            For i = 1 To totalresults
                wrongresult = wrongresult & dataoutput(i) & " - "
            Next i
            BikeSize = wrongresult
    End Select
End Function

Você tem que abrir macros / Visual Basic, vá para Módulos _ > Adicione o módulo e cole o código no lado direito (veja também Como faço para adicionar o VBA no MS Office? ).

Então, se sua string estiver na célula A1 , seu valor mínimo em C1 , seu valor máximo em D1 e em B1 você simplesmente coloca =BikeSize(C1,D1,A1) para obter o resultado.

Se a string não tiver um número correspondente, ela gerará um zero 0 .

Se a string tiver mais de um número correspondente, ela exibirá todas as correspondências separadas por um traço.

Ele também reconhece sm , med e lg .

    
por 24.08.2015 / 12:12