Страницы: 1
RSS
Как из Еxcel-файла удалить строку в Word-документе
 
Добрый день,
в 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 и удалить две последние строки.
 
Цитата
vadi61 написал: В интернете ничего вразумительного не нашел.
Как из Excel обратиться к другому приложению

Особое внимание уделить разъяснению различий между ранним и поздним связыванием и применением именованных констант(в Вашем случае это wdCharacter и wdStory). Плюс обратите внимание на ГЛАВНУЮ ОШИБКУ НОВИЧКА - Ваш случай. Selection есть в Excel и в Word и без явного указания родителя будет относится к приложению, в котором записано.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Просто надо использовать переменную приложения 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).
Изменено: SuperCat - 27.12.2015 18:29:31
There is no knowledge that is not power
 
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 здесь но все равно ошибка.
Изменено: vadi61 - 27.12.2015 19:29:37
 
Цитата
vadi61 написал: прочел
Цитата
vadi61 написал: А как их узнать, что бы задать цифрой?
как же Вы читали?
Цитата
Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения к коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, сделал как Вы сказали. Получил значения констант wdStory = 6, wdCharacter = 1
вставил этот код в макрос Excel'я:
Код
wd1.Selection.EndKey Unit:=6
wd1.Selection.Delete Unit:=1, Count:=1

Ошибка: Объект не поддерживает свойство или метод
 
Я бы вообще отказался от Selection ибо вредно это. Вполне можно вместо него использовать Range:
Код
wd1.Range.EndKey 6 
wd1.Range.Delete 1, 1
ну а вообще без полного кода трудно гадать. Да и примеры не помешали бы...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, та же ошибка на строке wd1.Range.EndKey 6 "Объект не поддерживает свойство или метод"
 
Цитата
The_Prist написал: Да и примеры не помешали бы
Хочется увидеть, что именно Вы таким образом хотите удалить. Может есть другие методы - надежнее.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Например, можно два раза эту строку выполнить:
Код
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
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, изумительно. Большое спасибо. Попробовал второй вариант с одной строкой - получилось.
Пошел разбираться с Вашим кодом (нужно же понимать, что делаешь :) )
 
The_Prist, обнаружил ошибку. Удаляются символы не последние, а сдвинутые на количество картинок в файле.
1 картинка - удаляет 2-й и 3-й символы с конца (тут все нормально поскольку 3 последних символа - конец абзаца)

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

Может быть знаете как ее обойти?
Изменено: vadi61 - 10.01.2016 03:49:41
 
Цитата
vadi61 написал: в нем всегда оказываются в конце 2 пустые строки
А не мудрите ли вы? Если под пустыми строками подразумевается параграфы (всё что получается при нажатии кнопки Enter), то проще так. В примере в документе Word. Удаляет пустые параграфы (в том числе состоящие из одних пробелов).

Успехов.
 
Андрей VG,спасибо за ответ. Но это же Word! А мне нужно из Excel в вордовском файле строки удалять... У меня нет доступа к получившемуся Word-файлу.
 
Цитата
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,  согласен. Как только доберусь до компьютера - подготовлю пример. Пока только два слова о самОй подготовке Word-файла. Сотрудник открывает Excel-файл, выбирает нужные значения из комбобоксов, устанавливает нужные переключатели, вводит какие-то значения. На основании этих данных Excel готовит данные для вставки в отчет. Потом при нажатии кнопки СОЗДАТЬ вызывается макрос, который выбирает нужные (из заранее подготовленных) шаблонов, вставляет в них данные, а затем соединяет несколько  файлов-шаблонов в один готовый отчет. К этому отчету я доступа не имею, то есть все я должен сделать в Excel-макросе.
Все сейчас работает нормально с Вашей
wd1.Range(wd1.Range.Characters.Count - 1, wd1.Range.Characters.Count).Delete 1, 2
Но как только в отчете оказывается картинки (есть шаблоны с картинками) удаляемый символ смещается влево на число символов равное количеству картинок.
Например, в конце отчета написано
12345
символ конца  строки 1
символ конца строки 2
Если в отчете картинок нет, то удалятся два символа конца строки.
А если в отчете есть, скажем, 3 картинки, то удалятся числа 3 и 4
Но я сегодня выложу пример.
Изменено: vadi61 - 10.01.2016 14:05:41
 
Так может имеет смысл сначала проверять наличие картинок и их кол-во?
wd1.Shapes.count
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, да, все решилось такой строкой
wd1.Range(wd1.Range.Characters.Count + wd1.Shapes.Count - 1, wd1.Range.Characters.Count + wd1.Shapes.Count).Delete 1, 2
Спасибо, еще раз!

PS. Готовить файлы примеров уже нет необходимости.
Изменено: vadi61 - 10.01.2016 15:06:09
 
The_Prist, я на параллельном форуме нашел Ваш совет от октября 2014 года, где Вы используете выражение Range.End

Вставил в свой код
Код
wd1.Range(wd1.Range.End - 1, wd1.Range.End).Delete 1, 2
и сработало вне зависимости от количества картинок.
Страницы: 1
Читают тему
Наверх