Удаление строки word vba

The following line of code will insert text into a bookmark range in a word document.

objDoc.Bookmarks("DonorAddress").Range.Text = "6200 Main St."

How do I remove the entire line containing the address bookmark if I don’t have any address data?

Kazimierz Jawor's user avatar

asked Jun 9, 2014 at 0:58

Ben's user avatar

If ‘deleting the line’ means deleting just one line of a paragraph, the following is the way:

objDoc.Bookmarks("DonorAddress").Range.Paragraphs(1).Range.Select
Selection.HomeKey wdLine
Selection.EndKey wdLine, wdExtend
Selection.Delete

answered Jun 9, 2014 at 20:16

dcromley's user avatar

dcromleydcromley

1,3381 gold badge8 silver badges23 bronze badges

By ‘deleting the line’ I believe you mean to ‘delete paragraph’. If so you could do it in this way:

'2 steps to delete- rather not recommended
objDoc.Bookmarks("DonorAddress").Range.Paragraphs(1).Range.Select
Selection.Delete

or in one step:

objDoc.Bookmarks("DonorAddress").Range.Paragraphs(1).Range.Delete

answered Jun 9, 2014 at 15:58

Kazimierz Jawor's user avatar

Kazimierz JaworKazimierz Jawor

18.8k7 gold badges35 silver badges55 bronze badges

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

#1

27.12.2015 17:39:43

Добрый день,
в Excel-файле создаю Word-документ и вставляю в него текст из разных источников. После создания документа в нем всегда оказываются в конце 2 пустые строки. Нужно их удалить. Записал макрос в Word, получилось:

Код
Selection.EndKey Unit:=wdStory
Selection.Delete Unit:=wdCharacter, Count:=1

а как это перенести в Excel — не знаю. Один к одному не получается
пробовал Selection менять на Range и EndKey на EndOf — ничего не получилось.

Код
wd1.Range.EndOf
wd1.Range.Delete

стерло все содержимое…
В интернете ничего вразумительного не нашел.
Подскажите, пожалуйста, как в макросе Excel перейти в конец документа Word и удалить две последние строки.

 

The_Prist

Пользователь

Сообщений: 14183
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#2

27.12.2015 17:45:51

Цитата
vadi61 написал: В интернете ничего вразумительного не нашел.

Как из Excel обратиться к другому приложению

Особое внимание уделить разъяснению различий между ранним и поздним связыванием и применением именованных констант(в Вашем случае это wdCharacter и wdStory). Плюс обратите внимание на ГЛАВНУЮ ОШИБКУ НОВИЧКА — Ваш случай. Selection есть в Excel и в Word и без явного указания родителя будет относится к приложению, в котором записано.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

SuperCat

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

#3

27.12.2015 18:28:09

Просто надо использовать переменную приложения Word:

Код
Sub G()

    Dim wdApp As Word.Application
    Set wdApp = New Word.Application
    
    'Какой-то код....
    
    wdApp.Selection.EndKey Unit:=wdStory
    wdApp.Selection.Delete Unit:=wdCharacter, Count:=1

End Sub


В данном случае wdStory распознается, так как я использую раннее связывание (Early Binding).

Изменено: SuperCat27.12.2015 18:29:31

There is no knowledge that is not power

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

#4

27.12.2015 19:16:04

The_Prist,
спасибо, прочел. Я в принципе так и делал:

Код
Sub main()   
Dim wa As Object
Dim wd1 As Object
...
...
Set wa = CreateObject("Word.Application")
...
Set wd1 = wa.Documents.Open(HomeDir$ + fileRes_name$)
....
wd1.Close True
wa.Quit
Set wa = Nothing
End Sub

и здесь перед закрытием wd1 из него надо удалить две последние строки.

SuperCat,
спасибо за ответ,
к сожалению на первой же строке wdApp.Selection.EndKey Unit:=wdStory (в моем случае wd1.Selection.EndKey Unit:=wdStory) выдает ошибку.

Т.е. ошибка, видимо, потому, что значения констант wdStory и wdCharacter Еxcel’ю при позднем связывании неизвестны. А как их узнать, что бы задать цифрой?

Нет ошибка не в этом. Нашел значение константы wdStory

здесь

но все равно ошибка.

Изменено: vadi6127.12.2015 19:29:37

 

The_Prist

Пользователь

Сообщений: 14183
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#5

27.12.2015 19:28:21

Цитата
vadi61 написал: прочел
Цитата
vadi61 написал: А как их узнать, что бы задать цифрой?

как же Вы читали?

Цитата
Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения к коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

#6

27.12.2015 19:36:27

The_Prist, сделал как Вы сказали. Получил значения констант wdStory = 6, wdCharacter = 1
вставил этот код в макрос Excel’я:

Код
wd1.Selection.EndKey Unit:=6
wd1.Selection.Delete Unit:=1, Count:=1

Ошибка: Объект не поддерживает свойство или метод

 

The_Prist

Пользователь

Сообщений: 14183
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#7

27.12.2015 19:43:54

Я бы вообще отказался от Selection ибо вредно это. Вполне можно вместо него использовать Range:

Код
wd1.Range.EndKey 6 
wd1.Range.Delete 1, 1

ну а вообще без полного кода трудно гадать. Да и примеры не помешали бы…

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

The_Prist, та же ошибка на строке wd1.Range.EndKey 6 «Объект не поддерживает свойство или метод»

 

The_Prist

Пользователь

Сообщений: 14183
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#9

27.12.2015 19:48:48

Цитата
The_Prist написал: Да и примеры не помешали бы

Хочется увидеть, что именно Вы таким образом хотите удалить. Может есть другие методы — надежнее.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

The_Prist

Пользователь

Сообщений: 14183
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#10

27.12.2015 19:55:18

Например, можно два раза эту строку выполнить:

Код
wd1.Range(wd1.Range.Characters.Count - 1, wd1.Range.Characters.Count).Delete 1, 1

или один раз такую:

Код
wd1.Range(wd1.Range.Characters.Count - 1, wd1.Range.Characters.Count).Delete 1, 2

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

The_Prist, изумительно. Большое спасибо. Попробовал второй вариант с одной строкой — получилось.
Пошел разбираться с Вашим кодом (нужно же понимать, что делаешь :) )

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

The_Prist, обнаружил ошибку. Удаляются символы не последние, а сдвинутые на количество картинок в файле.
1 картинка — удаляет 2-й и 3-й символы с конца (тут все нормально поскольку 3 последних символа — конец абзаца)

А вот дальше так:
2 картинки — удаляет 3-й и 4-й символы с конца
3 картинки — удаляет 4-й и 5-й символы с конца
4 картинки — удаляет 5-й и 6-й символы с конца
5 картинки — удаляет 6-й и 7-й символы с конца и т. д.

Может быть знаете как ее обойти?

Изменено: vadi6110.01.2016 03:49:41

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#13

10.01.2016 06:07:42

Цитата
vadi61 написал: в нем всегда оказываются в конце 2 пустые строки

А не мудрите ли вы? Если под пустыми строками подразумевается параграфы (всё что получается при нажатии кнопки Enter), то проще так. В примере в документе Word. Удаляет пустые параграфы (в том числе состоящие из одних пробелов).

Успехов.

Прикрепленные файлы

  • Удалить_пустые.zip (15.7 КБ)

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

Андрей VG,спасибо за ответ. Но это же Word! А мне нужно из Excel в вордовском файле строки удалять… У меня нет доступа к получившемуся Word-файлу.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#15

10.01.2016 11:58:47

Цитата
vadi61 написал: У меня нет доступа к получившемуся Word-файлу.

Это вы серьёзно — или шутка? Тогда это что?

Цитата
vadi61 написал: Set wd1 = wa.Documents.Open(HomeDir$ + fileRes_name$)

Разве не доступ к документу Word? Чтобы использовать в моём коде этот документ достаточно заменить ThisDocument на wd1. Естественно, перенеся код в процедуре, в код книги.
Вопрос у вас, по существу, о работе с Word, а уж откуда: из VBA проекта документа Word, из VBA проекта книги Excel или даже VBA проекта чертежа Autocad — нет разницы. Точнее, в способе доступа к Word Application и предоставляемому библиотекой на уровне документа Word доступу к объекту ThisDocument.

Успехов.

 

The_Prist

Пользователь

Сообщений: 14183
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

