|
|
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток Поставлена следующая задача: сделать так, чтобы все изменения автоматом фиксировались в другом файле XLS. Причины постановки неизвестны, идея, видимо, в том, что етсь некое центральное хранилище данных, в которое автоматом копируется информация из заполняемых накладных. Решение состоит в создании нового объекта Application и открытии в нем файла-приемника. Далее в обработчике события OnSheetChange изменения и копируются. Выглядит все вот таким образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. Два вопроса: 1. Каким образом можно скопировать Range измененых ячеек из источника в приемник одним махом, а не перебирая ячейки в цикле? 2. При закрытии файла-источника приемник закрывается автоматом. Если одновременно два источника связаны с одним приемником, возникают проблемы. Я так подозреваю, что Application, как СОМ-объект, должен предоставлять доступ к методу Release (или как его), который уменьшает счетчик ссылок. Метода такого, к сожалению, не нашел. Если же писать просто "Set TargetApp = Nothing", то приложение-приемник из памяти не выгружается. Второй вариант - можно ли как-то узнать, сколько ссылок имеется на данный момент у Application приемника? В этом случае приложение-источник при закрытии могло бы выяснять, связан ли приемник еще с кем-то, кроме данного источника и при отсутствии связей закрывать приемник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2008, 13:03:07 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
1. Код: plaintext В двух экземплярах Excel-я, невозможно открыть один и тот же файл на редактирование, во втором экземпляре можно открыть в режиме "только чтение", если только у файла не выставлен режим "общий доступ", это "сервис->доступ к книге->разрешить совместный доступ. При таком режиме есть ограничения: VBA и общий доступ Перед тем как писать "Set TargetApp = Nothing", нужно закрыть все открытые в нем книги. Примерно так Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2008, 15:40:08 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
непонятно "все изменения автоматом фиксировались в другом файле XLS". все равно же они потом затираются? в чем отличие от просто сохранения копии перед закрытием? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2008, 13:45:21 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
Спасибо за помощь, :-) "все изменения автоматом фиксировались в другом файле XLS" - мне самому была поставлена неконкретная задача. Есть некий центральный файл, в котором должны происходить изменения на основании того, что вводится в другой файл. Я пока просто решил проработать вопрос с простым копированием, на практике в "центральном файле" будут происходить какие-то вычисления. А изменения вполне даже успешно сохраняются, почему бы и нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2008, 21:50:15 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
Еще вот такой вопрос по копированию диапазонов ячеек: в предлагаемой Вами строке "r.Copy TargetApp.Workbooks(1).Sheets(1).Range(r.Cells(1, 1).Address)" я беру вот это: "r.Cells(1, 1).Address" и мой Excel сообщает о том, что нет такого свойства Adress. У меня 2007 версия. А можно каким-то другим методом вообще получить строковое название столбца, в котором расположена ячейка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2008, 22:09:49 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
JohnSparrowЕще вот такой вопрос по копированию диапазонов ячеек: в предлагаемой Вами строке "r.Copy TargetApp.Workbooks(1).Sheets(1).Range(r.Cells(1, 1).Address)" я беру вот это: "r.Cells(1, 1).Address" и мой Excel сообщает о том, что нет такого свойства Adress. У меня 2007 версия. А можно каким-то другим методом вообще получить строковое название столбца, в котором расположена ячейка? Adress - действительно нет, а вот Address - есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 10:49:53 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
vkodor, пишите просто r.address или, если уж очень хочется, r.cells(1).address ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 11:30:13 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
_slan_, а точнее r.address(0,0) в вашем случае ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 11:31:56 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
_slan_, это не просто моё желание, в этом есть смысл. Строчка - "r.cells(1).address" подойдет, а вот строчка - "r.address" в определенный момент даст сбой. P.S. Иногда стоит проверить информацию, прежде чем писать. Этому меня научил этот форум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 14:09:13 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
_slan__slan_, а точнее r.address(0,0) в вашем случае А это в данной ситуации, уж совсем лишнее. Только лишние символы кода и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 14:13:50 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
vkodor, в каком случае это не проходит? со вторым согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 20:37:57 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
Если я копирую данные из одного листа в другой в рамках текущей рабочей книги, то все выходит: Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 21:11:02 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
JohnSparrow, такой код работает(проверено на 2007м) Код: plaintext 1. 2. 3. 4. 5. 6. 7. tapp.[a1]=[a1] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 22:15:28 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
ну и Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 22:24:19 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
Спасибо за подсказку, однако, боюсь, нужно несколько иное. Суть вопроса в том, что на основании значений, введенных в определенные ячейки файла-источнике, нужно выполнить некоторые действия в файле-приемнике. Причины постановки такой странной задачи мне не пояснили, а сам постановщик вообще никогда с VBA дела не имел. Я остановился на автоматическом выполнении этих магических действий в обработчике Workbook_SheetChange исходного файла. Т.е. при каждом изменении ячейки скрипт проверяет, нужна ли нам эта ячейка и, если да, то, используя введенное в нее значение, скрипт делает что-то с одной или несколькими ячейками приемника. Простое копирование ячейки в приемник после ее изменения в источнике я взялся делать оттого, чтобы вообще научиться организовывать взаимодействие между двумя книгами (VBA не занимаюсь, потребность возникает эпизодически). Оно как бы и получилось за исключением проблемы, связанной с Range.Copy между разными процессами. Ну а это самое взаимодействие в данном случае для пользователя должно быть невидимым. Т.е. пользователь должен видеть только одну рабочую книгу - источник, а что там, где и каким образом происходит - его не касается. Отсюда требование к приемнику быть невидимым. Чтобы книга-приемник была невидимой, ее надо открывать в отдельном приложении Excel, у которого есть свойство Visible и это свойство не выбрасывает исключение при попытке доступа к нему (как, например, Workbooks.Sheets.Visible , если открыть источник и приемник как две книги в рамках одно Application.Excel). А открыв приемник в отдельном приложении, получим проблему копирования, описанную во втором абзаце. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 22:54:37 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
Спасибо за подсказку насчет ActiveWindow.Visible = False. переделал так, чтобы и приемник и источник открывались в рамках одного Application.Excel. Ниже приведен код обработчиков событий Workbook приемника. Теперь все, кажется, работает, только после закрытия источника остается пустое окно, всех благ ему в новом году, :-). Еще раз большое спасибо за помощь, в общем и целом проблема решена, как я понимаю. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2008, 23:24:38 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
я не совсем понимаю - почему Вы не пользуетесь таким удобным механизмом как работа с xls через ADO , выполняя SQL запросы Select, Insert, Update вот например что-то вроде этого.... это фрагмент vbs скрипта, работающего внутри HTA странички Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2008, 09:56:18 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
Я уже писал - вообще работа с файлом XLS, который параллельно взаимодействует с другим файлом XLS (типа, централизованное хранилище данных) мне самому кажется странной, зачем оно им нужно, мой знакомый толком пояснить не смог. Скорее всего, его просто попросили сделать те, кто не в курсе о существовании СУБД, а для чего - не сказали. Насчет работы с данными через ADO. Судя по всему, простое копирование по одной ячейке из источника и вставка в приемник вряд ли будет медленнее. Зато кода уж точно будет больше, :-). ART-CODE и еще - я-бы заменил приемник на нормальный SQL сервер с хранимками и триггерами, а уже оттуда выливал все что надо и куда надо... Согласен. Создание велосипеда с шестью колесами, когда уже есть двухколесный, - не самая лучшая идея. С Новым годом, :-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2008, 19:16:17 |
|
||
|
Копирование данных из одногоф айла Excel в другой
|
|||
|---|---|---|---|
|
#18+
Добрый день! Подскажите плиз у меня вот такая проблемма. Есть таблица готовая 1, забиты все формулы и тд. Есть ещё одна таблица 2 (я её выгружаю из SAP) мне нужно чтобы данныу из таблицы 2 ыгружались в таблицу 1. Притом в обоих таблицах есть столбец "Материал" дак вот мне надо чтоб данные переносились из строки с материалом Н в строку с этимже материалом в другой таблице. Как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2009, 11:09:28 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=35741516&tid=2179850]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 196ms |
| total: | 468ms |

| 0 / 0 |
