Удаление тегов из форматированного текста в ячейках Excel - PullRequest
0 голосов
/ 04 мая 2011

Идите со мной на мгновение.

Я создал приложение Access для управления данными для внутреннего проекта в моей компании. Одной из функций этого приложения является запрос к базе данных, затем вывод запросов в электронную таблицу Excel, а затем форматирование электронной таблицы в спецификации.

Одной из ячеек вывода является большой объем текста из поля Rich Text Memo в базе данных. Когда форматированный текст отправляется в Excel, он содержит HTML-теги, указывающие полужирный или курсив , поэтому для вывода необходимо добавить форматирование и удалить теги.

Вот пример текста, который мне нужно отформатировать (этот текст находится в одной ячейке):

For each participant, record 1 effort per lesson delivered

   • Time Spent = # minutes spent on lesson

<strong>OR</strong>
For each participant, record 1 effort per month

   • Time Spent = total # minutes spent on lessons that month

    <strong>Note:</strong> Recording 1 effort per lesson is recommended but not     required
<strong>Note:</strong> Use groups function in ABC when appropriate (see <u>Working With     Groups</u> in ABC document library on the ABC portal)

У меня есть три аккуратные маленькие рекурсивные функции для форматирования текста, вот функция жирного шрифта:

Function BoldCharacters(rng As Range, Optional ByVal chrStart As Long)
'This will find all the "<strong></strong>" tags and bold the text in between.
Dim tagL As Integer
tagL = 8
rng.Select

If chrStart = 0 Then chrStart = 1

b1 = InStr(chrStart, ActiveCell.Value, "<strong>") + tagL
    If b1 = tagL Then Exit Function
b2 = InStr(b1, ActiveCell.Value, "</strong>")

ActiveCell.Characters(Start:=b1, Length:=b2 - b1).Font.Bold = True

'Remove the tags
'ActiveCell.Characters(Start:=1, Length:=1).Delete
'ActiveCell.Characters(Start:=b2 - tagL, Length:=tagL + 1).Delete

'Recursion to get all the bolding done in the cell
Call BoldCharacters(ActiveCell, b2 + tagL + 1)

End Function

Теперь вот проблема. Это хорошо форматирует текст. Но метод «ActiveCell.Characters.Delete» завершается ошибкой , когда я пытаюсь использовать его для удаления тегов, поскольку ячейка содержит более 255 символов. Поэтому я не могу использовать метод удаления.

И когда я делаю это:

With xlApp.Selection
    .Replace what:="<strong>", replacement:=""

Все теги удалены, но форматирование уничтожено! Так какой смысл!?

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

Есть идеи?

Спасибо!

Ответы [ 3 ]

1 голос
/ 04 мая 2011

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

0 голосов
/ 05 мая 2011

Что-то вроде этого может быть полезно:

Sub DoFormat(rng As Range)
    Dim DataObj As New MSForms.DataObject
    Dim s As String, c As Range

    For Each c In rng.Cells
        s = "<html>" & Replace(c.Value, " ", "&nbsp;") & "</html>"
        DataObj.SetText s
        DataObj.PutInClipboard
        c.Parent.Paste Destination:=c
    Next c

End Sub

Вам понадобится ссылка на «Библиотеку объектов Microsoft Forms 2.0»

0 голосов
/ 04 мая 2011

Если это правильно сформированный html (т.е. он всегда имеет закрывающие теги), то вы можете использовать регулярное выражение.

Dim data As String
data = "For each participant, record 1 effort per lesson delivered     • Time Spent = # minutes spent on lesson  <strong>OR</strong> For each participant, record 1 effort per month     • Time Spent = total # minutes spent on lessons that month      <strong>Note:</strong> Recording 1 effort per lesson is recommended but not     required <strong>Note:</strong> Use groups function in ABC when appropriate (see <u>Working With     Groups</u> in ABC document library on the ABC portal)"
Dim r As New RegExp
r.Pattern = "<(.|\n)*?>"
r.Global = True
Debug.Print r.Replace(data, "")

Чтобы использовать объект RegExp, установите ссылку на Регулярные выражения Microsoft VBScript5,5 .

чч

Бен

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