Фильтрация ячеек для объединения по их содержимому - PullRequest
1 голос
/ 03 июня 2019

Я работаю с некоторыми .CSV файлами, которые в основном содержат список транскрибированных комментариев и временных меток, и я хочу использовать VB для объединения некоторых из них. Я сгенерировал сценарий, который делает это «в обход» путем записи макросов, поиска в Google и поиска переполнения стека, однако это требует времени для запуска и использует довольно глупый процесс.

То, что делает мой скрипт, в основном объединяет 1500 записей в столбцах E и F в несколько пустых ячеек, выполняет поиск и замену, чтобы заменить пустые временные метки ничем (и удалить ненужные ведущие нули), копировать все обратно и затем запускать поиск и удаление последних 7 символов (т. е. метки времени ... при условии, что часов нет!), когда найдено несколько конкретных слов запуска. Идея заключается в том, что я хочу, чтобы большая часть диапазона соответствовала друг другу, но не в тех случаях, когда ячейки содержат определенные триггерные слова.

Dim SrchRng As Range, Cel As Range

'Concatenates Comments and timestamps into BA1

        Range("BA1").Select
        ActiveCell.FormulaR1C1 = _
        "=CONCAT(RC[-48],"" ("",TEXT(RC[-47],""hh:mm:ss""),"")"")"
        Range("BA1").AutoFill Destination:=Range("BA1:BA1500"), Type:=xlFillDefault
        Range("BA1:BA1500").Copy
        Selection.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False

'Apply timestamp corrections

        Selection.Replace What:="(00:00:00)", Replacement:=""
        Selection.Replace What:="(00:", Replacement:="("

'Copy column BA1 back into data, then empty

        Range("BA1:BA1500").Copy
        Columns("E:E").PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
        Columns("BA:BA").ClearContents

'Remove timestamps when certain words are found

        Set SrchRng = Range("E1:E1500")

            For Each Cel In SrchRng
                If InStr(1, Cel.Value, "APPLE") > 0 Or _
                    InStr(1, Cel.Value, "ORANGE") > 0 Or _
                    InStr(1, Cel.Value, "BANANA") > 0 Or _
                    InStr(1, Cel.Value, "MANGO") > 0 Then
                    Cel = Left(Cel, Len(Cel) - 7)
                End If
            Next Cel

Я полагаю, что лучший способ сделать это - фильтровать и объединять соответствующие ячейки в первую очередь, а не объединять все, а затем выполнять поиск по ним, чтобы удалять объекты (что также не очень надежно, поскольку временные метки длиннее в любом случае более часа содержат более 7 символов).

Возможен ли этот «фильтрованный конкат», и имеет ли это смысл? Я не уверен, с чего начать, потому что я очень новичок (и, видимо, не очень логичный мыслитель!)

Любые указатели очень ценятся!

Desired Output

Строки с триггерными словами в верхнем регистре APPLE, ORANGE и BANANA не были бы объединены, и поэтому не имеют отметки времени в конце. Строки со словом SCORE в столбце D в идеале также не должны объединяться, но это не является приоритетом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...