А я вообще не понял про картинки и символы. Может настало время реально примера с данными, а не на словах описывать проблемы? Скорее соглашусь с Андреем — здесь явно нужен иной подход.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

The_Prist,  согласен. Как только доберусь до компьютера — подготовлю пример. Пока только два слова о самОй подготовке Word-файла. Сотрудник открывает Excel-файл, выбирает нужные значения из комбобоксов, устанавливает нужные переключатели, вводит какие-то значения. На основании этих данных Excel готовит данные для вставки в отчет. Потом при нажатии кнопки СОЗДАТЬ вызывается макрос, который выбирает нужные (из заранее подготовленных) шаблонов, вставляет в них данные, а затем соединяет несколько  файлов-шаблонов в один готовый отчет. К этому отчету я доступа не имею, то есть все я должен сделать в Excel-макросе.
Все сейчас работает нормально с Вашей
wd1.Range(wd1.Range.Characters.Count — 1, wd1.Range.Characters.Count).Delete 1, 2
Но как только в отчете оказывается картинки (есть шаблоны с картинками) удаляемый символ смещается влево на число символов равное количеству картинок.
Например, в конце отчета написано
12345
символ конца  строки 1
символ конца строки 2
Если в отчете картинок нет, то удалятся два символа конца строки.
А если в отчете есть, скажем, 3 картинки, то удалятся числа 3 и 4
Но я сегодня выложу пример.

Изменено: vadi6110.01.2016 14:05:41

 

The_Prist

Пользователь

Сообщений: 14183
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Так может имеет смысл сначала проверять наличие картинок и их кол-во?
wd1.Shapes.count

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

The_Prist, да, все решилось такой строкой
wd1.Range(wd1.Range.Characters.Count + wd1.Shapes.Count — 1, wd1.Range.Characters.Count + wd1.Shapes.Count).Delete 1, 2
Спасибо, еще раз!

PS. Готовить файлы примеров уже нет необходимости.

Изменено: vadi6110.01.2016 15:06:09

 

vadi61

Пользователь

Сообщений: 236
Регистрация: 03.09.2014

#20

10.01.2016 15:23:02

The_Prist, я на параллельном форуме нашел Ваш совет от октября 2014 года, где Вы используете выражение Range.End

Вставил в свой код

Код
wd1.Range(wd1.Range.End - 1, wd1.Range.End).Delete 1, 2

и сработало вне зависимости от количества картинок.

0 / 0 / 0

Регистрация: 26.11.2009

Сообщений: 5

1

26.11.2009, 14:45. Показов 17115. Ответов 17


Студворк — интернет-сервис помощи студентам

Помогите мне написать макрос для редактирования текста
Задача: найти строку с определенным словом и удалить ее



0



Busine2009

Заблокирован

26.11.2009, 20:40

2

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub DeleteLine()
Dim x As String
 
x = InputBox("Введите слово для удаления строки")
With Selection.Find
    .ClearFormatting
    .Text = "x"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute
End With
Selection.HomeKey Unit:=wdLine
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.Delete
End Sub



2



БурундукЪ

10027 / 2616 / 84

Регистрация: 17.02.2009

Сообщений: 10,364

26.11.2009, 21:50

3

Цитата
Сообщение от Busine2009
Посмотреть сообщение

.Text = «x»

эта строка не верна
должно быть так

Visual Basic
1
.Text = x



1



Busine2009

Заблокирован

26.11.2009, 21:56

4

CyberБурундукЪ
да точно, но я каким-то макаром проверил его и всё сработало.



0



10027 / 2616 / 84

Регистрация: 17.02.2009

Сообщений: 10,364

26.11.2009, 22:03

5

Цитата
Сообщение от Busine2009
Посмотреть сообщение

но я каким-то макаром проверил его и всё сработало.

там 2 варианта:
либо ты по слову Х проверял, либо у тебя в макросе Х без кавычек стоит

Не по теме:

чудеса бывают только в сказках:)



0



Busine2009

Заблокирован

27.11.2009, 06:59

6

CyberБурундукЪ,
ты не поверишь, но мой макрос работает, я попробовал несколько раз. Сам не понимаю ничего. Попробуй сам. Я же говорил, что тестировал, прежде чем вставить его сюда.



1



0 / 0 / 0

Регистрация: 26.11.2009

