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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2013, 08:57   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию Оптимизировать обработку таблицы Ворда

Здравствуйте, подскажите что можно предпринять, таблицу за 12 часов обрабатывает только 6000 строк, ужас
делов то узнать в таблице чтобы.... указано в тексте TextError, код:
Код:
For q = 1 To Количество_строк_в_таблице

            s1 = Trim$(.Rows(q).Range)

            Курсив = .Rows(q).Range.Font.Italic
         
                      If .Rows(q).Range.HighlightColorIndex = wdYellow _
               And s1 Like "*[её]*" = False Then TextError = "В строке имеется выделение жёлтым цветом, но не имеется буквы ""её""": GoTo Выход_из_цикла
           
            If Курсив = -1 And s1 Like "*[её]*" = False Then TextError = "В строке имеется курсив, но не имеется буквы ""её""": GoTo Выход_из_цикла

                     If .Rows(q).Range.HighlightColorIndex <> wdYellow _
               And Курсив = -1 Then TextError = "В строке имеется курсив, но она не выделена жёлтым цветом": GoTo Выход_из_цикла

                      If Курсив = -1 _
               And .Rows(q).Range.HighlightColorIndex <> wdYellow Then TextError = "В строке имеется курсив, но она не выделена жёлтым цветом": GoTo Выход_из_цикла

            ''''парность строк
         
            If .Rows(q).Range.HighlightColorIndex = wdYellow _
               Or Курсив = -1 Then Парность_строки = Парность_строки + 1

                       If Парность_строки Mod 2 <> 0 Then

                               If .Rows(q).Range.HighlightColorIndex = wdYellow _
                   And .Rows(q + 1).Range.HighlightColorIndex <> wdYellow Then TextError = "В строке имеется выделение жёлтым цветом, но в следующая строке нет выделения жёлтым цветом": GoTo Выход_из_цикла

                               If Курсив = -1 _
                   And .Rows(q + 1).Range.Font.Italic <> -1 Then TextError = "В строке имеется курсив, но в следующей строке не имеется курсива": GoTo Выход_из_цикла
            End If

        Next q
Спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2013, 09:35   #2
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию

перейдя на цикл for each время уменьшается в 3 раза
(на моем компе с 140 мин до 45)

Код:
Sub wr130205_0919()
Dim q, q1, s1, TextError, Количество_строк_в_таблице, Курсив, Парность_строки
Dim dt1, dt2
Dim r As Row
With Word.ActiveDocument.Tables(1)
Количество_строк_в_таблице = 6000
'Word.ActiveDocument.Tables(1).Rows.Count
dt1 = Now
q1 = 0
For Each r In .Rows
q1 = q1 + 1
q = q1

s1 = Trim$(r.Range)

Debug.Print q1; (DateDiff("s", Now(), dt1) / q1) * 6000 / 60



Курсив = r.Range.Font.Italic

If r.Range.HighlightColorIndex = wdYellow And s1 Like "*[её]*" = False Then
TextError = "В строке имеется выделение жёлтым цветом, но не имеется буквы ""её"""
GoTo Выход_из_цикла
End If

If Курсив = -1 And s1 Like "*[её]*" = False Then
TextError = "В строке имеется курсив, но не имеется буквы ""её"""
GoTo Выход_из_цикла
End If

If r.Range.HighlightColorIndex <> wdYellow And Курсив = -1 Then
TextError = "В строке имеется курсив, но она не выделена жёлтым цветом"
GoTo Выход_из_цикла
End If

If Курсив = -1 And r.Range.HighlightColorIndex <> wdYellow Then
TextError = "В строке имеется курсив, но она не выделена жёлтым цветом"
GoTo Выход_из_цикла
End If
''''парность строк

If r.Range.HighlightColorIndex = wdYellow Or Курсив = -1 Then
Парность_строки = Парность_строки + 1
End If
If Парность_строки Mod 2 <> 0 Then

If r.Range.HighlightColorIndex = wdYellow And .Rows(q + 1).Range.HighlightColorIndex <> wdYellow Then
TextError = "В строке имеется выделение жёлтым цветом, но в следующая строке нет выделения жёлтым цветом"
GoTo Выход_из_цикла
End If

