Удаление пустых строк макрос для word

В документе, загруженном из Интернета, слишком много пустых строк (перенос строк вручную). Чтобы сэкономить бумагу и место, нам нужно удалить все пустые строки. Есть ли более простой способ удалить все пустые строки вместо того, чтобы удалять каждую вручную? В этом руководстве будут перечислены три доступных метода для удаления всех пустых строк в целом или для выбора документов:

Удалите все пустые строки с помощью параметра Найти и заменить

Удалите все пустые строки с помощью VBA

Удалите все пустые строки с помощью Kutools for Word


Удалите все пустые строки с помощью параметра Найти и заменить

Наблюдения и советы этой статьи мы подготовили на основании опыта команды Найти и заменить функция в Word обычно используется для удаления всех пустых строк, но вы должны знать, что пустые строки называются Ручной перенос строки в Найдите то, что опцию.

1. Нажмите Замените на Главная таб. Смотрите скриншот:

документ удалить пустые ручные строки 1

2. Когда Найти и заменить появится диалоговое окно, нажмите Подробнее >> кнопку, чтобы отобразить дополнительные параметры. Затем поместите курсор в Найдите то, что поле и выберите Ручной разрыв строки из Особый выпадающее меню, см. снимок экрана:

документ удалить пустые ручные строки 2

3. Там будет «^l”Персонаж в Найдите то, что поле и нажмите Заменить все. Все ручные разрывы строк были удалены сразу, см. Снимок экрана:

документ удалить пустые ручные строки 3


Удалите все пустые строки с помощью VBA

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

1, нажмите Alt + F11 для открытия Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модули, а затем скопируйте приведенный ниже код VBA в окно модуля.

Код VBA: удаление всех ручных разрывов строк в документе:

Sub Deleemptylines()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^l"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

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


Удалите все пустые строки с помощью kutools for Word

Вышеупомянутые методы требуют нескольких шагов для удаления всех пустых строк, но с Kutools for Word, только один щелчок мыши поможет вам завершить эту операцию.

1. Пожалуйста, примените эту утилиту, нажав Кутулс > Пустые параграфы > Удалить пустые разрывы строк вручную. Смотрите скриншот:

2. Затем появится диалоговое окно с напоминанием об удалении всех пустых строк, нажмите Да кнопку, см. снимок экрана:

документ удалить пустые ручные строки 5

3. После нажатия Да, вы можете видеть, что все пустые строки удалены из документа. Смотрите скриншот:

документ удалить пустые ручные строки 3

Внимание: Если вам просто нужно удалить пустые строки в выделении, вы должны выбрать диапазон перед применением этой функции.

Нажмите, чтобы скачать Kutools for Word и бесплатная пробная версия прямо сейчас!


Демонстрация: удаление всех пустых строк в Word



Рекомендуемые инструменты для повышения производительности Word

выстрел kutools word kutools tab 1180x121

выстрел kutools word kutools plus tab 1180x120

Kutools For Word — Более 100 расширенных функций для Word, сэкономьте 50% времени

  • Сложные и повторяющиеся операции можно производить разово за секунды.
  • Вставляйте сразу несколько изображений из папок в документ Word.
  • Объединяйте и объединяйте несколько файлов Word из папок в одну в желаемом порядке.
  • Разделите текущий документ на отдельные документы в соответствии с заголовком, разрывом раздела или другими критериями.
  • Преобразование файлов между Doc и Docx, Docx и PDF, набор инструментов для общих преобразований и выбора и т. Д.

Updated: Below is a modified version of your code that will spin thru all rows of a table (in MS-Word) and delete every row that contains only a ‘$’ in column 3 and column 4 is empty.

Option Explicit

' This subroutine will spin thru all rows of data in a table in MS-Word (except the first row, which is the header).
' If column 3 contains only a '$' AND column 4 is empty, the row will be deleted.
' All rows with only the '$' in column 3 and empty cell 4 will be deleted.

Sub TEST()
Dim i       As Long
'Dim char    As String

    With Selection.Tables(1)
        For i = .Rows.Count To 1 Step -1
            'char = .Cell(i, 3).Range.Text
            'Debug.Print Asc(Mid(char, 1, 1)) & vbTab & Asc(Mid(char, 2, 1)) '& vbTab & Asc(Mid(char, 3, 1))
            'Debug.Print ">" & .Cell(i, 2).Range.Text & "<"
            If Len(.Cell(i, 4).Range.Text) = 2 And Left(.Cell(i, 3).Range.Text, 1) = "$" Then
                .Rows(i).Delete
            End If
        Next i
    End With
End Sub

118 / 0 / 0

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

Сообщений: 26

1

27.02.2013, 08:22. Показов 7362. Ответов 15


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

Извините что обращаюсь с таким ламерским вопросом — никак не удается мне разобраться с объектами Range. Может, на этом, конкретном, примере удастся разобраться.



0



ViterAlex