Сообщений: 5

07.12.2009, 16:44

 [ТС]

7

Всем огромное Спасибо



0



0 / 0 / 0

Регистрация: 26.11.2009

Сообщений: 5

08.12.2009, 18:36

 [ТС]

8

Проверил работает но есть одна проблема макрос удаляет только одну строку в которой содержится заданное слово а таких строк в документе сотни. Нужно чтобы все строки были удалены. Подскажите что делать.

Добавлено через 6 минут
CyberБурундукЪ, Проверил работает но есть одна проблема макрос удаляет только одну строку в которой содержится заданное слово а таких строк в документе сотни. Нужно чтобы все строки были удалены. Подскажите что делать.



0



Busine2009

Заблокирован

08.12.2009, 20:46

9

Carcas,
Нет, не работает.



0



Busine2009

Заблокирован

09.12.2009, 07:50

10

Carcas,
вот по сусекам нашкрябал:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub DeleteLine()
Dim DeleteLine As String
DeleteLine = InputBox("Введите слово для удаления строки", "Удаляем строки")
If DeleteLine = Empty Then Exit Sub
Application.ScreenUpdating = False
With ActiveDocument.Range.Find
    .ClearFormatting
    .Text = DeleteLine
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    While .Execute
        Selection.HomeKey Unit:=wdLine
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        Selection.Delete
    Wend
End With
Application.ScreenUpdating = True
End Sub



2



0 / 0 / 0

Регистрация: 26.11.2009

Сообщений: 5

10.12.2009, 13:40

 [ТС]

11

Сегодня проверил работает из 1800 страниц с первого раза отфильтровал 700 но я заметил что тмакрос удалил не все строки с тем словом что я задал так я проделывал эту операцию несколько раз ушло еще 220 страниц но все равно удалены не все строки с этим словом и после каждого раза приходилось сохранять и закрывать документ что бы заново воспользоваться макросом а то глючило не хотело выделять строки мышкой но меня и это устраивает я сэкономил себе кучу времени всем кто участвовал от меня огромное СПАСИБО



0



Busine2009

Заблокирован

10.12.2009, 20:07

12

Carcas,
пиши мне в почту, дам ссылку, где тебе может быть смогут ответить на твой вопрос.
Просто я вообще не шарю в программировании. Но ты можешь сам анализировать мой макрос, используя по ступенчатое его просматривание.
Я бы сюда вставил ссылку, но её удалят.



1



Busine2009

Заблокирован

11.12.2009, 05:13

13

Carcas,
а эти строки остаются подряд в конце документа или хаотично разбросаны? Может быть здесь вопрос связан с Памятью: для выполнения этого Макроса памяти может не хватает?



0



0 / 0 / 0

Регистрация: 26.11.2009

Сообщений: 5

11.12.2009, 14:28

 [ТС]

14

Строки остаются по всему документу мелкими скоплениями по2-3 а на счет памяти у меня 1гиг ддр2



0



Busine2009

Заблокирован

12.12.2009, 12:22

15

Carcas,
сейчас ещё поковырялся. Надо Курсор ставить в начало документа. Потому что поиск осуществляется от места нахождения Курсора до конца документа.

Добавлено через 58 минут
Попробуй вот этот код, в данном случае Курсор может находиться в любом месте: поиск будет начинаться с начала документа:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub DeleteLine()
Dim DeleteLine As String
DeleteLine = InputBox("Введите слово для удаления строки", "Удаляем строки")
If DeleteLine = Empty Then Exit Sub
Application.ScreenUpdating = False
With ActiveDocument.Range.Find
    .ClearFormatting
    .Text = DeleteLine
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    While .Execute
        .Parent.Select
        Selection.HomeKey Unit:=wdLine
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        Selection.Delete
    Wend
End With
Application.ScreenUpdating = True
End Sub



0



keha

14 / 3 / 0

Регистрация: 27.07.2018

Сообщений: 88

03.02.2019, 15:26

16

А я вот так делаю

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub DeleteLine()
    Dim str As String ' Где меняем
    Dim x As String ' Что под замену
    Dim y As String ' На что менняем
 
    y = "На что менняем"
 
    x = InputBox("Введите слово для удаления строки")
 
    Selection.WholeStory ' Выделяет всё
    str = Selection.Text ' Из выделенного в переменную
    str = Replace(str, x, y) ' Заменяет
    Selection.TypeText Text:=s ' Пишем в документ
    Selection.HomeKey Unit:=wdStory 'Курсор в начало документа
