У меня странный. Я извлекаю данные из приложения в электронную таблицу Excel, чтобы провести анализ на высоком уровне. У меня есть один столбец, который называется «История», и он может содержать множество записей в одной ячейке вместо простой даты и т.д. Вот пример:

Вот еще один пример

То, что мне нужно, это первая или самая ранняя отметка времени в ячейке, где добавлены технические / другие утверждающие, ниже (выделено). Сказано по-другому, тот, что в самом низу. Я просмотрел 3 дюжины записей, и это похоже на правду. В некоторых случаях в ячейке есть только одна запись с отметкой времени, а технические / другие утверждающие добавляются в ячейку без других данных. Это сводит меня с ума, потому что у меня есть данные, которые мне нужны, но не могу их найти.

2 ответа2

1

Если я вас правильно понимаю, должно работать следующее. Регулярное выражение вернет последнюю дату в ячейке (и она должна быть в указанном вами формате), где следующая строка начинается с фразы « Технические / другие утверждающие »

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

РЕДАКТИРОВАТЬ: (согласно предложению Raystafarian) Приведенный выше код использует то, что называется поздним связыванием. Если вы используете это только на своем компьютере, раннее связывание будет предпочтительнее, так как при вводе кода у вас будет преимущество Intellisense. Если это будет распространяться, это может быть не так просто, как вам нужно будет установить ссылки на всех компьютерах получателей.

Производительность должна быть улучшена. Однако, будет ли это заметно, зависит от размера вашей базы данных.

Вот код, переписанный для раннего связывания.

Option Explicit
'Using Early Binding
'Set Reference (Tools/References) to Microsoft VBScript Regular Expressions 5.5

Function LastDate2(S As String) As String
    Dim RE As RegExp, MC As MatchCollection

Set RE = New 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)
        LastDate2 = MC(0).submatches(0)
    End If
End With

End Function
0

Что - то легко будет петля, я предпочитаю for петель , но do until может работать лучше.

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

Конечно, если бы это был я, я бы

lastRow = cells(rows.count,1).end(xlup).row
dim i as long
for i = 1 to lastRow
  cellValue = cells(i,1)
  ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .