Eu estou tentando escrever uma função para o Excel 2010que pegará uma célula de texto não estruturado, procurará algo chamado valor sdi e, se encontrado, retornará esse número. O valor sdi aparecerá como sdi ####. O que eu quero é retornar sdi e os números sepecific que se seguem, por isso, se a célula contiver "algum texto sdi 1234 mais algum texto" a função retornará sdi 1234.
Esta é minha função:
Function SdiTest(LookIn As String) As String
Dim temp As String
Dim STA As Object
temp = ""
Set SDI = CreateObject("VBScript.RegExp")
SDI.IgnoreCase = True
SDI.Pattern = "sdi [1-9]*"
SDI.Global = True
If SDI.Test(LookIn) Then
temp = SDI.Execute(LookIn)
End If
SdiTest = temp
End Function
Se não houver nenhum número sdi, ele nunca entrará na instrução if e retornará obedientemente a string vazia. Se houver um número sdi, recebo #VALUE!
o que estou perdendo?
Sim, o VBScript está ativado. Além disso, estou achando frustrante usar o regex no VBA e é difícil encontrar informações úteis on-line. Links para bons recursos online seriam apreciados.
Obrigado
Respostas:
67 para resposta № 1Você precisa acessar os jogos para obter o número SDI. Aqui está uma função que fará (supondo que haja apenas 1 número SDI por célula).
Para o regex, eu usei "sdi seguido por um espaçoe um ou mais números ". Você tinha" sdi seguido por um espaço e zero ou mais números ". Você pode simplesmente alterar o + para * no meu padrão para voltar ao que você tinha.
Function ExtractSDI(ByVal text As String) As String
Dim result As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
RE.pattern = "(sdi d+)"
RE.Global = True
RE.IgnoreCase = True
Set allMatches = RE.Execute(text)
If allMatches.count <> 0 Then
result = allMatches.Item(0).submatches.Item(0)
End If
ExtractSDI = result
End Function
Se uma célula pode ter mais de um número SDI vocêquero extrair, aqui está a minha função RegexExtract. Você pode passar um terceiro parâmetro para separar cada correspondência (como separados por vírgula) e inserir manualmente o padrão na chamada de função real:
Ex) =RegexExtract(A1, "(sdi d+)", ", ")
Aqui está:
Function RegexExtract(ByVal text As String, _
ByVal extract_what As String, _
Optional seperator As String = "") As String
Dim i As Long, j As Long
Dim result As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
RE.pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)
For i = 0 To allMatches.count - 1
For j = 0 To allMatches.Item(i).submatches.count - 1
result = result & seperator & allMatches.Item(i).submatches.Item(j)
Next
Next
If Len(result) <> 0 Then
result = Right(result, Len(result) - Len(seperator))
End If
RegexExtract = result
End Function
* Por favor, note que eu tirei "RE.IgnoreCase = True" do meu RegexExtract, mas você poderia adicioná-lo de volta, ou até mesmo adicioná-lo como um parâmetro opcional 4, se quiser.