8927 / 4839 / 1885

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

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

27.02.2013, 09:33

2

Можно и без Range:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub WithReplacement()
    Selection.EndKey wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "(^0013){2;}"
        .Replacement.Text = "1"
        .Forward = False
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceOne
End Sub

Но остаётся хвост в виде одного абзаца. С Range оно будет надёжнее:

Visual Basic
1
2
3
4
5
6
7
8
Sub WithRange()
    Dim opar As Paragraph
    Set opar = ActiveDocument.Range.Paragraphs.Last
    While Len(opar.Range.Text) = 1
        Set opar = opar.Previous
        opar.Next.Range.Delete
    Wend
End Sub



1



Скрипт

5468 / 1148 / 50

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

Сообщений: 3,514

27.02.2013, 10:14

3

Вот такой вариант:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Procedure_1()
    
    'Проверка, что в абзаце ничего нет, кроме символа "Конец абзаца", и что в документе 
        'больше одного абзаца, т.к. если будет один абзац в документе и этот 
        'абзац будет пустой, то будет зацикливание, т.к. нельзя удалить абзац, 
        'если он единственный в документе.
    Do While ActiveDocument.Paragraphs.Last.Range.Text = Chr(13) And _
            ActiveDocument.Paragraphs.Count > 1
        ActiveDocument.Paragraphs.Last.Range.Delete
    Loop
 
End Sub

Примечание

Разницы между циклами «While … Wend» и «Do … Loop» нет, но в VBA-справочниках не упоминается цикл «While … Wend». Я так понимаю, что цикл «While … Wend» используют программисты, которые давно занимаются программированием, а цикл «Do … Loop» появился недавно и предназначен для использования вместо цикла «While … Wend».



2



ViterAlex

27.02.2013, 10:27

Не по теме:

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

VBA-справочниках не упоминается цикл «While … Wend»

Как хорошо, что ни одного справочника по VBA я не читал и не знал, что такой цикл там не упоминается. На самом деле это просто более короткая запись цикла Do…Loop с предусловием. Цикл с послеусловием короче записать не получится. Наткнулся на этот цикл уже не помню где и понравилась его лаконичность.



1



Alex Ingor

118 / 0 / 0

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

Сообщений: 26

27.02.2013, 19:24

 [ТС]

5

2 ViterAlex, Скрипт: Спасибо, ребята, за помощь. Все три макроса работают, я воспользовался вариантом 2 (WithRange). Очень понравилось такое использование next и previous в нем.
Вариант 3, предложенный Скриптом, тоже хорош. Чтобы выполнить указанную проверку, мне кажется, его можно было изменить таким образом:

PureBasic
1
2
3
4
5
6
7
8
Sub Procedure_1()    
    If ActiveDocument.Paragraphs.Count > 1 then
       Do While ActiveDocument.Paragraphs.Last.Range.Text = Chr(13) And _
       ActiveDocument.Paragraphs.Count > 1
          ActiveDocument.Paragraphs.Last.Range.Delete
       Loop 
    End If
End Sub



0



5561 / 1367 / 150

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

Сообщений: 4,107

Записей в блоге: 30

27.02.2013, 19:35

6



1



62 / 4 / 1

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

Сообщений: 100

28.04.2015, 13:12

7

Вариант Скрипта зацикливается, если таблица выше.



0



barinrec

62 / 4 / 1

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

Сообщений: 100

05.05.2015, 10:24

8

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

Visual Basic
1
2
3
4
5
6
7
8
Sub WithRange()
    Dim opar As Paragraph
    Set opar = ActiveDocument.Range.Paragraphs.Last
    While Len(opar.Range.Text) = 1
        Set opar = opar.Previous
        opar.Next.Range.Delete
    Wend
End Sub

Бесконечный цикл, если пустой файл.



1



shanemac51

Модератор

Эксперт MS Access

11343 / 4661 / 749

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

Сообщений: 13,512

Записей в блоге: 4

05.05.2015, 10:45

