Страницы: 1
RSS
ошибка копирования картинок в excel 2016
 
Здравствуйте, уважаемые.
столкнулся с проблемой.
копирую объект Shape из одного листа в другой
               
Код
If Not pict Is Nothing Then
                    With pict
                        .Copy
                        Worksheets("корзина").Paste Destination:=Worksheets("корзина").Cells(lr, 2)
                    End With
                End If 

в екселе 2010 работает без ошибок.
в 2016 - на одном листе все четко, на другом - метод paste из класса worksheet завершен неверно.
ошибка возникает при копировании более чем одной картинки в цикле.
первая копируется, на второй ошибка.
при этом если нажать Debug и продолжить, то все работает.
Может кто сталкивался с подобным?
если у кого есть ексель 2016 - могу выслать пример для тестирования.
Спасибо.
 
Excel 2016 есть у многих
Владимир
 
У вас цикл по объектам или по количеству? И Set pict как присвоен и где? И попробуйте использовать не Destination, а pict.Left= и Top
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox написал:
Set pict как присвоен и где
есть функция

Код
Private Function get_shape(xRg As Range) As Shape
' возвращает объкт-картинку в ячейке по ссылке
    Dim xShape As Shape
    On Error Resume Next

    For Each xShape In ActiveSheet.Shapes
        If xShape.Type = msoPicture Or xShape.Type = msoGroup Then
            If xShape.TopLeftCell.Address = xRg.Address Then
                Set get_shape = xShape
                Exit For
            End If
        End If
    Next
End Function


и потом в цикле
Код
 Set pict = get_shape(trg.Offset(-7, -2))


Цитата
Alemox написал:
использовать не Destination
мне нужно на другой лист скопировать.
 
Я бы попробовал несколько вариантов.
1. не совсем понял что за trg, но я бы не использовал двойное присвоение объекта через SET
2. Если первая картинка копируется, то скорее всего после вставки, что-то теряется в приложении (фокус окна, не видит лист, в буфере нет объекта или ничего не скопировалось поэтому нечего вставлять и по этой же причине если принудительно войти в Debug он нормально выполнят код так как окно активно. Нужно копать в сторону активации приложения).
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
trg - это range.
я ищу картинку на 7 строк выше и 2 столбца левее trg.
макрос запускается с активного листа.
в процессе работы никаких селектов и активаций.
в Debug объект pict не Nothing, а именно та картинка что надо.
при заходе в Debug листов не переключал.
при продолжении макроса после остановки - все работает.
на другом листе - тоже.
листы аналогичные.
единственное различие, которое нашел - на одном листе (на рабочем) - названия картинок Picrure 1, на глючном - Рисунок 1
пробовал переименовывать картинки - не помогает.
Изменено: Dima S - 27.03.2018 21:20:49
 
doEvents наше все. Скорее всего еще и винда 10-я...
Можно после Copy дать чуть подождать системе. Вроде того:
Код
for li = 1 to 100: doEvents: next
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Кстати, эта проблема может быть еще и в задержке инициализации объекта в буфере. Тогда DoEvents может не сработать, т.к. надо будет ждать пока вставка пройдет корректно. Можно попробовать так выкрутиться:
Код
If Not pict Is Nothing Then
                    With pict
                        .Copy
                        On Error Resume Next 'ошибка возникнет, если Excel считает, что вставлять еще нечего
                        Err.Clear
                        Worksheets("корзина").Paste Destination:=Worksheets("корзина").Cells(lr, 2)
                        'пытаемся вставить, пока ошибка не исчезнет
                        Do While Err.Number <> 0
                            Err.Clear
                            Worksheets("корзина").Paste Destination:=Worksheets("корзина").Cells(lr, 2)
                            DoEvents
                        Loop
                        On Error GoTo 0
                    End With
                End If
Отпишитесь по результатам.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Перед циклом и после каждого Paste желательно добавить Application.CutCopyMode=False для очистки памяти.
И на всякий случай временно для исключения внешних виновников отключите OneDrive, Skype и прочие программы, завязанные на анализ "на лету" буфера обмена.
 
спасибо.
сегодня уже проверить не получится - завтра отпишусь.
Вроде все работает.
Решение в посте №8, и добавил очистку буфера из №9
Еще раз спасибо)
Изменено: Dima S - 28.03.2018 12:42:09
 
Цитата
Dima S написал: Вроде все работает.
Спасибо, что сообщили результат! Меня он интересовал, да и многим другим может быть полезен.
 
но мне все же интересно, почему на одном листе он успевает копировать, а на другом - нет?
после этого вопроса меня осенило открыт ексель архиватором и посмотреть размеры картинок)
у "беспроблемных" разммер до 10 кБ, некоторые до 17. у проблемных - от 20 до 100 кБ)
казалось бы очевидная вещь, которую надо было проверить в первую очередь)
думаю тут дело еще и в характеристиках ПК, а не только в версии Офиса, раз у меня успевает.
Завтра спрошу клиента о его ПК)
 
Я уже статейку накидал по этому поводу и привел готовое решение со всеми плюшками: При вставке из VBA картинки на лист ошибка Метод paste из класса worksheet завершен неверно  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх