Vba word удалить строку текста

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

0 / 0 / 0

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

Сообщений: 11

1

26.08.2009, 19:51. Показов 14659. Ответов 7


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

а как решить вот такую задачу:

-имеем документы WORD, в которых есть пустые строки, количество их разное от 1 до 10-20 подряд

надо чтобы все пустые строки (подряд более одной) удалялись макросом

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



0



0 / 0 / 0

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

Сообщений: 112

29.01.2012, 22:23

2

Здравствуйте
Намекните пожалуйста какие объекты и свойства нужно использовать для удаления ненужной строки(т.е. пустая строка или строка содержащая текст «удали меня») в документе Word. Удалять надо в цикле(кол-во параграфов, абзацев может быть разное).
Подразумеваю, что надо использовать Paragraph, но только непойму как. В документе есть таблицы.



0



Silver

30.01.2012, 11:04

3

Visual Basic
1
2
3
4
5
6
7
Sub ReadSentences()
  Dim l As Long
  
  For l = 1 To ThisDocument.Sentences.Count
    MsgBox ThisDocument.Sentences(l)
  Next l
End Sub

Данный пример перебирает предложения в тексте. Думаю, что тебе нужны все-же предложения, а не строки.

0 / 0 / 0

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

Сообщений: 112

30.01.2012, 18:05

4

Спасибо за ответ.
Подскажите пожалуйста как удалить пустую строку следующую за таблицей.
Замена «^p» на «»-не помогает.



0



flower2005

0 / 0 / 0

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

Сообщений: 76

01.02.2012, 13:39

5

Может быть, такой вариант подойдет?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Del_parag()
'
'удаляет пустой абзац после таблицы, если он есть
'
For i = 1 To ActiveDocument.Tables.Count
    ActiveDocument.Tables(i).Select
    Selection.Start = Selection.End
    Selection.Expand wdParagraph
    If Selection.Characters.Count = 1 Then
        MsgBox "Пусто"
        Selection.Delete
    End If
Next i
End Sub

Если пустых абзацев несколько, надо немного доработать.



0



0 / 0 / 0

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

Сообщений: 112

01.02.2012, 15:51

6

to: flower2005
Ваш макрос заработал, но появилась другая проблема. В файле между таблицами есть какието символы. Как их удалить ? Файл прилагается.



0



flower2005

0 / 0 / 0

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

Сообщений: 76

08.02.2012, 11:14

7

Пример текста содержит примечания от нескольких рецензентов
После удаления примечаний удаляется пустая строка. Если все таблицы должны объединиться в одну, то требуется доработка. (хотя можно и два раза запустить процедуру )

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub udal2()
    On Error Resume Next
    'l = ActiveDocument.Comments.Count
    'MsgBox l
    WordBasic.DeleteAllCommentsInDoc
For i = 1 To ActiveDocument.Tables.Count
    ActiveDocument.Tables(i).Select
    Selection.Start = Selection.End
    Selection.Expand wdParagraph
    stroka = Trim(Selection.Range.Text)
    If Len(stroka) = 1 Then
        'MsgBox "Ïóñòî" & " " & i
        Selection.Delete
    End If
Next i
End Sub



0



0 / 0 / 0

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

Сообщений: 112

09.02.2012, 19:56

8

Спасибо. Сработало!



0



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

В 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

 

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

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

Сообщений: 14182
Регистрация: 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

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

Сообщений: 14182
Регистрация: 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

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

Сообщений: 14182
Регистрация: 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

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

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

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

#9

27.12.2015 19:48:48

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

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

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

 

The_Prist

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

Сообщений: 14182
Регистрация: 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

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

Сообщений: 14182
Регистрация: 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

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

Сообщений: 14182
Регистрация: 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

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

Sub макрос()

        Dim spl, instr_ As Long, i As Long

        ‘1. Отключение монитора (может это ускорит макрос и чтобы не мерцало).
    Application.ScreenUpdating = False

    ‘2. Оставление после точки трёх цифр.
    With ActiveDocument.Range.Find
        .Text = «(.[0-9]{3})([0-9]{1;})»
        .Replacement.Text = «1»
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With

        ‘3. Удаление абзацев, в которых только номер.
    ‘ Запись текста из документа в переменную-массив «spl».
        ‘ С массивом быстрее работать, чем с ворд-объектами.
    spl = Split(ActiveDocument.Range.Text, Chr(13))
    ‘ Цикл по массиву снизу вверх.
    For i = UBound(spl) To 0 Step -1
        ‘ Если элемент массива не пустой.
        If spl(i) <> «» Then
            ‘ Поиск первой правой скобки (вдруг их может быть несколько).
            instr_ = InStr(spl(i), «)»)
            ‘ Смотрим, есть ли справа от правой скобки что-нибудь.
            ‘ Если правая скобка находится в конце элемента массива.
            If instr_ = Len(spl(i)) Then
                ‘ Удаление абзаца.
                ActiveDocument.Paragraphs(i + 1).Range.Delete
            End If
        End If
    Next i

        ‘4. Вкл. монитора.
    Application.ScreenUpdating = True

        ‘5. Сообщение, чтобы юзер понял, что макрос завершил работу.
    MsgBox «Готово.», vbInformation

    End Sub

[свернуть]

Like this post? Please share to your friends:
  • Vba word удалить столбец таблицы
  • Vba word удалить символ
  • Vba word удалить разрыв раздела
  • Vba word удалить пробелы
  • Vba word удалить интервал после абзаца