Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2012, 05:27   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию Регулярки, "ComboBoxValue(641)" заменить на "ComboBoxValue()"

Здравствуйте, нужно в строке списка текст "ComboBoxValue(641)" заменить на "ComboBoxValue()", отсортировать и снова расставить номера в скобках
код есть:
Код:
   Количество_списков_в_документе = ActiveDocument.Lists.Count
    Количество_строк_в_списке = ActiveDocument.Lists.Item(1).ListParagraphs.Count
 
    Dim reg As Object
    Set reg = CreateObject("vbscript.regexp")
 
    For q = 1 To Количество_строк_в_списке
        MSComm1Input = ActiveDocument.Lists.Item(1).ListParagraphs(q).Range.Text
        арп0 = Len(MSComm1Input)
        'искать по всему тексту, по умолчанию False - будет найдено только первое совпадение
        reg.Global = True
        'удаляем символы входящие в диапазон знаков между "[" и "]"
        reg.Pattern = "ComboBoxValue(" & [1234567890] & ")"
        MSComm1Input = reg.Replace$(MSComm1Input, "ComboBoxValue()")
        MSComm1Input = ActiveDocument.Lists.Item(1).ListParagraphs(1).Range.Text
        арп1 = Len(MSComm1Input)
    Next q
 
    'выделить всё
    Selection.WholeStory
    'сортировка по абзацам
    Selection.Sort ExcludeHeader:=False, FieldNumber:="абзацам", SortFieldType _
                                                               :=wdSortFieldAlphanumeric, SortOrder:=wdSortOrderAscending, FieldNumber2 _
                                                                                                                         :="", SortFieldType2:=wdSortFieldAlphanumeric, SortOrder2:= _
                   wdSortOrderAscending, FieldNumber3:="", SortFieldType3:= _
                   wdSortFieldAlphanumeric, SortOrder3:=wdSortOrderAscending, Separator:= _
                   wdSortSeparateByTabs, SortColumn:=False, CaseSensitive:=False, LanguageID _
                                                                                :=wdRussian, SubFieldNumber:="абзацам", SubFieldNumber2:="абзацам", _
                   SubFieldNumber3:="абзацам"
На этом этапе не взлетаю, что не так???? Спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 24.01.2012, 11:03   #2
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Неверны маски поиска и замены. Дальше не смотрел.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 24.01.2012, 16:32   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

>Неверны маски поиска и замены
это я понял, так как у меня там не более 999
пробую так
Код:
reg.Pattern = "ComboBoxValue(" & [1234567890] & [1234567890] & [1234567890] & ")"
не взлетает, или нужно придумать с плюсом
Код:
 '+ означает, что заменяем два, три, четыре и более пробелов подряд на один пробел
    reg.Pattern = " +"
пока актуально
Ципихович Эндрю вне форума Ответить с цитированием
Старый 24.01.2012, 17:12   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

разобрался, осталось одно
Код:
'\d - соответствует цифре, то же, что и [0-9]
        '[0-9]{3} - цифра от 0 до 9, которая повторяется три раза в номере
как же указать вместо
которая повторяется три раза в номере
которая повторяется 1, 2 или 3 раза в номере
Ципихович Эндрю вне форума Ответить с цитированием
Старый 24.01.2012, 17:50   #5
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

и ещё не пойму, в строке
Код:
reg.Pattern = "()"
MSComm1Input = reg.Replace$(MSComm1Input, "(q)")
я имею ввиду, что () заменить на (q), где q это переменная, как это пишется?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 24.01.2012, 19:16   #6
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Сделал
Код:
Sub ABC()
'

