Дзен-программист
122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
1 | |
Из файла xls/xlsx взять выбранную пользователем строку и создать документ docx10.09.2014, 20:59. Показов 2077. Ответов 16
Метки нет (Все метки)
Здравствуйте! Возник довольно примитивный вопрос, но никак не получается найти ответ. Можно ли с помощью VBA провернуть следующую схему: из файла .xls/.xlsx с некоторым количеством строк взять выбранную пользователем строку и создать документ .docx, опираясь на данные, хранящиеся в этой строке? Более того: можно ли добавить в файл .docx изображение, путь к которому хранится в одном из полей исходной строки?
Заранее спасибо!
0
|
10.09.2014, 20:59 | |
Ответы с готовыми решениями:
16
Создание файла *.xls (*.xlsx) по заданному пользователем адресу Работа с файлами в формате .doc, .docx, .xls, .xlsx Скрипт поиска слов в любых файлах, в т.ч. docx, doc, xlsx, xls Бесплатные либы для создания, редактирования PDF, DOCX, XLSX, XLS, DOC и конвертации их между собой |
Модератор
|
|
11.09.2014, 09:11 | 2 |
пример в студию(пару строк с картинками)
==== кстати, какой у картинок --размер(типа иконок или солидный)
1
|
2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
|
11.09.2014, 09:41 | 3 |
Можно. Специалисту в VBA для этого понадобится от 15 минут до пары часов времени, включая тестирование. Это при наличии полного ТЗ, исключении всех вопросов, возникающих в процессе написания, наличии файлов примеров для обработки, на которых можно произвести тестирование. На этом форуме вам помогут сделать примерно за 1-2 дня, если дадите людям файлы примеров и полное описание задачи.
1
|
2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
||||||
11.09.2014, 09:47 | 4 | |||||
Сообщение было отмечено xenohunter как решение
Решение
Вот пример пары макросов, которые по набору строк в таблице делают по 2-3 документа в Word и Excel, плюс формируют сводный список - опись сгенерированных документов для сопроводительного письма.
Кликните здесь для просмотра всего текста
1
|
Дзен-программист
122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
11.09.2014, 16:12 [ТС] | 5 |
shanemac51, данные будут выглядеть примерно так:
Код
A | B | C | D № | Имя | Фамилия | Путь к изображению 1 | Иван | Сидоров | С:\Photo\Img_1.jpg mc-black, спасибо большое за пример! Это, вероятней всего, именно то что нужно. Попробую вечером в нём разобраться, и, если будут вопросы, напишу ещё.
0
|
2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
|
11.09.2014, 16:34 | 6 |
В двух словах - документы .docx мне было проще не создавать с нуля, а использовать специально подготовленный шаблон, который брать за основу, я сделал шаблоны в формате .dotx. Далее, в открытом шаблоне остается автоматом заменить заранее подготовленные поля типа "%username%" на "Иван Иванович Иванов" и так далее. С точки зрения программирования это выглядит очень просто.
0
|
Дзен-программист
122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|||||||||||
16.09.2014, 01:55 [ТС] | 7 | ||||||||||
mc-black, сделал всё почти как в вашем примере, скрипт запускается, но не работает замена слов-переменных в шаблоне. Шаблон .dotx, всё его содержимое - строка "%username%". Код скрипта:
0
|
Модератор
|
||||||
16.09.2014, 07:00 | 8 | |||||
Попробуйте так
1
|
Дзен-программист
122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
16.09.2014, 10:19 [ТС] | 9 |
shanemac51, да, без директивы Set переменная создаётся, спасибо. Replacement по-прежнему не работает.
0
|
2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
|
16.09.2014, 11:14 | 10 |
Ваш код из 7-го поста выглядит работоспособным (корректным). В шаблоне dotx точно есть кусочек текста %username%? Может написано немного иначе? Прикрепите в сообщении пример файла dotx и файла excel, запаковав из в zip (иначе не прикрепить). Без отладки на данных VBA-код как набор букв, его не выполнить, не разберешься в чем дело. Объявления лишних переменных можно убрать: Dim lr As ListRow, wbk As Workbook, dst As Worksheet
1
|
Дзен-программист
122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
16.09.2014, 11:26 [ТС] | 11 |
mc-black, в шаблоне точно есть строка "%username%", копировал прямо из макроса. Более того, после выполнения Selection.Find Execute Replace:=wdReplaceAll свойство Selection.Find.Found устанавливается в True, но замены не происходит. Немного поменял код, но принципиальных изменений нет, он так и не работает.
0
|
Модератор
|
|
16.09.2014, 11:26 | 12 |
--может в коллонтитуле --или в надписи
0
|
2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
|
||||||
16.09.2014, 11:46 | 13 | |||||
В объявления надо вставить строку:
Как выловил ошибку? Поставил в начале модуля Option Explicit, начал отладку и сразу выяснилось, что не объявлена переменная wdReplaceAll, а так как всё необъявленное инициализируется нулями, то вышло что вышло. Всем (кроме Catstail) настоятельно рекомендую использовать Option Explicit.
1
|
Дзен-программист
122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
16.09.2014, 14:29 [ТС] | 14 |
mc-black, спасибо! Думал, это встроенный параметр: во всех руководствах в такой форме написано.
Теперь осталось добавить изображение, сейчас буду экспериментировать.
0
|
Дзен-программист
122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|||||||||||
18.09.2014, 21:41 [ТС] | 15 | ||||||||||
mc-black, изображение вставляется, но не удаётся позиционировать его. Пробовал добавить изображение в коллекцию Shapes документа (wrd.Selection.Shapes.AddPicture), выпала ошибка "Run-time error '438': Object doesn't support this property or method". В коллекцию InlineShapes добавляется (wrd.Selection.InlineShapes.AddPicture), но тогда нет возможности добавить позицию и размеры изображения. Также необходимо поместить изображение "за текст", чтобы надписи не сдвигались, для этого использую метод .ConvertToShape объекта изображения; он работает. Весь актуальный код:
P.P.S. После применения .ConvertToShape искомые свойства так и не получается изменить, выпадает ошибка "Run-time error '438': Object doesn't support this property or method", только уже по отношению к выражению pic.Left = 0. Добавлено через 23 часа 45 минут Решение найдено. Судя по всему, объекты в VB обладают странным, на мой взгляд, свойством. При изменении типа объекта через переменную (pic.ConvertToShape), сам объект, будучи частью коллекции, остаётся в документе, и его свойства изменяются, но вот в переменной, через которую мы воздействовали на объект, ссылка на него пропадает. Этим и объясняется то, что огромное количество методов возвращают изменённый объект. Решается проблема просто: создаём дополнительную переменную, и все необходимые операции по позиционированию проводим с ней:
0
|
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
|
|||||||||||
18.09.2014, 22:52 | 16 | ||||||||||
xenohunter, На самом деле, можно использовать Shapes.AddPicture и сразу указывать позицию рисунка. Нужно только вспомнить, что у Shape родитель - это документ, в примере, это doc, а не Selection
1
|
Дзен-программист
122 / 87 / 16
Регистрация: 10.04.2013
Сообщений: 253
|
|
19.09.2014, 00:49 [ТС] | 17 |
pashulka, да, этого я не знал. Пробовал только обращаться как к объекту приложения Word. Спасибо.
0
|
19.09.2014, 00:49 | |
19.09.2014, 00:49 | |
Помогаю со студенческими работами здесь
17
В одной учетной записи не открываются файлы *.doc *.xls (При этом все хорошо с *.docx *.xlsx) Как извлечь из XLS-файла заданную строку и записать её в текстовый документ? DataGridView: Как получить выбранную пользователем строку Удалить строку, выбранную пользователем в объекте DataGridView Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |