1

Тема: Автоматическое удаление отдельных строк в большой таблице

Добрый день.
Друзья, прошу помощи. Имеется большая таблица в Word 2007, около 100 стр.
Необходимо автоматизировать удаление отдельных повторяющихся строк.
Вручную это делать очень долго, к тому же файл около 7мб, комп работает медленно.
Для образца прикрепил файл Word, где желтым цветом выделены строки, которые надо удалить. Т.е. проще говоря, убрать разрез по мужчинам во всей таблице.
И второй вопрос - есть ли возможность автоматического объединения ячеек в строках, выделенных синим цветом?

Буду признателен. Алексей.

Post's attachments

ОБРАЗЕЦ1.docx 13.34 Кб, 7 скачиваний с 2016-04-16 

You don't have the permssions to download the attachments of this post.

2

Re: Автоматическое удаление отдельных строк в большой таблице

откуда вы сформировали этот файл

|||||||||
|||||||||
ДОБЫЧА ПОЛЕЗНЫХ ИСКОПАЕМЫХ||===|слить|===|===|===|===|===|===
человек|||||||||
%|50||||||||
%|30||||||||
в том числе:|||||||||
мужчин|||удал||||||
человек|30||удал||||||
%|3.4||удал||||||
%|100||удал||||||
женщин|||||||||
человек|50||||||||
%|100||||||||
%|||||||||
ОБРАБАТЫВАЮЩИЕ ПРОИЗВОДСТВА|||||||||
человек|123||||||||

3

Re: Автоматическое удаление отдельных строк в большой таблице

100-страничные таблицы ворд конечно не любит --
более пригоден ексель

4

Re: Автоматическое удаление отдельных строк в большой таблице

Вообще изначально таблица формируется в Excell из специальной программы, обрабатывающей массивы данных. Я скопировал таблицу из Excell в Word и начал в ворде форматировать. Вы говорите что проще в Экселе поудалять?

5

Re: Автоматическое удаление отдельных строк в большой таблице

Согласен, в экселе это сделать проще. Но необходимо уточнить: всегда ли именно такая структура данных?

6

Re: Автоматическое удаление отдельных строк в большой таблице

Короче, попробуйте так (макросы для экселя)

Sub DeleteRows()
    Dim arr(), i As Long, address As String
    Application.ScreenUpdating = False
    arr = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
    For i = 4 To UBound(arr)
        If arr(i, 1) = "мужчин" Then
            If address = "" Then
                address = "A" & i & ":A" & i + 4
            Else
                address = address & "," & "A" & i & ":A" & i + 4
            End If
        End If
    Next
    MsgBox address
    Range(address).EntireRow.Delete
    Application.ScreenUpdating = True
End Sub

Sub MergeCells()
    Application.ScreenUpdating = False
    Dim arr(), i As Long
    arr = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
    For i = 3 To UBound(arr)
        If arr(i, 1) = UCase(arr(i, 1)) And arr(i, 1) <> "%" Then Range("A" & i & ":J" & i).Merge
    Next
    Application.ScreenUpdating = True
End Sub

7

Re: Автоматическое удаление отдельных строк в большой таблице

Ребят, один хороший специалист viteralex написал такой код. Но пока он работает некорректно. Там вроде циклически удаляется строка, где в первой ячейке есть слово "мужчин", и три следующих за ней строки. Но после запуска макроса он удаляет не то что нужно и остается такая таблица (см.скрин) и ошибка выскакивает. Как исправить?

Перед запуском макроса курсор должен находиться в таблице:
Sub DeleteRows()
Dim oRow As Row
Set oRow = Selection.Tables(1).Rows.First
Do
If oRow.Cells(1).Range.Text Like "мужчин*" Then
oRow.Next.Next.Next.Delete
oRow.Next.Next.Delete
oRow.Next.Delete
Set oRow = oRow.Next
oRow.Previous.Delete
Else
Set oRow = oRow.Next
End If
Loop Until oRow Is Nothing
End Sub

Post's attachments

4.JPG
4.JPG 27.57 Кб, 1 скачиваний с 2016-04-16 

You don't have the permssions to download the attachments of this post.

8

Re: Автоматическое удаление отдельных строк в большой таблице

МВТ пишет:

Короче, попробуйте так (макросы для экселя)

Sub DeleteRows()
   

МВТ, проверил первый макрос. работает. но удаляется и строка с текстом женщин. Её удалять не надо.

Второй макрос работает. СПАСИБО.

Просьба, поясните, какие алгоритмы они используют. ну т.е. как он работает? Как эти макросы можно отредактировать, чтобы я мог применять эти макросы в качестве шаблонов для других случаев. например, когда надо удалить строку с другим текстом в ячейке, когда надо удалить, например, одну строку после строки с текстом =мужчин=, а не три как в вашем коде...

И просьба, желательно для Wordа бы макрос. А то я же когда из экселя копировал таблицу. замучился её форматировать. и опять тогда придется форматировать...

9

Re: Автоматическое удаление отдельных строк в большой таблице

Да, механическая ошибка. Замените строку

address = "A" & i & ":A" & i + 4

на

address = "A" & i & ":A" & i + 3

И удалите строку

MsgBox address

