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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2009, 22:54   #1
StillFree
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 16
По умолчанию Обработка текста

Доброго всем времени суток =)
У меня к вам огромная просьба, мне нужно за короткое время обработать огромное количество текста т.е. к примеру 1ДЕк.doc сделать из него текст в виде 1ДЕ111.doc, т.е. чтобы после вопроса, непосредсвенно шел ответ т.е. то что идет в в вопросе под номером 4 с знаком плюс, Скажите есть ли малейшая возможность сделать подобный макрос?! заранее ОГРОМНОЕ СПАСИБО!
Вложения
Тип файла: doc 1ДЕ111.doc (31.0 Кб, 26 просмотров)
Тип файла: doc 1ДЕк.doc (89.0 Кб, 23 просмотров)
StillFree вне форума Ответить с цитированием
Старый 19.06.2009, 06:20   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию То ли ещё будет, оёёй

Код:
Sub Squeezer() ' Макрос создан 19.06.2009 Customer
    
    Const Vn = 4                'количество вариантов ответа на вопрос'
    Dim QAn As String           'строка для вопроса и ответа'
    Dim Juice As String         'строка с результатом'
    Dim k As Byte, pattern As String
    
    For k = 1 To Vn: pattern = pattern & "*^13": Next
    
    'Преобразуем таблицу(-ы) активного документа в табулированный текст.'
    With ActiveDocument.Tables
    For k = 1 To .Count: .Item(k).ConvertToText (vbTab): Next
    End With
    
    Selection.HomeKey wdStory 'кусор в начало
    'Выделяем по Vn+1 непустых абзацев, идущих подряд сразу за переводом строки (^l).'
    With Selection
                .Find.Text = "^l[!^l]@^13" & pattern
                .Find.MatchWildcards = True
                .Find.Wrap = wdFindStop
                
            Do While .Find.Execute
                MsgBox Mid(.Range.Paragraphs(1), InStr(.Range.Paragraphs(1), Chr(11)) + 1)
                QAn = .Text
                If InStr(QAn, "+") = 0 Then MsgBox "Ответ на этот вопрос не отмечен."
            Loop
    End With
    
End Sub
Вам осталось к содержимому первого MsgBox’а прицепить строчку с плюсиком (если таковая имеется) и затем сохранить всё это в строке Juice!
Вложения
Тип файла: doc December1.doc (40.5 Кб, 22 просмотров)

Последний раз редактировалось Sasha_Smirnov; 19.06.2009 в 16:29.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 19.06.2009, 10:27   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию Нет предела человеческой…

Предложу свой вариант. Макрос работает анализируя содержимое основной таблицы. Таблицы с ответами являются вложенными по отношению к таблице с вопросами. На этом и построен макрос.
Код:
Sub GetAnswers()
  Application.ScreenUpdating = False
  Dim oResDoc As Document
  Dim oQuestTbl As Table 'Общая таблица с вопросами
  Dim oAnsTbl As Table 'Вложенная таблица с ответами
  Dim oCell As Cell 'Переменная для перебора ячеек в таблице с вопросами
  Dim oQuestStr As Range 'Строка с вопросом
  Dim oAnsStr As Range 'Строка с ответом
  Set oQuestTbl = Selection.Tables(1)
  Set oResDoc = Documents.Add
  For Each oCell In oQuestTbl.Range.Cells
    If oCell.Tables.Count <> 0 Then 'Ищем ячейку, в которой есть вложенная таблица
      Set oAnsTbl = oCell.Tables(1)
      'Ищем формулировку вопроса
      With oCell.Range.Find
        .Text = "^11*^13"
        .MatchWildcards = True
        .Forward = False
        .Execute
        If .Found Then
          Set oQuestStr = .Parent
          oQuestStr.SetRange oQuestStr.Start + 1, oQuestStr.End - 1
        End If
      End With
      'Ищем знак плюс в ячейках последнего столбца таблицы с ответами
      Dim i As Long
      For i = 1 To oAnsTbl.Rows.Count
        If Left(oAnsTbl.Cell(i, oAnsTbl.Columns.Count).Range.Text, 1) = "+" Then
          Set oAnsStr = oAnsTbl.Cell(i, oAnsTbl.Columns.Count - 1).Range
          Exit For
        End If
      Next i
      'Вставляем текст в новый документ
      oResDoc.Range.InsertAfter oQuestStr.Text & " "
      With oResDoc.Range(oResDoc.Range.End - 2, oResDoc.Range.End - 1)
        .Font.Bold = True
        .Text = oAnsStr.Text
      End With
    End If
  Next
  Application.ScreenUpdating = True
