Vlookup ou VBA para obter dados específicos de muitas células individuais

0

Eu tenho um estranho. Eu extraio dados de um aplicativo em uma planilha do Excel para fazer uma análise de alto nível. Eu tenho uma coluna, chamada History, e ela pode ter várias entradas dentro de uma única célula, em vez de uma data simples, etc. Aqui está um exemplo:

Aqui está outro exemplo

O que eu preciso é o primeiro ou mais antigo carimbo de data / hora na célula em que o Technical / other approvers added está abaixo (destacado). Dito de uma maneira diferente, aquela que está no fundo. Eu olhei através de uma dúzia de registros e isso parece ser verdade. Há momentos em que há apenas uma entrada com um carimbo de data / hora e os aprovadores técnicos / outros adicionados abaixo na célula, sem outros dados. Isso está me enlouquecendo porque ele tem os dados de que eu preciso, mas não consegue.

    
por Ducatiduke 26.08.2016 / 09:24

2 respostas

1

Se eu entendi corretamente, o seguinte deve funcionar. A Expressão Regular retornará a data last na célula (e deve estar no formato exibido), onde a própria linha próxima começa com a frase " Technical / outros aprovadores "

Option Explicit
Function LastDate(S As String) As String
    Dim RE As Object, MC As Object

Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "[\s\S]+((?:\d{2}-){2}\d{4}\s(?:\d{2}:){2}\d{2}).*[\n\r]+Technical/other approvers.*"
    .ignorecase = True
    .MultiLine = True
    .Global = False
    If RE.test(S) = True Then
        Set MC = RE.Execute(S)
        LastDate = MC(0).submatches(0)
    End If
End With

End Function

EDITAR:(porsugestãodeRaystafarian)Ocódigoacimausaoqueéchamadolate-binding.Sevocêestáusandoissoapenasemsuaprópriamáquina,early-bindingseriapreferível,poisvocêtemavantagemdoIntellisenseaoinserirocódigo.Sefordistribuído,podenãosertãosimplescomovocêprecisariadefinirreferênciasemtodososcomputadoresdosdestinatários.

Odesempenhodevesermelhorado.Noentanto,seissoéperceptíveldependeriadotamanhodoseubancodedados.

Aquiestáocódigoreescritoparaaproveitaravinculaçãoantecipada.

OptionExplicit'UsingEarlyBinding'SetReference(Tools/References)toMicrosoftVBScriptRegularExpressions5.5FunctionLastDate2(SAsString)AsStringDimREAsRegExp,MCAsMatchCollectionSetRE=NewRegExpWithRE.Pattern="[\s\S]+((?:\d{2}-){2}\d{4}\s(?:\d{2}:){2}\d{2}).*[\n\r]+Technical/other approvers.*"
    .ignorecase = True
    .MultiLine = True
    .Global = False
    If RE.test(S) = True Then
        Set MC = RE.Execute(S)
        LastDate2 = MC(0).submatches(0)
    End If
End With

End Function
    
por 27.08.2016 / 03:01
0

Algo fácil seria um loop, eu prefiro for loops, mas um do until pode funcionar melhor.

Sub Macro1()
Dim searchRange As Range
Dim searchString As String
Dim cellValue As String
Dim myCell As Range
Dim foundCell As Range
Set searchRange = Range("A2:A10")
searchString = "Technical/other approvers"

For Each myCell In searchRange
    cellValue = myCell
    If InStr(cellValue, searchString) Then
        Set foundCell = myCell
        Exit For
    End If
Next
MsgBox "found at " & myCell.Address

Dim myTimeStamp As String
Dim endString As Long
endString = InStr(myCell, " - ")

myTimeStamp = Left(myCell, endString - 1)
MsgBox myTimeStamp

End Sub

Claro, se fosse eu, eu teria

lastRow = cells(rows.count,1).end(xlup).row
dim i as long
for i = 1 to lastRow
  cellValue = cells(i,1)
  ...
    
por 26.08.2016 / 13:27