По поводу алгоритмов:
1) вычисляем последнюю заполненную ячейку в столбце А
2) данные из столбца А до последней заполненно ячейки забираем в массив для увеличения скорости обработки и в цикле перебираем
3) формируем текстовую строку адресов ячеек, которые содержат контрольное слово
3) на ее основе задаем диапазон и удаляем соответствующие ему строки.

Какие могут быть проблемы при форматировании таблицы, скопированной из экселя в ворд мне не совсем понятно, возможно Вам имеет смысл задать соответствующий вопрос на этом форуме с описанием сложностей?

10

Re: Автоматическое удаление отдельных строк в большой таблице

МВТ пишет:

Да, механическая ошибка. Замените строку

address = "A" & i & ":A" & i + 4

на

address = "A" & i & ":A" & i + 3

И удалите строку

MsgBox address

Какие могут быть проблемы при форматировании таблицы, скопированной из экселя в ворд мне не совсем понятно, возможно Вам имеет смысл задать соответствующий вопрос на этом форуме с описанием сложностей?

МВТ,  благодарю за помощь. Всёработает. ВАш макрос работает в Excell.
Ещё мне для Ворда помог с макросом Александр. Вот его код:

'Удаление строк
Sub DeleteRows()
    Dim oRow As Row
    Set oRow = Selection.Tables(1).Rows.First
    Do
        If oRow.Cells(1).Range.text Like "мужчин*" Then
            oRow.Next.Delete
            oRow.Next.Delete
            oRow.Next.Delete
            Set oRow = oRow.Next
            oRow.Previous.Delete
        Else
            Set oRow = oRow.Next
        End If
    Loop Until oRow Is Nothing
End Sub

'Объединение ячеек
Sub MergeCells()
'    Массив со строками, которые должны быть в первой ячейке объединяемых строк таблицы
    Dim Branches() As Variant
    Branches = Array( _
                    "Сельское хозяйство, охота и лесное хозяйство", _
                    "Добыча полезных ископаемых", _
                    "Добыча топливно-энергетических полезных ископаемых", _
                    "Добыча полезных ископаемых, кроме топливно-энергетических", _
                    "Обрабатывающие производства", _
                    "Производство пищевых продуктов, включая напитки, и табака", _
                    "Текстильное и швейное производство", _
                    "Производство кожи, изделий из кожи и производство обуви", _
                    "Обработка древесины и производство изделий из дерева", _
                    "Целлюлозно-бумажное производство; издательская и полиграфическая деятельность", _
                    "Производство кокса, нефтепродуктов и ядерных материалов", _
                    "Химическое производство", _
                    "Производство резиновых и пластмассовых изделий", _
                    "Производство прочих неметаллических минеральных продуктов", _
                    "Производство готовых металлических изделий", _
                    "Производство машин и оборудования", _
                    "Производство электрооборудования, электронного и оптического оборудования", _
                    "Производство транспортных средств и оборудования", _
                    "Прочие производства", _
                    "Производство и распределение электроэнергии, газа и воды", _
                    "Строительство", _
                    "Связь", _
                    "Транспорт и связь" _
                    )
    Dim i As Long
    Dim cellText As String
    For i = 1 To Selection.Tables(1).Rows.Count
        With Selection.Tables(1).Rows.Item(i)
            cellText = .Cells(1).Range.text
            cellText = Left(cellText, Len(cellText) - 2)
            If Contains(Branches, cellText) Then
                .Cells.Merge
                .Range.ParagraphFormat.Alignment = wdAlignParagraphLeft
            End If
        End With
    Next
                   
End Sub

'Функция проверяет содержится ли в массиве искомая строка
Private Function Contains(ar() As Variant, text As String)
    Dim i As Integer
    If Len(text) = 0 Then
        Contains = False
        Exit Function
    End If
    For i = 1 To UBound(ar)
        If Trim(LCase(ar(i))) = Trim(LCase(text)) Then
            Contains = True
            Exit Function
        End If
    Next
    Contains = False
End Function



А по поводу вставки таблиц из экселя в ворд есть проблемы. например, таблица выходит за границы документа, приходится сдвигать графы по порядку..документ то огромный, таблица на 100стр. одну графу сдвинул, ждешь пока это по всей таблице пройдет, секунд 20.. тормозит.. но где то здесь на форуме я видел рекомендации по грамотной вставке таблиц из эксел..

11

Re: Автоматическое удаление отдельных строк в большой таблице

одну графу сдвинул, ждешь пока это по всей таблице пройдет, секунд 20..

это я и имела в виду, говоря ,что таблицу в 100стр, WORD не тянет

12

Re: Автоматическое удаление отдельных строк в большой таблице

А какова вообще цель переноса всех данных в ворд? Во-первых, можно переносить относительно небольшими частями актуальную на данный момент информацию. Во-вторых (а проблема, судя по всему в выводе на печать) достаточно несложно настроить все, что надо в самом экселе и печатать прямо из него. Проще говоря, что Вы хотите получить из своей таблицы?

13

Re: Автоматическое удаление отдельных строк в большой таблице

МВТ пишет:

А какова вообще цель переноса всех данных в ворд?

Поясню. Таблицы переносятся в Ворд для подготовки документа - бюллетеня для размещения в Базе готовых документов. Бюллетень содержит оглавление, содержание, сами таблицы (основная информация), комментарии. Для удобства потребителя. Ну т.е. для приведения данных к удобочитаемому компактному виду.