Страницы: 1
RSS
Копирование множества изображение (Shapes) в другую книгу. VBA
 
Медведя на темную сторону силы потянуло.

При решении одно задачи необходимо скопировать все изображения из исходного файла в рабочий, потом они обрабатываются  (размер и место размещений). На 2х 3х объектах все замечательно, а вот когда их несколько сотен...
вариант 1
по одной .copy .past, обработка, следующая
Часто возникает ошибка при копировании, даже обработка и повтор операции не спасает, не крутить же цикл бесконечно, 10 итераций не спасло.

вариант 2
на исходном  все сгруппировал Shapes(arrShapes).group (теперь это один Shape)  и Shape(1).copy .past Shapes(1).ungroup , к счастью других объектов нет.
Если скопировалось, то все ок, но иногда тоже сбоит.

вариант 3
аналогичен 2 за исключением Shapes.selectAll вместо группировки, но так даже хуже

Какие есть еще варианты?
По вопросам из тем форума, личку не читаю.
 
Я так понимаю при копировании бывают проблемы при большом количестве.
Как вариант можно документ экспортировать в HTML, а потом из папки тянуть изображения в нужный документ. Можно макросом настроить это всё.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
БМВ написал:
Часто возникает ошибка при копировании,
сталкивался, решение только циклами: При вставке из VBA картинки на лист ошибка Метод paste из класса worksheet завершен неверно
Оно?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, Дмитрий, да оно и собственно то, что делал - тоже что и в статье, только цикл
do … Loop While err <> 0 And errc > 10,
Вариант с группировкой в этом плане тоже подвержен этой гадости но реже и в итоге быстрее получилось. Получается что вариантов больше не очень то и есть.

Alemox, С выгрузкой,  на мой взгляд - это печалька, но за вариант тоже спасибо.
По вопросам из тем форума, личку не читаю.
 
С выгрузкой может быть такая засада: там изображения могут дублироваться и дробиться на маленькие и большие. И никаких обозначений какое оригинальное, а какое уменьшенное нет.  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
off :)
Цитата
БМВ написал: По вопросам из тем форума, личку не читаю.
Вот и напоролся: пришлют помогающие вопрос по этой теме, а не прочитать!
 
Ну в исходном для задачи еще и все изображения имеют одно и тоже имя, так что для группировки сперва еще и переименовывать пришлось.

В итоге - только через обработку ошибки, а жаль.
Та же история и решается также при множественной вставке диапазона , как изображения Range.copy , .Pictures.Paste.
Тут по факту еще все хуже ибо несколько тысяч ячеек нужно преобразовать в изображения (там Barcode) и должно отображаться не зависимо от наличия шрифта.
По вопросам из тем форума, личку не читаю.
 
Доброе время суток.
Как вариант. Если shape полностью помещается в ячейку, то можно простым копированием из диапазона одной книги в диапазон другой книги.
Код
Public Sub copyFromToBook()
    Dim scrRange As Range, destRange As Range
    Set scrRange = Workbooks("Книга3.xlsx").Worksheets("Лист3").Range("A1:A350")
    Set destRange = Workbooks("Книга2.xlsx").Worksheets("Лист1").Range("A1")
    scrRange.Copy destRange
End Sub
350 рисунков перенеслись без проблем. Excel 2016 32бит.
По недавно обсуждавшейся теме - есть проблема с копированием Shape от 2016 и вставки в диаграмму. Причём в этом случае, нужно задавать некоторый таймаут с DoEvents чтобы произошло копирование. Задержка зависит от размера рисунка. Может и здесь нечто тоже самое.
 
Цитата
Андрей VG написал:
350 рисунков перенеслись без проблем.
Андрей, у меня недавно с заказчиками была та еще история: переносили в Power Point таблицы. У меня все отлично - у них ошибки и все тут. Притом даже если копировать диапазон, не картинку. И просто вставлять, без всяких преобразований. Без цикла никак не взлетало. Пока им офис не переустановили...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
У меня все отлично - у них ошибки и все тут.
Ну, можно ещё сохранить книгу-источник, преобразовать в zip вытащить картинки и xml для определения где та картинка находится в источнике. Затем через Shapes.AddPicture вставлять в получатель. Хотя то же может сбоить, если есть какие-то проблемы.
Похоже придётся медведю ещё и комп с офисом заказчику от админивать :)
 
Михаил, а если копировать лист со всеми изображениями в файл и там причесать всё. Или такой вариант не идёт.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Андрей VG написал:
Причём в этом случае, нужно задавать некоторый таймаут с DoEvents чтобы произошло копирование. Задержка зависит от размера рисунка. Может и здесь нечто тоже самое.
А вот это кстати вполне может быть, процесс не успевает все отработать и вылетает ошибка.  
 
Цитата
Андрей VG написал:
Если shape полностью помещается в ячейку,
Андрей, привет. в исходнике все печальнее.
и так 500 раз.
Ну то что это из ветки работа скрывать не буду. Все что надо было решено, но объем был не заявлен, да и техпроцесс только сегодня стал понятен. Просто было интересно реализовать а сделать плохо - ну не позволительно.

Цитата
Alemox написал:
а если копировать лист со всеми изображениями в файл
Ну это крайний вариант.

В результате оставил через группировку, и копирование с циклом и проверкой ошибки.

Цитата
vikttur написал:
Вот и напоролся:
ну начинааааается.  :D
Изменено: БМВ - 19.02.2020 20:02:36
По вопросам из тем форума, личку не читаю.
 
Сталкивался с таким поведением. Причем на win10, а на win7 все отрабатывало штатно. Решил способом предложенным Дмитрием.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
а на win7 все отрабатывало штатно
интересное наблюдение.

Off
Однако это все больше утверждает мое суждение, что в какой-то момент стабильное решение на любимой платформе не построить.
Как считаете, что будет с файликом в котором 6000 вот того что в #13 и еще столько же такого

?
По вопросам из тем форума, личку не читаю.
 
Михаил, делал загрузчик, который загружает по номенклатуру, тысячи рисунков. На каждую номенклатуру свой рисунок из нужной папки на диске. С учётом решения выше озвученной проблемы, в остальном был только вопрос в размере получаемого файла. Мах итераций делал в районе 1000, при неудачных вставках. Дмитрию спасибо за идею. Плюс изменял размер под единый задаваемый формат. Код не секретный, в случае необходимости могу выложить + форма. 12 тыс рисунков это прилично, но не вижу преград, кроме размера получаемого файла, тем более они и так хранились изначально, как я понял, в книге Excel.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit,  Виталий, спасибо за инфу. Да и всем принявшим участие спасибо.  Собственно к моменту создания темы было решено (как и писал, с циклом до отсутствия ошибки и счетчиком, аналогично варианту Дмитрия). С учетом того что переношу всю пачку сгруппированную, то даже если сбой, который порой таки случается при ограниченном числе циклов, а он не  прогнозируем, то просто обрабатываю ошибку мол попытка хорошая, но неудачна. Tray again :-) .

В том же решении есть еще один вопрос, который вынесу в отдельную тему и он больше к оптимизации относится. А именно, как при наличии множества объектов оптимально удалить один или несколько, находящихся в конкретном диапазоне.
Изменено: БМВ - 20.02.2020 07:46:48
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх