Возможно, вам захочется посмотреть это для получения хорошей информации о том, как найти «последнюю» строку в диапазоне / столбце / листе / и т. Д.Также рекомендуется использовать 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"]}
Он обрабатывает заметки без тегов и наоборот:
Эта функция (FormatOutput
) это мозги, стоящие за этой операцией.Это должно (надеюсь) быть довольно простым, но эта часть будет немного сложнее, если вы не знакомы со встроенными модулями:
DBLQUOTE & Join(Split(theseTags, COMMA), DBLQUOTE & COMMA & DBLQUOTE) & DBLQUOTE
Это гарантирует, что мы завернем каждую из наших подстрок тега в кавычки длявыход.DBLQUOTE
в начале ставит "
перед первым элементом, а также в конце ставит "
после последнего элемента.
Затем мы (Split(theseTags, COMMA)
) разбиваем строку с разделителями на запятые и Join
возвращаем их с новым разделителем ","
между каждым.
Нам нужно сделать все этоtomfoolery, потому что мы строим строку, содержащую кавычки, которые в противном случае рассматриваются как начало или конец строки.