Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выделение текста от и до заданного тега в Excel`e

24K
31 января 2007 года
PersY
3 / / 31.01.2007
Нужна помощь, в макросах полный ноль ;(

Задача -- выделить жирным(курсивом) все что находиться среди двух заданных тегов.

Например задано: 1й тег -- <b> 2й тег -- </b>

Текст:
<b>Заголовок</b> текст другой текст и <i>еще курсив</i>.
Результат:
Заголовок текст другой текст и еще курсив.

Есть готовый код, но выделяет только по 1 слову в ячейке, и не делает курив вообще.

Код:
Sub ReplaceTags(OpenTag As String, CloseTag As String)
    Dim x1 As Integer
    Dim x2 As Integer
    Dim s As String

    x1 = InStr(ActiveCell.Text, OpenTag)
    x2 = InStr(ActiveCell.Text, CloseTag)
    If x1 = 0 Or x2 = 0 Then Exit Sub
    s = Mid(ActiveCell.Text, x1 + Len(OpenTag), x2 - x1 - Len(OpenTag))
   
    ActiveCell.Value = Replace(ActiveCell.Text, OpenTag, "")
    ActiveCell.Value = Replace(ActiveCell.Text, CloseTag, "")
 
    If Mid(OpenTag, 2, 1) = "b" Then ActiveCell.Characters(x1, Len(s)).Font.Bold = True
    If Mid(OpenTag, 2, 1) = "i" Then ActiveCell.Characters(x1, Len(s)).Font.Italic = True
       
End Sub

Sub StartReplaceTags()
    Dim r As Range
    Dim firstadress As String
   
    Set r = Cells.Find(What:="<*>*</*>", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
    If Not r Is Nothing Then
        firstadress = r.Address
        Do
            r.Activate
            ReplaceTags "<b>", "</b>"
            ReplaceTags "<i>", "</i>"
            Set r = Cells.FindNext(r)
            If r Is Nothing Then Exit Do
        Loop While r.Address <> firstadress
    End If
End Sub


Помогите довести до ума.:confused:
275
31 января 2007 года
pashulka
985 / / 19.09.2004
Попробуйте использовать что-то вроде нижеопубликованного варианта (который необходимо разместить в стандартном модуле той рабочей книги, где Вы предполагаете осуществить задуманные действия)

Код:
Private Sub ChangeFormatHTMLTag()

Application.ScreenUpdating = False

Dim iCell As Range, iStart%, iEnd%
Dim iOpenTag$, iCloseTag$, iHTMLTag

With ThisWorkbook.Worksheets(1)
     'укажите свою книгу/лист, лист не должен быть защищён (97, 2000)
     'т.к. возможность изменения параметров форматирования
     'нижеуказанным способом появилась только в MS Excel XP
     '(при установке опции разрешить форматирование ячеек)
     For Each iHTMLTag In Array("<B>*</B>", "<I>*</I>")
         Set iCell = .UsedRange.Find _
         (What:=iHTMLTag, LookIn:=xlValues, LookAt:=xlPart)
         If Not iCell Is Nothing Then
            iOpenTag = Left(iHTMLTag, 3)
            iCloseTag = Right(iHTMLTag, 4)
            Do Until iCell Is Nothing
               If Not iCell.HasFormula Then
                  'Если Вы уверены, что у Вас нет формул, которые
                  'могут возвращать текст содержащий нужные тэги, то
                  'проверку можно убрать
                  iStart = InStr(1, iCell, iOpenTag, vbTextCompare)
                  iEnd = InStr(1, iCell, iCloseTag, vbTextCompare)
                  Do
                     With iCell.Characters _
                          (Start:=iStart, Length:=iEnd - iStart)
                          If iHTMLTag = "<B>*</B>" Then
                             .Font.Bold = True
                          Else
                             .Font.Italic = True
                          End If
                     End With
                     iCell.Characters(Start:=iStart, Length:=3).Text = ""
                     iCell.Characters(Start:=iEnd - 3, Length:=4).Text = ""
                     
                     iStart = InStr(1, iCell, iOpenTag, vbTextCompare)
                     iEnd = InStr(1, iCell, iCloseTag, vbTextCompare)
                  Loop While (iStart <> 0 And iEnd <> 0) 'maybe ...
               End If
               Set iCell = .UsedRange.FindNext(After:=iCell)
            Loop
         End If
     Next
End With

Application.ScreenUpdating = True

End Sub
24K
31 января 2007 года
PersY
3 / / 31.01.2007
Спасибо, решил другим способом.
Надо было удалять теги не всей ячейки а именно те что форматировались.
Код:
Sub ReplaceTags(OpenTag As String, CloseTag As String)
    Dim x1 As Integer
    Dim x2 As Integer
    Dim s As String

    x1 = InStr(ActiveCell.Text, OpenTag)
    x2 = InStr(ActiveCell.Text, CloseTag)
    If x1 = 0 Or x2 = 0 Then Exit Sub
    s = Mid(ActiveCell.Text, x1 + Len(OpenTag), x2 - x1 - Len(OpenTag))

    ActiveCell.Characters(x1, Len(OpenTag)).Delete
    ActiveCell.Characters(x2 - Len(OpenTag), Len(CloseTag)).Delete
   
    If Mid(OpenTag, 2, Len(OpenTag) - 2) = "b" Then ActiveCell.Characters(x1, Len(s)).Font.Bold = True
    If Mid(OpenTag, 2, Len(OpenTag) - 2) = "i" Then ActiveCell.Characters(x1, Len(s)).Font.Italic = True
    If Mid(OpenTag, 2, Len(OpenTag) - 2) = "sup" Then ActiveCell.Characters(x1, Len(s)).Font.Superscript = True
   
End Sub

Sub StartReplaceTags()
    Dim r As Range
    Dim firstadress As String
   
    Set r = Cells.Find(What:="<*>*</*>", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
    If Not r Is Nothing Then
        firstadress = r.Address
        Do
            r.Activate
            ReplaceTags "<b>", "</b>"
            ReplaceTags "<i>", "</i>"
            ReplaceTags "<sup>", "</sup>"
            Set r = Cells.FindNext(r)
            If r Is Nothing Then Exit Do
        Loop While r.Address <> firstadress
    End If
End Sub
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог