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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2009, 20:47   #1
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию Поиск между символами в документе

Есть документ с разнообразным содержимым. В нем в произвольном порядке стоят специальные символы-разделители, например «#». Как получить выделение между двумя такими символами?
ЗЫ: под разнообразным содержимым я понимаю, что в документе есть и текст и рисунки и таблицы.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 28.01.2009, 22:27   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Макрос-скороспелка

Это что, зачёт?!..
Код:
Sub SeekSmthAndSelect()
'КОГДА ЕСТЬ ПУСТЫЕ СТРОКИ - ДАЛЬШЕ ПОЧЕМУ-ТО НЕ ИЩЕТ'
Selection.HomeKey wdStory 'КУРСОР - В НАЧАЛО'

With Selection.Find
.Text = "#*#" 'выделяем часть файла между # и #, включая их самих'
.Wrap = wdFindStop 'дальше не продолжаем (пытаться выделить следующий кусок)'
.MatchWildcards = True 'подстановочные знаки включены (в окне по Ctrl-F)'
.Execute
End With

End Sub
А что до положения курсора — оно отражено (Line ..., Col ...) в строке состояния.
Как это свойство вызывается программно, не знаю (пока). Оказывается, никак! StatusBar write-only (по справке).

Но если вам надо в символах — выделите от курсора до начала и...
Код:
Selection.ComputeStatistics
Правда, сам не пробовал.

Последний раз редактировалось Sasha_Smirnov; 28.01.2009 в 23:53.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 28.01.2009, 22:44   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Нет, просто жизнь такая
Проблема в определении положении курсора в символах до начала документа. Хотя может быть есть и другой метод.
А зачеты я свои посдавал 10 лет назад
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 29.01.2009, 09:27   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
…А что до положения курсора — оно отражено (Line ..., Col ...) в строке состояния.
Как это свойство вызывается программно, не знаю (пока). Оказывается, никак! StatusBar write-only (по справке)…
То, что отображается в статусной строке можно достать через Selection.Information()

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
…Но если вам надо в символах — выделите от курсора до начала и...
Код:
Selection.ComputeStatistics
Правда, сам не пробовал.
Попробую
Добавлено позже
Попробовал. Метод с поиском работает лучше.
Также работает и Selection.ComputeStatistics, но при этом символы абзаца как-то странно считаются
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 29.01.2009 в 11:24.
viter.alex вне форума Ответить с цитированием
Старый 31.01.2009, 17:28   #5
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

вот я на днях тоже с этим столкнулся, посмотри как я решил:
задача:
пример текста:
Здраствуйте меня зовут #Имя#, я родился "#Дата рождения&дд#" #Дата рождения&месяц# #Дата рождения&гггг#г.
Все что между двумя "#" заменить нужным текстом, если встречается "&" то воспринять как все что после "&" и до "#" как формат вывода того что до "&".
Должно получиться:
Здраствуйте меня зовут Анатолий, я родился "26" июня 1989г.
Результат:
Код:
Public doc As Word.Document
Type returned
    finded As Boolean
    range As Word.range
    retType As String
End Type
Public findCounter As Integer
Public findStartI As Long
Public finded As returned
Public Sub lunchFind()
    findCounter = 0
    findStartI = 1
End Sub
Public Function find(doc As Word.Document) As returned
    Dim i As Long, e As Long, str As String
    Dim ret As returned
    str = doc.range
    e = Len(str)
    For i = findStartI To e
        If Mid(str, i, 1) = "#" Then
            str = Mid(str, i + 1)
            Exit For
        End If
    Next i
    findStartI = i - 1
    If i < e Then
        e = Len(str)
        For i = 1 To e
            If Mid(str, i, 1) = "#" Then
                str = Left(str, i - 1)
                Exit For
            End If
        Next i
        e = Len(str)
        ret.retType = "ñòàíäàðò"
        For i = 1 To e
            If Mid(str, i, 1) = "&" Then
                ret.retType = Mid(str, i + 1)
            End If
        Next i
        ret.finded = True
        Set ret.range = doc.range(findStartI, findStartI + i + 1)
        findStartI = findStartI + i + 2
        findCounter = findCounter + 1
    Else
        ret.finded = False
    End If
    finded = ret
    find = ret
End Function
разберись, у меня в ret.range возвращает Range начиная с символа "#" и заканчивая символом"#" (например: ret.range.text = "#Имя#"), а ret.retType равно всему что посел "&" и до "#"
tolikman вне форума Ответить с цитированием
Старый 31.01.2009, 17:39   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Я решил эту проблему. Ищу по методу, предложеному Sasha_Smirnov. Затем сохраняю выбор в переменную, а дальше уже разбираю по косточкам, вернее по стилям. Весь код слишком ного места занимает. Поэтому только часть:
Код:
With Selection.Find
  .Text = "#*#" 'выделяем часть файла между # и #, включая их самих'
  .Wrap = wdFindStop 'дальше не продолжаем (пытаться выделить следующий кусок)'
  .MatchWildcards = True 'подстановочные знаки включены (в окне по Ctrl-F)'
  bFound = .Execute
End With
'Debug.Assert Not bFound
If Not bFound Then Exit Sub
Set oRange = Selection.Range 'запоминаем зону 
Selection.Collapse wdCollapseEnd
Selection.HomeKey
Кстати, сейчас делаю генератор формы с вопросами теста. Тест находится в документе. Читаю вопросы, вывожу их на форму. Считываю ответы, сравниваю с правильными ответами, которые тоже в документе находятся и выставляю оценку. Так вот, диезами разделены вопросы к тесту.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 24.05.2009, 18:04   #7
andreyGO
 
Регистрация: 22.05.2009
Сообщений: 6
По умолчанию

а не подскажете, почему @ нельзя использовать как отметку?
У меня такая ситуация: между символами "@" и "=" в начале абзацев (не всех) расставлены стили, которые необходимо применить к абзацам, а саму отметку стереть. Вот, например: @MIH_HEAD_F = АУДИТОРСКОЕ ЗАКЛЮЧЕНИЕ. После работы макроса получаем:"АУДИТОРСКОЕ ЗАКЛЮЧЕНИЕ" стилем MIH_HEAD_F. При этом в тексте могут встречаться и простые @ (например e-mail), по-этому не хочется менять @ на др. отметки.
Буду очень признателен за помощь!

Последний раз редактировалось andreyGO; 24.05.2009 в 18:08.
andreyGO вне форума Ответить с цитированием
Старый 24.05.2009, 20:00   #8
andreyGO
 
Регистрация: 22.05.2009
Сообщений: 6
По умолчанию

отвечу сам себе: Если вам нужно найти или заменить один из символов, который используется для обозначения подстановочных знаков, скажем, @ - то поставьте перед ним обратную косую черту - "\"
andreyGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить лишние пробелы со строки так чтобы между символами осталось по одному пробелу delphi MASIK Общие вопросы Delphi 7 22.12.2010 18:23
вычисления по закладкам в текстовом документе PUSHkiN Microsoft Office Word 2 06.01.2009 13:51
Пароль на Вордовском документе... Гриха Безопасность, Шифрование 2 11.11.2008 17:40
Фон в документе Microsoft Word AleksP Microsoft Office Word 8 14.09.2008 17:55
удалить лишние пробелы со строки так чтобы между символами осталось по одному пробелу c++ DimaG Общие вопросы C/C++ 1 01.11.2007 21:50