Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
18.01.2021, 07:59:36

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
31 739 Сообщений в 5 101 Тем от 11 422 Пользователей
Последний пользователь: hiddenmovie2
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Word и VBA
| | |-+  Удаление страниц с разрывами разделов и без разрывов разделов
Страниц: [1]   Вниз
Печать
Автор Тема: Удаление страниц с разрывами разделов и без разрывов разделов  (Прочитано 2963 раз)
0 Пользователей и 1 Гость смотрят эту тему.
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« : 20.09.2019, 09:22:29 »

Добрый день всем !

В общем создал форму для удаления страниц в Word
Однако не могу корректно удалить страницы в диапазоне по условию:
а нужно именно так

1)Имеем диапазон страниц с TextBox1 до TextBox2 для удаления
2)Определяем количество разрывов страниц в диапазоне (например их будет 5)
3)Удаляем все до 1 разрыва страницы и сохраняем 1 разрыв страницы (применяется Макрос2 для удаления)
4)Далее после 1 разрыва страницы удаляем все содержимое и все разрывы 2,3,4,5 (применяется Макрос1 для удаления)

Код макроса
Код: (vb)

Sub ЗапускФормы()
UserForm1.Show 0
End Sub

Sub УдалениеСтраницНомера()'макрос в самой форме
Dim NumPages As Long
NumPages = ActiveDocument.ComputeStatistics(wdStatisticPages)
'проверка на корректные номера страниц
If TextBox1.Value <> "" And TextBox2.Value <> "" And (TextBox1.Value > NumPages Or TextBox2.Value > NumPages) Then
MsgBox "Вы ввели некорректные номера страниц больше чем в документе !"
Exit Sub
End If
'проверка на заполнение номеров страниц
If TextBox1.Value = "" Or TextBox2.Value = "" Then
MsgBox "Вы не заполнили номера страниц !"
Exit Sub
End If
'Запрет на удаление первой страницы
If TextBox1.Value < 2 Or TextBox2.Value < 2 Then
MsgBox "Нельзя удалять первую страницу !"
Exit Sub
End If
'проверка на правильную последовательность страниц
If TextBox1.Value > TextBox2.Value Then
MsgBox "Проверьте последовательность введения страниц ! Значение Поле 1 не должно быть выше значения Поле 2 ! "
Exit Sub
End If

'предмет вопроса по условию наличия разрыва раздела
If TextBox1.Value < NumPages And TextBox2.Value < NumPages Then 'пока последний лист не трогаем
'Перебор листов в цикле в диапазоне TextBox1.Value и TextBox2.Value для подсчета разрывов разделов
'Удаляем все до 1(первого) разрыва раздела - применяем Макрос2
'Выделяем все ПОСЛЕ первого разрыва раздела и удаляем все - применяем Макрос1
End If

Sub Макрос1 ()'удалить лист без разрыва раздела
Dim start_ As Long, end_ As Long, i As Long
'4. Запись в переменную начала начальной страницы.
    start_ = ActiveDocument.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:= i).Start
'5. Запись в переменную конца конечной страницы.
        ' Нужно в переменную записать начало следующей страницы после указанной конечной.
        ' Если конечная страница - это последняя страница, то запишем в переменную конец файла.
    If ActiveDocument.ComputeStatistics(wdStatisticPages) = i Then
        end_ = ActiveDocument.Range.End
    Else
        end_ = ActiveDocument.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:= i + 1).Start
    End If
   
    '6. Выделение и удаление указанных страниц.
    ActiveDocument.Range(start_, end_).Select
    Selection.Delete
End Sub

Sub Макрос2 () 'удалить лист c разрывом раздела
Dim start_ As Long, end_ As Long, i As Long
'4. Запись в переменную начала начальной страницы.
    start_ = ActiveDocument.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:= i).Start
'5. Запись в переменную конца конечной страницы.
        ' Нужно в переменную записать начало следующей страницы после указанной конечной.
        ' Если конечная страница - это последняя страница, то запишем в переменную конец файла.
    If ActiveDocument.ComputeStatistics(wdStatisticPages) = i Then
        end_ = ActiveDocument.Range.End
    Else
        end_ = ActiveDocument.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:= i + 1).Start
    End If
   
    '6. Выделение указанных страниц.
    ActiveDocument.Range(start_, end_).Select
    '7.Сжимаем выделение, если последний _
    или предпоследний символ это разрыв
    With Selection
    If Asc(.Characters.Last) = 12 Then
      .MoveLeft wdCharacter, 1, wdExtend
    End If
    If Asc(.Characters.Last.Previous.Text) = 12 Then
      .MoveLeft wdCharacter, 2, wdExtend
    End If
    End With
   '8.Удаляем
    Selection.Delete
End Sub



Макрос1 и Макрос2 предполагают действия с конкретной страницей,
и действия с переменной i , где i - номер страницы в цикле
Можно ли в Word както этот цикл сделать ?
Записан
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #1 : 21.09.2019, 10:48:19 »

такто как понимаю щас можно проще сделать -удалить сразу всю область диапазона страниц и вставить в это место разрыв страницы.
допустим удаляем диапазон
Код: (vb)

Sub Удаление()
Dim nStart As Long, nEnd As Long
Application.ScreenUpdating = False
If TextBox1.Value <> "" And TextBox2.Value <> "" Then
  With Selection
    'Переход к началу первой страницы удаления
.GoTo wdGoToPage, wdGoToAbsolute, TextBox1.Value
    'Запоминаем положение
    nStart = .Start
    'Переход к началу следующей страницы после последней страницы удаления
    .GoTo wdGoToPage, wdGoToAbsolute, TextBox2.Value + 1
    'Запоминаем положение
    nEnd = .Start
    'Выделяем
    .SetRange nStart, nEnd
    'Удаляем
    .Delete
  End With
  
Else
Exit Sub
End If
Application.ScreenUpdating = True

End Sub



и как далее корректно вставить разрыв раздела на следующую страницу  в конец предыдущей страницы - перед первой на удаление ??
Записан
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #2 : 21.09.2019, 12:42:39 »

или иначе по логике:
в общем по моей логике
1)убить диапазон до начала 1 разрыва
2)сохранить разрыв и далее начать удаление с конца разрыва
3)убить все до последней страницы диапазона (если последняя страница диапазона имеет разрыв - и его убить)

тогда все корректно проходит
Записан
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #3 : 22.09.2019, 08:14:59 »

дабы не вводить в заблуждение - сорри - имеется всегда в виду разрыв раздела а не разрыв страницы
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru