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

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

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

Восстановить пароль

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

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

Избавиться от «неправильных» абзацев можно ещё таким способом:
Код:
Sub MakeNormalParagraphs()
  Dim oDoc As Document
  Const PARAGRAPH_DELIMITER As String = "@#$%"
  
  Set oDoc = ActiveDocument
  'Замена псевдоабзацев на нормальные абзацы
  With oDoc.Range.Find
    .Text = "^0013"
    .Replacement.Text = PARAGRAPH_DELIMITER
    .MatchWildcards = True
    .Execute Replace:=wdReplaceAll
  End With
  With oDoc.Range.Find
    .Text = PARAGRAPH_DELIMITER
    .Replacement.Text = "^p"
    .Execute Replace:=wdReplaceAll
  End With
End Sub
А по теме предложу такой вариант
Код:
Sub ArrangeScheduleTime()
  Dim oParFirst As Paragraph 'Абзац с текущей передачей
  Dim oParNext As Paragraph 'Абзац со следующей передачей
  Dim sTimeFirst As String 'Время текущей передачи
  Dim sIssueFirst As String 'Название текущей передачи
  Dim sTimeNext As String 'Время следующей передачи
  Dim sIssueNext As String 'Название следующей передачи
  Dim oRng As Range 'Диапазон абзаца текущей передачи
  
  Set oParFirst = ActiveDocument.Paragraphs.First
  Do Until oParFirst Is Nothing
    Set oRng = oParFirst.Range
    sTimeFirst = Mid(oParFirst.Range.Text, 1, InStr(oParFirst.Range.Text, " "))
    If IsDate(sTimeFirst) Then
      sIssueFirst = Trim(Mid(oParFirst.Range.Text, Len(sTimeFirst)))
      sTimeFirst = Trim(sTimeFirst)
      Set oParNext = oParFirst.Next
      Do Until oParNext Is Nothing
        sTimeNext = Mid(oParNext.Range.Text, 1, InStr(oParNext.Range.Text, " "))
        If IsDate(sTimeNext) Then
          sIssueNext = Trim(Mid(oParNext.Range.Text, Len(sTimeNext)))
          sTimeNext = Trim(sTimeNext)
          If sIssueNext = sIssueFirst Then
            sTimeFirst = sTimeFirst & ", " & sTimeNext
            oParNext.Range.Delete
          Else
            Set oParNext = oParNext.Next
          End If
        Else
          Set oParNext = oParNext.Next
        End If
      Loop
      ActiveDocument.Range(oRng.Start, oRng.Start + oRng.MoveStartUntil(" ") - 1).Text = sTimeFirst
      Set oParFirst = oParFirst.Next
    Else
      Set oParFirst = oParFirst.Next
    End If
    DoEvents
  Loop
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 12.09.2010, 18:35   #12
foreytor
Подтвердите свой е-майл
 
Регистрация: 02.09.2010
Сообщений: 14
По умолчанию

Красиво!
В связи с этим кодом у меня всплыл вопрос, который будет небесполезен и Prince1991.
Если в списке происходит сбой хронологии, то его (весь или выделенный фрагмент - "Selection") нужно предварительно отсортировать. Эта стандартная задача (сортировка) имеет классическое решение, или каждый упражняется в меру своей испорченности?
Я, например, привык передавать такой фрагмент в массив, и далее, через функции сравнения и обмена "опускаю" больший элемент "вниз", каждый раз уменьшая счетчик на единичку. Да еще флажок ставлю - вдруг повезет раньше окончания полного цикла Но это очень старый метод. И не очень красивый Может быть современный VBA позволяет усовершенствовать процесс?
foreytor вне форума Ответить с цитированием
Старый 12.09.2010, 18:44   #13
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

А почему нельзя воспользоваться встроенной сортировкой?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 12.09.2010, 19:45   #14
Prince1991
 
Регистрация: 10.09.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Я немного усовершенствовал программу от foreytor.

В приложенном документе запуск по F6. Просмотр кода — по Alt-F11 (отличие только в интерфейсе; как вам?..).
Да примерно именно так и хотел, но такой вопрос, как применить этот макрос например только к понедельнику, нам присылают документ на целую неделю, и получается мне нужно создавать семь документов (семь дней в неделю), вставлять текст и применять этот макрос? Нельзя ли просто выделить текст, то есть типа макрос будет работать только в выделенном тексте?
Все таки за макрос, огромное спасибо, хоть немного, но понял в чем смысл, еще раз спасибо.
Prince1991 вне форума Ответить с цитированием
Старый 12.09.2010, 19:58   #15
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Да конечно же можно. Пока, извините, некогда: компьютер не мой.
Цитата:
Сообщение от foreytor Посмотреть сообщение
To Sasha_Smirnov
"программа" - это звучит гордо!
Вообще-то это даже не макрос, а набросок. Вариант, который можно рассмотреть для решения проблемы.
Но, конечно, интерфейс ему обязательно будет нужен, тут я согласен на все 100% !
Ну да, это не Готская программа! Но всё же замечу, что 12 лет назад результат её работы сэкономил бы редакции (работодателю, разумеется) около $100 — столько, со слов начальства, стоила обработанная, уже готовая к печати TV-программа.

Последний раз редактировалось Sasha_Smirnov; 13.09.2010 в 04:16. Причина: замена: начальству→работодателю.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 12.09.2010, 20:12   #16
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Prince1991 Посмотреть сообщение
…как применить этот макрос например только к понедельнику, нам присылают документ на целую неделю, и получается мне нужно создавать семь документов (семь дней в неделю), вставлять текст и применять этот макрос? Нельзя ли просто выделить текст, то есть типа макрос будет работать только в выделенном тексте?…
Можно, придётся немного переделать цикл, чтобы он пробегал не все абзацы, а только выделенные. Это усложнит макрос, т.к. удаление абзацев будет приводить к смещению границ перебора абзацев.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 12.09.2010, 22:03   #17
foreytor
Подтвердите свой е-майл
 
Регистрация: 02.09.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
А почему нельзя воспользоваться встроенной сортировкой?
Я то думал, стандартная функция ".Sort" применима только к спискам и таблицам. А оказывается есть и "Selection.Sort".
Чего ради было прописывать этот пункт в "Таблицы".

Спасибо за подсказку!
foreytor вне форума Ответить с цитированием
Старый 12.09.2010, 23:32   #18
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

А есть ещё Вид→Структура, а там кнопка АЯ↓ (сортировать уровни).
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объекты Worda Busine2009 Microsoft Office Word 16 11.04.2011 16:28
Совместимость версий Worda Lenchick Microsoft Office Word 0 31.10.2009 17:51
Странный глюк Worda valerij Microsoft Office Word 6 28.06.2009 08:11
Надо макрос для Excel для перестановки букв dionisprf Microsoft Office Excel 2 10.06.2009 06:04
Явление Worda Busine2009 Microsoft Office Word 2 26.05.2009 08:53