| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование, связанное с MS Office > Где можно посмотреть ссылку на источник данных. |
| Автор: Валк 22.8.2006, 07:01 |
| Есть некая книга Excel. Данные из неё переносятся в документ Word. Естественно в документе Word где-то расположена ссылка на книгу Excel. Где это находится? Можно ли прописать её путь не полностью (в формате C:\Documents\Papka1\...\kniga.xls), а таким образом, чтобы источник был расположен в одной папке с документом (папка должна иметь возможность миграции)? |
| Автор: ИгнатьевАлексей 22.8.2006, 08:59 | ||
Тут не совсем понятно. Идет экспорт данных программным путем или используются стандартные оффисные приемы? |
| Автор: Валк 22.8.2006, 14:06 |
| ИгнатьевАлексей Идет экспорт данных программным путем или используются стандартные оффисные приемы? Наверное используются стандарные офисные приёмы. Т. е. в Word'е на панели инструментов "Слияние" давится кнопка "Открыть источник данных", затем этот источник выбирается. Как можно в документе Word где-то прописать этот источник, при условии, что это всегда книга с одним и тем же названием и находится в одной папке с этим документом? |
| Автор: Staruha 22.8.2006, 22:27 |
| Там в Worde есть вставить таблицу xl.Вставляешь и потом работаешь как с xlем в смысле пишешь формулы. |
| Автор: Валк 23.8.2006, 07:34 |
| Staruha Там в Worde есть вставить таблицу xl.Вставляешь и потом работаешь как с xlем в смысле пишешь формулы. Это не совсем то. Я не могу вставить таблицу Excel в документ Word, т. к. книга из которой берутся данные содержит проект посредством которого формируются эти данные. |
| Автор: ИгнатьевАлексей 23.8.2006, 10:16 |
| У меня тоже не получилось найти место, где сидит данный линк. Но обрати внимание, что при копирывании линкованого Вордовского документа линк сам не копируется! Боюсь без программирывания не обойтись! Похоже создатель этого интересного метода рассчитавал, что юзер-непрограммист создаст один документ Ворда, свяжет его с необходимой таблицей и будет счастлив! Но иу тебя , похоже, есть острая необходимость плодить такие документы со своими собственнымы Екселевскими таблицами линков! Правильно я понял? |
| Автор: Валк 23.8.2006, 12:02 |
| ИгнатьевАлексей у тебя , похоже, есть острая необходимость плодить такие документы со своими собственнымы Екселевскими таблицами линков! Правильно я понял? Если рассматривать ситуацию в целом, то она изначально такая: Существует книга Excel в которую заносятся данные для расчёта страховых премий. Эти данные, как и результаты расчёта в дальнейшем требуются при составлении договора страхования (документ Word). Я подумал, что тупо менеджерам сидеть и "копи-пастить" и решил слегка это дело автоматизировать. Для этого я создал шаблон "РасчётИпотека.xlt" аналогичный первоначальной книге, в нем создал проект посредством которого на отдельном листе книги формируются данные для договора страхования. Также я создал документ Word "Кредитный договор.doc" в котором посредством панели инструментов "Слияние", кнопка "Открыть источник данных" разместил ссылки на необходимые мне данные из получаемой посредством шаблона книги "РасчётИпотека1.xls". Но т. к. договоров будет много и их надо как-то сортировать получается что эту "сладкую парочку" ("РасчётИпотека1.xls" и "Кредитный договор.doc") надо будет переместить в какую-то папку (имя папки заранее не известно). Надо сделать так, чтобы документ "Кредитный договор.doc" не потерял связи со своей книгой "РасчётИпотека1.xls". Я хотел это сделать методом правки пути к книге "РасчётИпотека1.xls" (т. е. вместо C:\Documents\Papka1\...\РасчётИпотека1.xls просто прописать РасчётИпотека1.xls, чтобы "Кредитный договор.doc" обращался к РасчётИпотека1.xls, расположенному в этой же папке). Если этот метод сделать нереально, то, пожалуйста, подскажите как мне сделать чтобы связь между "РасчётИпотека1.xls" и "Кредитный договор.doc" не терялась при перемещению их по разным папкам (возможно по разным дискам, а то и разным компьютерам). |
| Автор: ИгнатьевАлексей 23.8.2006, 14:37 | ||
| Спасибо за обстоятельное описание твоей задачи! В принципе, эту связь можно установить не вручную, а программно. Далее назначить установку данного линка по открытию Вордовского документа.
Ты это программно делал, если да, то в VBA? |
| Автор: Валк 24.8.2006, 07:44 |
| ИгнатьевАлексей Спасибо за обстоятельное описание твоей задачи! Учитывая, что это важнее мне, чем тебе, то не за что ![]() эту связь можно установить не вручную, а программно. Далее назначить установку данного линка по открытию Вордовского документа. А как? Ты это программно делал, если да, то в VBA? Формирование данных происходит как програмно в VBA, так и при помощи формул Excel. Вообще, на отдельном листе "Сводка данных" формируется таблица (хотя "таблица", немного громко сказано, в принципе, всего одна строка). Часть ячеек заполняется простыми ссылками, типа: =ВВОД!B12 (Лист "ВВОД" - лист ввода первичной информации), часть простейшими формулами: =ТЕКСТ(ВВОД!B13;"[$-FC19]«ДД» ММММ ГГГГ;@") (преобразование даты из вида 08/24/2006 в «24» августа 2006). другая часть формируется при помощи проекта VBA. Там запускается форма с текстовыми полями (в основном, Ф. И. О. и паспортные данные), которую менеджер заполняет и в конце давит кнопку "Сформировать договор". Введённые данные преобразуются и заносятся в таблицу на листе "Сводка данных". Я пробовал делать также автоматический запуск "Кредитный договор.doc", чтобы все совсем красиво было, но что-то не получается Маленькое дополнение, всё это должно работать в Microsoft Office 2000. |
| Автор: ИгнатьевАлексей 24.8.2006, 08:36 |
| Валк, Ну вот и чудненько! Открой Ворд, включи ручную запись макроса, проделай ручное линкование, отключи ручную запись, открой и просмотри то, что получилось. Учти, что при ручной записи макросов, т.е. при автоматической генерации кода записывается много лишнего, т.е. то, что при обычном программирывании программером опускается(принимается значение по умолчанию). Скорее всего, в коде можно много выбросить - сам поймешь, а можно и так оставить. Тем не менее, это избавит тебя от изучения объектной модели Ворда, тем паче, что выполняешь ты свою задачу своеобразно и семплы найти трудно будет. Когда запишешь этот макрос, проверь его на выполнение, т.е. линкует ли он так, как ты вручную линкуешь. Если получится (то можешь за пивком сбегать на радостях), и сам дальше не догадаешься что делать, то я помогу. Пиши. И еще! Совсем не хочу тебя критиковать, потому что я сам непрофессиональный кодер, но тем не менее... Не усложняешь ли ты сам себе задачу используя инструмент рассылок? Ведь это придумано, как я понимаю, чисто для непрограммистов. Сам видишь - никакой гибкости, чуть в сторону - и тупик..... |
| Автор: Валк 24.8.2006, 11:52 | ||||
| ИгнатьевАлексей Открой Ворд, включи ручную запись макроса, проделай ручное линкование, отключи ручную запись, открой и просмотри то, что получилось. Ты только не сердись и громко не смейся, я не знаю как сделать линкование в Microsoft Office 2000. В Microsoft Office ХР я проделал все необходимые телодвижения и у меня получилось следующее:
Этот код я чуть-чуть переделал:
Только тут сразу возникает несколько затыков: 1. Этот код, насколько я понимаю, надо разместить в Project (ДоговорСтрахования)/Microsoft Word Objects/ThisDocument, чтобы он стартовал при запуске документа. 2. "Название" этого кода не должно быть: "Sub ИнтеграцияДанных()". Название должно быть типа "Private Sub Open_Document" или какое-то иное (я не знаю какое, пишу просто по аналогии с Excel). Тогда точно этот код будет отрабатываться при открытии документа "ДоговорСтрахования.doc". 3. Если удалить начало пути размещения (F:\Valk\Ипотека\Расчёт и Договор\), то код будет искать книгу РасчётИпотека1.xls в папке по умолчанию (Мои документы). Это самые простые, на мой взгляд, грабли, т. к. путь, в принципе, вычисляем. Надо только каким-то образом суметь из источника данных "выдернуть" Ф. И. О. и создавать папку с таким же названием. 4. При попытке открыть документ в Microsoft Office 2000 у меня вылетает ошибка: "The macros in this project are disabled. Please refer to the online help or documentation of the host application to determine how to enable macros." Выходит, что код VBA для Microsoft Office 2000 другой, нежели чем код VBA для Microsoft Office ХР Совсем не хочу тебя критиковать, потому что я сам непрофессиональный кодер, но тем не менее... Я вообще к программированию отношения не имею. Я системный администратор. С VBA впервые столкнулся в мае этого года, так что не парься в эту тему, я широко принимаю любую критику, лишь бы делу подмога. Не усложняешь ли ты сам себе задачу используя инструмент рассылок? "Инструмент рассылок" - это, как я понял, то, что я называю "источник данных"? Я бы сам программно создавал документ Ворда на базе темпелейта, редактировал его как надо и помещал куда мне надо.....и никакие линки меня бы не замарачивали....Я по работе решал подобные задачи, т.е. по генерации документов на основе Екселевских таблиц, но только сами документы были также Екселевскими. Но я уверен, объектная модель Ворда (с которой я вообще не сталкивался) позволит это. Путей по решению задачи много и я уверен, что выбрал не самый оптимальный, а может и вовсе, самый неоптимальный. Просто те знания, которыми я обладаю, позволяют мне работать в каких-то узких рамках. У меня была мысль создавать договор страхования прямо внутри книги Excel. Основным препятствием было то, что я не представляю как можно в Excel что-либо отфоматировать. Также я думал интегрировать в книгу лист Word, но мне это тоже показалось не реализуемо (по крайней мере мною). Если ты знаешь и умеешь решить эту проблему (интеграция уже полученных мною данных в шаблон договора, всего 26 уникальных значений), то, пожалуйста, подскажи мне как это сделать, я попробую. |
| Автор: ИгнатьевАлексей 24.8.2006, 15:13 | ||||
| Валк, давай так поступим! Дуй в книжный магазин или на книжный рынок. Купи замечательный литературный шедевр для новичков в VBA - Андрей Гарнаев "VBA". С помощью этой книженки ты сделаешь своих юзеров довольными по горло. На форуме всякие мелочи тебе не будут подсказывать каждый раз. И не жалей 400-500 р. на эту книжку(200-300 р. на рынке) - окупишь сполна! Кстати поищи - может и скачать где-нибудь можно, но лучше купи! Возвращаясь к нашей задаче. Раз надо работать в 2000 Офисе, то забываем про "источник данных". Без него лучше сделаем! Выбирай главный документ и пиши в нем программку.
Скорее всего это она. Далее, на безе информации из этой книги можно создать др. книгу или лист. Но вообще то тебе нужен договор Вордовский, а значит никаких промежуточных книг\листов нам не надо будет. Все вычисления проведешь в программе, а результаты занесешь в удобную структуру, которую предварительно создашь. Следующий шаг - открываешь темпелейт Вордовский(шаблон будущего договора) и заполняешь его данными из структуры. Сохраняешь куда надо. Темпелейт закрываешь. Все! Перед юзером готовый договор! Он ошеломлен! И еще! Если в VBA тебе надо обратиться к файлу под именем, например, DDDDD.xls, который находится в той же папке где и сам документ(в котором программка сидит), то пишут так:
По книге все поймешь как делать. Если нет, то подскажу разделы, где прочитать. |
| Автор: Валк 25.8.2006, 07:02 |
| ИгнатьевАлексей Купи замечательный литературный шедевр для новичков в VBA - Андрей Гарнаев "VBA". С помощью этой книженки ты сделаешь своих юзеров довольными по горло. На форуме всякие мелочи тебе не будут подсказывать каждый раз. Спасибо, за подсказанную книгу. Мне руководительница обещала, что купит мне книжек на 1 000 (Одну тысячу рублей) как только я доделаю этот проект. Мне уже третью книжку подсказывают, будет что повыбирать. Кстати, кажется у меня получилось запустить проект в Office 2000. Теперь надо только как-то кодом закидывать файлы шаблона расчёта и договора в отдельную папку. Ну да ладно, поищу в другом месте как это делать. Как сделаю, сообщу ![]() |
| Автор: ИгнатьевАлексей 25.8.2006, 08:07 |
| Ну что-ж! Если вопрос стоит - "Литература после программы", а не "Программа после литературы", то опиши задачку - дам тебе код(если смогу , конечно). Кстати, в плане книг, мои работодатели ни разу не отказали мне, а точнее - нашей группе, ни в одной книжке, прекрасно понимая, что развитие своих работников стоит намного дороже, чем цена на книжку |
| Автор: likhobory 25.8.2006, 09:21 |
| Автор: Валк 25.8.2006, 14:31 |
| ИгнатьевАлексей опиши задачку - дам тебе код(если смогу , конечно). В том-то и дело, что все мои вопросы касаются "всяких мелочей, которые мне не будут подсказывать каждый раз" Вот, например, сегодня я весь день "убил" на то, чтобы создавать папку с определённым именем в определём месте и сохранять в неё файл получаемый из шаблона. Сейчас буду биться над тем как в эту папку записать документ Word и затем его из этой папки открыть. Как всё это сделаю (методом научного тыка) стану о5 пытаться связать книгу и документ. |
| Автор: Валк 31.8.2006, 11:56 | ||
| Проект сделан и сдан. Единственная корявизна в том, что договор страхования должен открываться через процедуру открытия документа в Word (Ctrl + O -> поиск документа в сети -> открытие документа). Связано это с тем, что источник данных ищется в дефолтовой папке (Мои документы). В данный момент в документе Word у меня прописан следующий макрос в автозагрузке:
Хотелось бы знать, возможна ли передача переменных VBA (имя, значение) из книги Excel в документ Word? Ибо путь к РасчётИпотека.xls у меня в книге Excel задаётся и его можно было бы прописать в макрос Private Sub Document_Open документа Wordд. |
| Автор: likhobory 31.8.2006, 12:52 |
| как вариант - хранить информацию во внешнем файле / реестре |
| Автор: ИгнатьевАлексей 31.8.2006, 18:26 | ||||||
Опять ты за свое! Попробуй вместо
поставить
Ведь ты говоришь, что РасчётИпотека.xls у тебя всегда в той же папке, что и Вордовский документ? Я же писал тебе, как получить текущюю папку! |
| Автор: Валк 1.9.2006, 13:12 | ||
| ИгнатьевАлексей Я же писал тебе, как получить текущюю папку! Блин, извини, прогнал/проглядел. Всё исправил, всё работает, спасибо огромное ![]() Вопрос решён был таким образом: Создаётся новый документ (шаблон Normal.dot), в нём выставляются поля, копируется основной (неизменяемый) текст договора, в нужных местах вставляются поля типа MERGEFIELD без ссылки на какой-либо источник. В макрос автозагрузки помещается следующий код:
Всё работает (хотя, возможно, не все команды в коде необходимы, код сгенерирован через запись макроса). Ещё раз мои искренние благодарности за помощь ИгнатьевАлексей ![]() |