End Sub



0



15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

03.02.2019, 19:41

17

keha, этот код вообще ничего не заменяет, Option Explicit покажет почему.
После исправления — а как дела с форматированием, с таблицами?



1



keha

14 / 3 / 0

Регистрация: 27.07.2018

Сообщений: 88

03.02.2019, 20:48

18

Да я прям сейчас с текстом работаю и всё успешно меняет.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub ЗаменаТипаВсехУдаренийВорд()
 
    Dim s As String
    
    Selection.WholeStory
    
    s = Selection.Text
    s = Replace(s, ChrW(769), "=")
    Selection.TypeText Text:=s
'В начало документа
    Selection.HomeKey Unit:=wdStory
 
End Sub

С таблицами сделал но, только изначально колонки должны быть одинаковой ширины
и ещё что то включал чтобы не менялся размер ширины тогда и при возврате попадает всё хорошо.



0



enter image description hereI would like to delete certain lines from my word document using a VBA macro. Basically the (block of) text to be deleted (and replaced by «***») follows a certain pattern (below).

Bottom of Form
perma-link

Top of Form
save
Bottom of Form
[+] ....
[–] ....
Top of Form

«….» represents text that changes every block, but for sure the line starts with «[+]» or «[-]».

Please suggest a suitable macro

EDIT: In the screenshot, I would like to keep the text in yellow and delete the rest. (in the actual file, the text isn’t in yellow)

PS-FYI, I tried using the example looping a find and delete row macro (for line by line deletion) but i get a runtime error 5941 with debugging option highlighting the line «selection.row.delete» in the macro.

What does this mean?

Community's user avatar

asked Oct 3, 2013 at 17:20

Abhimanyu Arora's user avatar

9

Assuming that the example list is a list of paragraphs beginnings the following code should do the trick. What you have to do is to place all ‘paragraphs starting’ into array arrRemove as I did for the test. If any of the mark is a special marks (see this link for additional information) you need to add in front of it as I did for [+] and [-]. Hope this is what you are looking for.

Sub Macro2()

    Dim arrRemove As Variant
        arrRemove = Array("Bottom of Form", "perma -link", "Top of Form", _
                    "[+]", "[-]", "Donec", "In")

    Dim i!
    For i = 0 To UBound(arrRemove)
        Activedocument.Range(0,0).select

        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = arrRemove(i) & "*^13"
            .Replacement.Text = ""  'replace with nothing

            .Forward = True
            .Wrap = wdFindContinue
            .MatchCase = False
            .MatchWildcards = True
        End With
        Selection.Find.Execute Replace:=wdReplaceAll

    Next i

End Sub

The above macro will remove all yellow paragraph in the following document.

enter image description here

answered Oct 3, 2013 at 20:32

Kazimierz Jawor's user avatar

Kazimierz JaworKazimierz Jawor

18.8k7 gold badges35 silver badges55 bronze badges

1

Сегодня появилась интересная задача:

В 200 страничном документе Word найти определенное слово и удалить не только его, а всю строку, в которой это слово стоит.

Очень помог гугл и сайт cyberforum.ru.

Итоговый скрипт:

‘ Скрипт ищет строки с определенным словом и удаляет ее.

Sub DeleteLine()

Dim DeleteLine As String

DeleteLine = InputBox(«Введите слово для удаления строки», «Удаляем строки»)

If DeleteLine = Empty Then Exit Sub

Application.ScreenUpdating = False

With ActiveDocument.Range.Find

.ClearFormatting

.Text = DeleteLine

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

While .Execute

.Parent.Select

Selection.HomeKey Unit:=wdLine

Selection.EndKey Unit:=wdLine, Extend:=wdExtend

Selection.Delete

Wend

End With

Application.ScreenUpdating = True

End Sub

Like this post? Please share to your friends:
  • Удаление строки excel если
  • Удаление строк по условию в excel vba excel
  • Удаление строк по значению в ячейке в excel
  • Удаление строк в excel по условию python
  • Удаление строк в excel по номерам