'выделить всё
    Selection.WholeStory
    'создать нумерованный список по умолчанию
    Selection.Range.ListFormat.ApplyListTemplate ListTemplate:=ListGalleries( _
                                                               wdNumberGallery).ListTemplates(1), ContinuePreviousList:=False, ApplyTo:= _
                                                 wdListApplyToWholeList, DefaultListBehavior:=wdWord10ListBehavior

    Dim Количество_списков_в_документе As Byte
    Количество_списков_в_документе = ActiveDocument.Lists.Count

    Dim Количество_строк_в_списке As Integer
    Количество_строк_в_списке = ActiveDocument.Lists.Item(1).ListParagraphs.Count

    Dim q As Integer
    q = 0

    Dim MSComm1Input As String
    MSComm1Input = ""

    Dim reg As Object
    Set reg = CreateObject("vbscript.regexp")

    For q = 1 To Количество_строк_в_списке
        MSComm1Input = ActiveDocument.Lists.Item(1).ListParagraphs(q).Range.Text
        'искать по всему тексту, по умолчанию False - будет найдено только первое совпадение
        reg.Global = True
        '\d - соответствует цифре, то же, что и [0-9]
        '+ означает, что заменяем два, три, четыре и более подряд идущих знаков перед +
        reg.Pattern = "(\d+)"
        MSComm1Input = reg.Replace$(MSComm1Input, "")
        ActiveDocument.Lists.Item(1).ListParagraphs(q).Range.Text = MSComm1Input
    Next q

    Set reg = Nothing

    'выделить список
    ActiveDocument.Lists.Item(1).Range.Select
    'сортировка по абзацам
    Selection.Sort ExcludeHeader:=False, FieldNumber:="абзацам", SortFieldType _
                                                               :=wdSortFieldAlphanumeric, SortOrder:=wdSortOrderAscending, FieldNumber2 _
                                                                                                                         :="", SortFieldType2:=wdSortFieldAlphanumeric, SortOrder2:= _
                   wdSortOrderAscending, FieldNumber3:="", SortFieldType3:= _
                   wdSortFieldAlphanumeric, SortOrder3:=wdSortOrderAscending, Separator:= _
                   wdSortSeparateByTabs, SortColumn:=False, CaseSensitive:=False, LanguageID _
                                                                                :=wdRussian, SubFieldNumber:="абзацам", SubFieldNumber2:="абзацам", _
                   SubFieldNumber3:="абзацам"
Назад:

    For q = 1 To Количество_строк_в_списке
        MSComm1Input = ActiveDocument.Lists.Item(1).ListParagraphs(q).Range.Text
        If Len(MSComm1Input) = 1 Then
            ActiveDocument.Lists.Item(1).ListParagraphs(q).Range.Delete
            GoTo Назад
        Else
            MSComm1Input = Replace$(MSComm1Input, "()", "(" & q & ")")
            ActiveDocument.Lists.Item(1).ListParagraphs(q).Range.Text = MSComm1Input
        End If
    Next q

    'выделить всё
    Selection.WholeStory
    'убрать нумерованный список
    Selection.Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph
    Selection.MoveLeft Unit:=wdCharacter, Count:=1

    MsgBox$ "Конец"

End Sub
проблема, лишнего меняет
ComboBoxValue(641) = "1 и 5 карточка"
ComboBoxValue(641) = "1 карточка"
ComboBoxValue(641) = "1.1 карточка"
На
ComboBoxValue(1) = " и карточка" то есть сожрало лишнего 1 и 5
ComboBoxValue(2) = " карточка" сожрало 1
ComboBoxValue(3) = ". карточка" сожрало 1.1
Ципихович Эндрю вне форума Ответить с цитированием
Старый 24.01.2012, 20:39   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

спасибо откликнвшимся, вопрос решён
Код:
'\d - соответствует цифре, то же, что и [0-9]
        '+ означает, что заменяем два, три, четыре и более подряд идущих знаков перед +
        'основные спецсимволы: ()[]{}|?$^+*\
        'чтобы спецсимвол воспринимался как обычный символ строки
        'его необходимо экранировать символом \, например \$ в Ma\$ter воспринимается как знак доллара
        reg.Pattern = "\(\d+\)"
        MSComm1Input = reg.Replace$(MSComm1Input, "()")
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заменить "0" на "," в двумерном массиве(С++)? Vally Помощь студентам 4 10.01.2012 10:36
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04