Страницы: 1
RSS
Проблема при работе PasteSpecial в 2013 Excel VBA. Ошибка PasteSpecial
 
Здравствуйте!
Кто-нибудь сталкивался с проблемой работы функции PasteSpecial в 2013 Excel?
Простой код копирует диапазон из одной книги copy и вставляет в другую книгу значениями (используя PasteSpecial xlpastevalues)
Макрос писал на 2010 версии. Все отлично работает
Но при запуске в 2013 некорректно отрабатывает PasteSpecial - вставляет данные не в тот диапазон
Сейчас переделал код без copy/paste, просто присваиваю значения одного диапазона другому. (диапазон1.value=диапазаон2.value)
Но не хотелось бы переделывать все макросы...
Нашел похожее описании в пакете исправлений https://support.microsoft.com/ru-kz/help/2817505/description-of-the-excel-2013-hotfix-package-excel-x-none-msp-august-1
Но сейчас этот патч уже нельзя скачать, якобы все устранено в актуальных версиях office. При этом у меня точно установлены все обновления.
 
Вы бы хоть код показали. По одному описанию ничего подсказать нельзя - Вы все сами уже нашли.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код простой
Код
Cells(1,1).Resize(10, 1).Copy
.Cells(1,1).PasteSpecial xlPasteValues

и ошибка при выполнении не возникает. Ошибка в том, что он вставляет данные не в тот диапазон
Проверяю одновременно на 2х компах(excel 2010 и excel 2013). 2010 версия отрабатывает правильно
Описание я нашел, но уже нельзя скачать, поэтому не знаю, что делать
 
Цитата
qwerty64 написал:
вставляет данные не в тот диапазон
а в какой, если не в тот? Вижу точку перед .Cells - к чему она относится? Где записан код: в модуле листа, книги, стандартном?  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Копирует диапазон из открытой книги в текущую книгу на отдельный лист
Код записан в стандартном модуле. Должен был вставить данные, например, в 5 строку, а вставляет в 1.
....
Код
With ThisWorkbook.Sheets(1)
    Cells(1,1).Resize(10, 1).Copy
    .Cells(5,1).PasteSpecial xlPasteValues
End with
 
qwerty64, ну у Вас прям клешнями нужно все вытаскивать. Выложите пример с кодом...
 
Проблема не в коде. Еще раз повторю - в 2010 все работает
Проблема именно в 2013 версии Excel. Вопрос - кто как это лечил?
 
А в какой тогда "не тот" диапазон у Вас в 2013 копируется? если не секрет, конечно...
 
Исходя из описания ошибки в патчноутах так и хочется сначала активировать лист перед вставкой.
Я не волшебник, я только учусь.
 
Wiss, да Вы правы. Если перед вставкой активировать лист, то все отлично вставляется
Вопрос, как с этим бороться, если этот патч уже нельзя скачать...

Настя, я уже отвечал на подобный вопрос Дмитрия
Изменено: qwerty64 - 08.10.2019 20:32:12
 
Точку не пробовали ставить в начале первой строки после With?
 
Anchoret, там и не должно быть точки. Копируют из активной книги.

qwerty64, кстати, а если через массив копировать, раз у Вас только значения?! Как-то так...
Код
dim tt as variant
With ThisWorkbook.Sheets(1)    
    tt=Cells(1,1).Resize(10, 1)
    .Cells(5,1).Resize(10, 1).Value = tt
End with
Я не волшебник, я только учусь.
 
Цитата
Wiss написал:
если через массив копировать
ТС в самом первом сообщении еще написал, что делал через rng1.Value = rng2.Value, но спец.вставка используется не только в одном коде и все переделывать весьма затратно :)
Кстати, есть и еще одна причина отказываться от массива или присвоения значений диапазону посредством .Value = .Value: если диапазон большой, можно получить ошибку Out of memory, т.к. временный массив может просто не поместиться в доступную память. Дабы не питать надежд: .Value = .Value имеет тот же принцип(просто на лету создается временный виртуальный массив и все).
Раз проблема ясна и есть даже патч, то скорее всего с наскоку её без этого самого патча не решить. Но можно попробовать поизголяться. Например, так:
Код
Cells(1,1).Resize(10, 1).Copy
DoEvents
ThisWorkbook.Sheets(1).Cells(5,1).PasteSpecial xlPasteValues
так же можно попробовать пойти и более длинным путем:
Код
Cells(1,1).Resize(10, 1).Copy ThisWorkbook.Sheets(1).Cells(5,1)
ThisWorkbook.Sheets(1).Cells(5,1).Resize(10, 1).ClearFormats
чисто хотя бы для того, чтобы понять: проблема только в PasteSpecial или во вставке в целом.
Изменено: Дмитрий(The_Prist) Щербаков - 08.10.2019 17:37:56
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, 1 вариант не сработал(скопировал не туда)
во 2 варианте, видимо, пропущен .paste? (ругается. Или там подразумевается другой оператор вставки?)
Изменено: qwerty64 - 08.10.2019 18:26:41
 
Цитата
qwerty64 написал:
во 2 варианте, видимо, пропущен .paste?
нет, ничего не пропущено. Надо писать в одну строку. Сразу после Copy указывается диапазон для аргумента Destination(есть такой у метода Copy). Можно определить его и явно:
Код
Cells(1,1).Resize(10, 1).Copy Destination:=ThisWorkbook.Sheets(1).Cells(5,1)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, так работает.
Т.е. проблема только в PasteSpecial

Дмитрий, если эту проблему не удастся победить, то буду думать о установке 2016 офиса. Не подскажите - он с vba дружит? не было отрицательных отзывов?
Изменено: qwerty64 - 08.10.2019 19:32:59
 
Дружит :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
qwerty64, так в 16 офисе тоже нужно лист активировать перед pastespecial...  
 
ADimov, это не лечится? Неужели 2010 ставить....
 
А если просто приравнять диапазоны?
 
Юрий М, пока так и делаю. Но, во первых, хотелось бы избежать перестройки всех макросов под этот способ, а во вторых, Дмитрий выше описал минусы такого подхода
 
Цитата
qwerty64 написал:
это не лечится?
Не знаю, не пробовал)  
 
Цитата
qwerty64 написал:
сейчас этот патч уже нельзя скачать, якобы все устранено в актуальных версиях office.
Тогда может быть удалить Офис и произвести заново чистую установку?
 
Юрий М, попробую. Но его только вчера поставили:(
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
.Value = .Value имеет тот же принцип(просто на лету создается временный виртуальный массив и все).
Спасибо за науку. Как обычно, узнал что-то новое из Вашего сообщения.
Я не волшебник, я только учусь.
 
Цитата
ADimov написал:
так в 16 офисе тоже нужно лист активировать перед pastespecial...
Доказательства? Проверил тест из #15 на конфигурациях: Win10 + Excel 2016 (32-, ru) и Win10 + Excel 2016 (64-, en). Работает правильно. Макрос из #5 тоже работает правильно.
Изменено: sokol92 - 09.10.2019 13:55:35
Владимир
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
есть и еще одна причина отказываться от массива или присвоения значений диапазону посредством .Value = .Value
И еще одна причина: возможное изменение данных. Текст "1.99" станет числом, текст "1/3" превратится в 3 января текущего года, ячейка со значением 'литерал' потеряет левый апостроф и т.п.
Владимир
 
Спасибо всем кто откликнулся!
Проблема ушла после установки актуальной версии 2013 офиса!
Страницы: 1
Наверх