If Курсив = -1 And .Rows(q + 1).Range.Font.Italic <> -1 Then
TextError = "В строке имеется курсив, но в следующей строке не имеется курсива"
GoTo Выход_из_цикла
End If
End If

Next r
End With
Выход_из_цикла:
Debug.Print q, TextError
End Sub
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 05.02.2013, 10:45   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

спасибо, я выкладывал часть кода... без объявлений...., они у меня объявлены
и так я понял что мне нужно, дообъявить
Dim r As Row
и изменить на For Each r In .Rows
и это спасёт меня...???
вариации с расчётом времени мне не нужны
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2013, 10:48   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

увидел, что .Rows(q). тоже долой, понял...
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2013, 12:10   #5
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Ципихович Эндрю, напишите словесное описание вашей задачи. Если словами будет сложно объяснить, то выложите Word-документ с примерными данными и на основе этого документа поясните, какой должен быть результат.


Примечание

По коду тяжело читать смысл задания, да и программист мог где-нибудь ошибиться в коде.
Скрипт вне форума Ответить с цитированием
Старый 05.02.2013, 12:24   #6
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

всё просто, нужно узнать чтобы не было ошибок, а именно
Нужно узнать, что в строках таблицы
"В строке имеется выделение жёлтым цветом, но не имеется буквы ""её"""
"В строке имеется курсив, но не имеется буквы ""её"""
"В строке имеется курсив, но она не выделена жёлтым цветом"
"В строке имеется курсив, но она не выделена жёлтым цветом"
"В строке имеется выделение жёлтым цветом, но в следующей строке нет выделения жёлтым цветом"
"В строке имеется курсив, но в следующей строке не имеется курсива"
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2013, 12:38   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

пока весь код такой
Код:
Private Sub CommandButton8_Click()
'поиск чётности строк с курсивом и выделением жёлтым цветом

    Старт_программы = Now

    'отключаем обновление - дёргание экрана при выполнении кода
    Application.ScreenUpdating = False
    'объявление переменной типа "Длинный целый", размер 4 байта
    'от -2147483648 до 2147483647
    'то есть до 2 миллиардов 147 миллионов 483 тысячи 647
    'то есть до 2.147.483.647
    Dim Количество_строк_в_таблице As Long
    Dim Парность_строки As Long
    Dim Курсив As Long
    Dim w As Long
    'можно не указывать ... = 0
    
    Dim q As Row

    Dim TextError As String
    'инициализация переменной ...
    TextError = ""

    With ActiveDocument.Tables(1)

        Количество_строк_в_таблице = .Rows.Count

