Как написать функцию, которая может объединять два столбца неопределенной длины - PullRequest
0 голосов
/ 10 мая 2019

У меня есть таблица в Excel, в которой есть два столбца, назовите их тегами и примечанием.

Теги могут быть пустой ячейкой или одним тегом, или несколькими тегами, разделенными запятой.(каждый тег представляет собой строку)

Примечание - это просто произвольное предложение (примечание).

Обратите внимание, что тег / теги НЕ отражают конкретную заметку.

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

Моя функция должна работать, если я введу новую строку / строки.

Пока что я думаю, что мне удалось найти функцию, которая может читать конец моей таблицы.Теперь мне нужно иметь возможность обрабатывать столбец A (теги) в определенном формате, а затем объединять мои обработанные столбцы в формат, подобный следующему:

{"id": 0, "note": "содержимое colB "," tags ": [" tag1 "," tag2 "и т. д.]}

Вот что у меня есть: (

Sub Parse()

ActiveWorkbook.Sheets.Add.Name = "Result"

idindex = 0

For Each Line In Sheets("Template").Range("B2:B" & 
Sheets("Template").Range("B2").End(xlDown).Row)

Я незнаком с VBA, но если я смогу понять, как обрабатывать столбцы и добавить идентификатор, я думаю, что смогу выяснить форматирование.

1 Ответ

1 голос
/ 10 мая 2019

Возможно, вам захочется посмотреть это для получения хорошей информации о том, как найти «последнюю» строку в диапазоне / столбце / листе / и т. Д.Также рекомендуется использовать Option Explicit, который заставляет вас объявлять все переменные (помогает предотвратить опечатки и другие трудно отслеживаемые ошибки, возникающие в результате неявной типизации и т. Д.).

Это довольно простые манипуляции со строками.Вам нужно будет использовать некоторые встроенные функции VBA, такие как Join, Split и т. Д., И вам нужно будет экранировать кавычки, так чтокак это:

Sub Parse()
Dim thisCell As Range
Dim id As Long
Dim columnRange As Range
Dim note As String
Dim tags As String
Dim output As String
ActiveWorkbook.Sheets.Add.Name = "Result"

id = 0
With Sheets("Template")
    Set columnRange = .Range("B2:B" & .Range("B2").End(xlDown).Row)
    For Each thisCell In columnRange
        note = thisCell.Value
        tags = thisCell.Offset(0, -1).Value
        output = FormatOutput(id, note, tags)
        ' Remove the next line unless you want to print on the same worksheet in column C:
        thisCell.Offset(0, 1).Value = output
        ' This line prints to the Result sheet:
        Sheets("Result").Cells(id + 1, 1) = output
        id = id + 1
    Next
End With

End Sub

Я сделал эту необычную функцию для форматирования вывода на основе параметров: id, thisNote (строка) и theseTags (мы ожидаем, что это строка с разделителями-запятыми)тегов).Я считаю, что при создании сценариев проще создать запчасти , а не пытаться отслеживать все мои цитаты и выяснить, правильно ли они экранированы / etc.:

Function FormatOutput(id As Long, thisNote As String, theseTags As String) As String
    Const OPEN_ITEM As String = "{""id"":"
    Const OPEN_NOTE As String = " ""note"":"
    Const OPEN_TAGS As String = " ""tags"": ["
    Const CLOSE_ITEM As String = "]}"
    Const DBLQUOTE As String = """"
    Const COMMA As String = ","

    FormatOutput = OPEN_ITEM & CStr(id) & _
                OPEN_NOTE & DBLQUOTE & thisNote & DBLQUOTE & COMMA & _
                OPEN_TAGS & _
                    IIF(Len(Trim(theseTags)) = 0, "", _
                    DBLQUOTE & Join(Split(theseTags, COMMA), DBLQUOTE & COMMA & DBLQUOTE) & DBLQUOTE) & _
                CLOSE_ITEM
End Function

Иэто дает мне вывод вроде:

{"id": 0 "note": "this note", "tags": ["tag1", "tag3", "tag5"]}

Он обрабатывает заметки без тегов и наоборот:

enter image description here


Эта функция (FormatOutput) это мозги, стоящие за этой операцией.Это должно (надеюсь) быть довольно простым, но эта часть будет немного сложнее, если вы не знакомы со встроенными модулями:

DBLQUOTE & Join(Split(theseTags, COMMA), DBLQUOTE & COMMA & DBLQUOTE) & DBLQUOTE 

Это гарантирует, что мы завернем каждую из наших подстрок тега в кавычки длявыход.DBLQUOTE в начале ставит " перед первым элементом, а также в конце ставит " после последнего элемента.

Затем мы (Split(theseTags, COMMA)) разбиваем строку с разделителями на запятые и Join возвращаем их с новым разделителем "," между каждым.

Нам нужно сделать все этоtomfoolery, потому что мы строим строку, содержащую кавычки, которые в противном случае рассматриваются как начало или конец строки.

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