9

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub WithRange150505()
    Dim opar As Paragraph, j2
    j2 = 0
    Set opar = ActiveDocument.Range.Paragraphs.Last
    Do While Len(opar.Range.Text) = 1
        Set opar = opar.Previous
        opar.Next.Range.Delete
        j2 = j2 + 1
        If j2 > 10000 Then '''против зацикливания
        Exit Do
        End If
        Debug.Print j2;
    Loop
End Sub



1



barinrec

62 / 4 / 1

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

Сообщений: 100

05.05.2015, 10:49

10

Вот так вылазить вроде из цикла

Visual Basic
1
2
3
4
5
Do While Len(opar.Range.text) = 1
If opar.Previous = Null Then Exit Do
Set opar = opar.Previous
opar.Next.Range.DELETE
Loop



1



barinrec

62 / 4 / 1

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

Сообщений: 100

01.07.2015, 17:11

11

В ворде пробовал код. Ошибка вываливается с пустом документе. Добавил еще условие выхода.

Visual Basic
1
2
3
4
5
6
            Do While Len(opar.Range.Text) = 1
            If ActiveDocument.ComputeStatistics(wdStatisticCharacters) = 0 Then Exit Do 'Тупо пустой документ
            If opar.Previous = Null Then Exit Do
            Set opar = opar.Previous
            opar.Next.Range.Delete
            Loop



0



1 / 1 / 0

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

Сообщений: 56

10.01.2016, 01:53

12

А как сделать то же самое из макроса Excel?
Создается Word-Dokument из Excel-файла на основании шаблона (100% не пустой). После вставок в него текста из других файлов появляются пустые строки в конце документа. Их надо удалить.

Хотел попробовать предложение ViterAlex Sub (WithRange) но не могу объявить
Dim opar As Paragraph
Excel этот тип не понимает



0



5561 / 1367 / 150

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

Сообщений: 4,107

Записей в блоге: 30

10.01.2016, 02:26

13

Чтобы понимал, ему в VBE надо подключить библиотеку объектов MS Word.

А вообще, дорогой коллега,

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

Dokument из Excel-файла

легче обработатать уже сам по себе, не через Excel:

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

https://www.cyberforum.ru/vba/thread440755.html

Тогда и коды shanemac51, Скрипт, ViterAlex и даже Busine2012 перелопачивать не придётся, ведь

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

Все три макроса работают



0



1 / 1 / 0

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

Сообщений: 56

10.01.2016, 03:54

14

ув. Sasha_Smirnov, спасибо за ответ. Но, к сожалению обрабатывать Word-документ может и легче, но у меня нет такой возможности. Сотрудник (но человек далекий от VBA) выбирает в Excel’е ряд критериев (в основном выпадающие списки) и жмет кнопочку. В итоге получается Word-файл, который он распечатывает и несет на подпись. Все делается в Excel’e. Осталось только удалить эти «несчастные» 2 строки, которые вылазят на новую страницу.
На соседнем форуме мне подсказали такое решение:
wd.Range(wd.Range.Characters.Count — 1, wd.Range.Characters.Count).Delete 1, 2
Это работает на 99% файлов, но на нескольких файлах почему-то удаляет не 2 последних символа, а 9-й и 10-й с конца.

Я смотрел ветку по Вашей ссылке. Не получается у меня из Excel с EndKey сработаться…

Добавлено через 1 час 4 минуты
Я разобрался почему wd.Range(wd.Range.Characters.Count — 1, wd.Range.Characters.Count).Delete 1, 2 срабатывает не всегда. Зависит от наличия и количества картинок в файле. Каждая картинка сдвигает удаление на один символ к началу файла.
Но проблема осталась: как удалить две последние пустые строки.



0



5561 / 1367 / 150

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

Сообщений: 4,107

Записей в блоге: 30

10.01.2016, 04:17

15

Как из Эксселя — не знаю. Вскорости проснутся знатоки офисных задач!

Не по теме:

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

Сотрудник

что, перед распечаткой, два раза Delete нажать — считает переработкой?!

(Мне всегда любопытны такие ситуации, но сор из избы, конечно, можете и не выносить полностью.)

По поводу подключения библиотек сделал для ясности пару снимков:

Миниатюры

Удалить пустые строки в конце документа Word
 

Удалить пустые строки в конце документа Word
 



0



vadi61

1 / 1 / 0

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

Сообщений: 56

10.01.2016, 14:49

16

ув. Sasha_Smirnov, спасибо за разъяснения по подключению библиотек, сейчас буду пробовать…

Добавлено через 3 часа 5 минут
Все решилось такой строкой

Visual Basic
1
wd.Range(wd.Range.Characters.Count + wd.Shapes.Count - 1, wd.Range.Characters.Count + wd.Shapes.Count).Delete 1, 2



0



Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.

VSL
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 03.08.2005 (Ср) 13:55

Удаление пустых строк из документа Word

Помогите, пожалуйста, удалить пустые строчки в Worde, так надоело их вручную удалять, а как написать макрос не хвататет времени читать.

Спасибо


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.08.2005 (Ср) 15:00

Код: Выделить всё
Do

  With ThisDocument.Content.Find

    .Format = False

    .MatchCase = False

    .MatchWholeWord = False

    .MatchWildcards = False

    .Text = "^p^p"

    If Not .Execute() Then Exit Do

    If Not .Found Then Exit Do

    .Replacement.Text = "^p"

    .Execute Replace:=wdReplaceAll

  End With

Loop

Lasciate ogni speranza, voi ch’entrate.



Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 1

 

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

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

Like this post? Please share to your friends:
  • Удаление пустых строк в ячейке excel
  • Удаление пустых страниц в excel
  • Удаление промежуточных итогов в excel
  • Удаление пробелов между цифрами в excel
  • Удаление пробелов в числах excel