'последовательный проход по коллекции итератором быстрее, чем обращение к произвольному элементу по индексу
'For x In — переменная x называется итератором, объектом, в котором содержится ссылка на очередной элемент коллекции/массива
'For x = — переменная x называется индексом, порядковым номером произволного элемента коллекции/массива

        For Each g In .Rows
            
            s1 = Trim$(g.Range)
            w1 = w1 + 1
            Курсив = g.Range.Font.Italic
            'g.Range.Font.Italic = 0 - нет курсива в строке
            'g.Range.Font.Italic = -1 - курсив в строке
            'g.Range.Font.Italic = 9999999 - а строке смешан курсив и не курсив

            'условие о том выделено ли жёлтым цветом в строке, надо чтобы строка была выделена полностью, а не частично жёлтым цветом
            If g.Range.HighlightColorIndex = wdYellow _
               And s1 Like "*[её]*" = False Then TextError = "В строке имеется выделение жёлтым цветом, но не имеется буквы ""её""": GoTo Выход_из_цикла

            'условие о том курсив ли в строке
            If Курсив = -1 _
               And s1 Like "*[её]*" = False Then TextError = "В строке имеется курсив, но не имеется буквы ""её""": GoTo Выход_из_цикла

            'условие о том выделено ли жёлтым цветом в строке, надо чтобы строка была выделена полностью, а не частично жёлтым цветом
            If g.Range.HighlightColorIndex <> wdYellow _
               And Курсив = -1 Then TextError = "В строке имеется курсив, но она не выделена жёлтым цветом": GoTo Выход_из_цикла

            'условие о том курсив ли в строке
            If Курсив = -1 _
               And g.Range.HighlightColorIndex <> wdYellow Then TextError = "В строке имеется курсив, но она не выделена жёлтым цветом": GoTo Выход_из_цикла

            ''''парность строк

            'условие о том выделено ли жёлтым цветом в строке, надо чтобы строка была выделена полностью, а не частично жёлтым цветом
            'условие о том курсив ли в строке
            If g.Range.HighlightColorIndex = wdYellow _
               Or Курсив = -1 Then Парность_строки = Парность_строки + 1

            'Mod это остаток
            If Парность_строки Mod 2 <> 0 Then

                'условие о том выделено ли жёлтым цветом в строке, надо чтобы строка была выделена полностью, а не частично жёлтым цветом
                If g.Range.HighlightColorIndex = wdYellow _
                   And .Rows(w + 1).Range.HighlightColorIndex <> wdYellow Then TextError = "В строке имеется выделение жёлтым цветом, но в следующей строке нет выделения жёлтым цветом": GoTo Выход_из_цикла

                'условие о том курсив ли в строке
                If Курсив = -1 _
                   And .Rows(w + 1).Range.Font.Italic <> -1 Then TextError = "В строке имеется курсив, но в следующей строке не имеется курсива": GoTo Выход_из_цикла
            End If

        Next g

Выход_из_цикла:

        Конец_программы = Now

        If Len(TextError) <> 0 Then
            g.Select
            'interval argument "n" - Minute
            MsgBox$ _
                    "Начато: " & Старт_программы & vbCrLf & _
                               "Закончено: " & Конец_программы & vbCrLf & _
                               "Количество минут, затраченных на выполнение программы: " & DateDiff("n", Старт_программы, Конец_программы) & vbCrLf & _
                               TextError, _
                               vbOKOnly, "Внимание"

        Else
            'interval argument "n" - Minute
            MsgBox$ _
                    "Начато: " & Старт_программы & vbCrLf & _
                               "Закончено: " & Конец_программы & vbCrLf & _
                               "Количество минут, затраченных на выполнение программы: " & DateDiff("n", Старт_программы, Конец_программы), _
                               vbOKOnly, "Внимание"
        End If

        'конец With ActiveDocument.Tables(1)
    End With

    'отменяем отключенное ранее обновление - дёргание экрана при выполнении кода
    Application.ScreenUpdating = True

End Sub
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2013, 13:24   #8
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию

не помешало бы заменить на переменные

Код:
yell=(g.Range.HighlightColorIndex = wdYellow)
eeee=(s1 Like "*[её]*")
......
If yell = true    And eeee = False Then TextError ................

уменьшит время раза в 2
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 05.02.2013, 13:37   #9
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
Ципихович Эндрю: "В строке имеется выделение жёлтым цветом, но не имеется буквы ""её"""
в Word-документе прямо так и встречается ""её""" - буква е, за ней буква ё и две эти буквы окружены пятью кавычками?
Скрипт вне форума Ответить с цитированием
Старый 05.02.2013, 14:34   #10
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
...Нужно узнать, что в строках таблицы...имеется выделение...курсив...в следующей строке...
Быстрее будет, если искать все это обычным поиском (Find).

Можно преобразовать таблицу в текст, обработать, потом обратно. Судя по коду, объединенных ячеек нет. Если сама таблица не имеет сложного форматирования, то вариант стоящий.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Настройка Ворда!!!!!!!!! rexar89 Microsoft Office Word 2 22.08.2012 03:54
Задачи на Дельфи: одна на обработку матрицы и две на обработку строк ali-4ka Помощь студентам 6 21.03.2012 14:28
обрушение Ворда Ципихович Эндрю Microsoft Office Word 2 06.07.2011 17:50
Абзацы из Ворда Balexander Microsoft Office Excel 1 16.11.2010 09:39
задачи: на двумерные массивы,обработку строк,обработку текстовых файлов. (Паскаль) Yaro Помощь студентам 2 12.11.2009 12:55