End Sub
Макрос не дуракоустойчивый. Никаких обработок ошибок пока нет. Чтобы он работал нужно поставить курсор в основную таблицу в любую ячейку. По окончании работы макроса будет создан новый документ, в котором после формулировки вопроса в том же абзаце будет жирным шрифтом следовать ответ.
Пожелания принимаются.
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 19.06.2009 в 12:22.
viter.alex вне форума Ответить с цитированием
Старый 19.06.2009, 13:57   #4
StillFree
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 16
По умолчанию

Спасибо Всем, уже решил задачу =) можно удалять Тему
StillFree вне форума Ответить с цитированием
Старый 19.06.2009, 14:26   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от StillFree Посмотреть сообщение
Спасибо Всем, уже решил задачу =) можно удалять Тему
Интересный вы человек. Хоть решение приведите, а то как-то нечестно получается.
Или задача решилась снятием с повестки дня?
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 19.06.2009 в 14:50.
viter.alex вне форума Ответить с цитированием
Старый 21.06.2009, 05:59   #6
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Выборка текста из таблицы Word

Не только так, как сделал топикстартер, но и...
Код:
Sub SqueezerOfJuice() ' Макрос создан 21.06.2009 Customer'
    
    Const Qvariants = 4                                     'количество вариантов ответа на вопрос'
    Dim strQ As String, strA As String, juice As String  'строки для вопроса, ответа и результата'
    Dim k As Integer, stencil As String
    Dim nQ As Integer, nA As Integer 'номер вопроса и его ответа (помеченного в таблице знаком +)'
    
    For k = 1 To Qvariants: stencil = stencil & "*^13": Next 'кусок шаблона для поиска строк'
    
    ActiveDocument.Tables.Item(1).ConvertToText vbTab 'преобразуем таблицу в табулированный текст'
    
    Selection.HomeKey wdStory 'кусор - в начало'
    
    'Выделяем по 1+Qvariants непустых абзацев, идущих подряд сразу за переводом строки (код ^11).'
    With Selection
        .Find.Text = "^11[!^l]@^13" & stencil
        .Find.MatchWildcards = True
        .Find.Wrap = wdFindStop
        
        'из 1-го выделенного абзаца вычленяем вопрос (strQ) и ответ на него: абзац, содержащий "+"'
        Do While .Find.Execute
            nQ = nQ + 1
            strQ = nQ & ") " & Mid(.Range.Paragraphs(1), InStr(.Range.Paragraphs(1), Chr(11)) + 1)
            
            If InStr(.Text, "+") = 0 Then
                strA = " Ответ на этот вопрос плюсом не отмечен либо ответов больше чем " & Qvariants & "."
            Else
                        For k = 2 To 1 + Qvariants
                        If InStr(.Range.Paragraphs.Item(k), "+") Then nA = k: Exit For
                        Next
                strA = .Range.Paragraphs.Item(nA).Range
            End If
            juice = juice + strQ + strA + Chr(13) 'к результату добавили очередную порцию данных и абзац'
        Loop
        
        .EndKey wdStory 'кусор в конец - и там печатаем результат'
        .TypeText juice
        With .Find: .Text = vbNullChar: .MatchWildcards = False: End With   'очистка окна поиска'
    End With
    
End Sub
Запуск: Alt-S. «Разобранную» таблицу можно вернуть по Ctrl-Z дважды.

Число вариантов ответа можно варьировать. А для 4, конечно, легче вручную повырезать, чем изучать английский, справку и затем ещё 2 часа кандыбаться с кодом.
Вложения
Тип файла: doc 1ДЕк.doc (95.0 Кб, 18 просмотров)

Последний раз редактировалось Sasha_Smirnov; 22.06.2009 в 02:56. Причина: прикидка соотношения затраты/польза.
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка текста JRcoker Общие вопросы Delphi 5 31.07.2008 23:35
обработка текста pvleo Фриланс 4 14.07.2008 05:19
Обработка текста Absent Помощь студентам 2 20.05.2008 23:17
Обработка текста Absent Помощь студентам 1 10.05.2008 19:56
Обработка текста GAGARIN-NEW Общие вопросы Delphi 7 06.10.2007 15:25