VBA: DataObject - некорректное отображение символов при вставке из буфера обмена
Пользователь
Сообщений: Регистрация: 01.01.1970
02.09.2019 08:04:30
Отказался работать DataObject .
Запускаю код
Код
Dim MyDataObj As New DataObject
MyDataObj.SetText ActiveCell.Value
MyDataObj.PutInClipboard
После этого на Ctrl+V из буфера выдается белиберда,- непечатные символы ��.
Ссылка на библиотеку Forms 2.0 подключена.
Ранее этот код работал. Почему перестали ехать лыжи ?
Пользователь
Сообщений: Регистрация: 18.01.2016
02.09.2019 08:30:06
Цитата
Столбенко Владислав написал: Ранее этот код работал. Почему перестали ехать лыжи ?
ОС сменилась? Просто так ничего не перестает работать, произошли какие-то изменения.
Пользователь
Сообщений: Регистрация: 01.01.1970
02.09.2019 09:31:32
А какие - такие изменения могли бы произойти?
ОС как была Windows 10 так и осталась ,Office 2013, библиотека Forms 2.0.
Пользователь
Сообщений: Регистрация: 18.01.2016
02.09.2019 09:35:53
Если в редакторе кода попробовать написать на кириллице, будет нормально отображаться или в виде белиберды?
Пользователь
Сообщений: Регистрация: 01.01.1970
02.09.2019 11:15:54
А причем кодировка и некорректное отображение, если на любою входную строку- числовую или символьную, любой длинны из буфера возвращает два символа "?" с кодом 63?
Цитата
Oleg Boyaroff написал: Если в редакторе кода попробовать написать на кириллице, будет нормально отображаться или в виде белиберды?
в IDE кириллица набирается норм., вставляется криво - вопросами.
Потому что у вас проблема как раз в отображении кодировки. Если нет, то проверьте локально что передается свойству MyDataObj.SetText из ActiveCell.Value.
Цитата
Столбенко Владислав написал: если на любою входную строку- числовую или символьную, любой длинны из буфера возвращает два символа "?" с кодом 63 ?
Этого указано не было.
Как себя поведет этот кусок кода?
Код
With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.SetText ActiveCell.Text
.PutInClipboard
End With
Пользователь
Сообщений: Регистрация: 10.09.2017
02.09.2019 12:34:36
Посмотрите, пожалуйста, мы на форуме обсуждали эту тему , и . Символы из #1 - не вопросительные знаки, а .
Изменено: - 02.09.2019 12:42:09
Владимир
Пользователь
Сообщений: Регистрация: 23.12.2012
02.09.2019 12:56:55
Исходя из своего опыта по использованию этого кода на 5000 разных компьютеров, могу сказать следующее:
1) копирование с использованием DataObject работает в 80-90% случаев Проблемы в основном с новыми версиями windows (начиная с win7)
2) вероятная причина проблемы - перехват буфера обмена чем-то в Windows Потому что если макрос зациклить, проверяя буфер обмена после каждого копирования, то выяснится, что после 7-10 попыток копирования нужный результат в буфере обмена появится с вероятностью более 90% (при одной попытке - с вероятностью около 30-40%) Т.е. проблема плавающая (то работает, то нет)
3) попытки решить проблему не увенчались успехом (в течение 2 часов ковырялся с проблемным компом, не нашел ничего что перехватывает буфер)
4) сейчас планирую решить эту проблему в своей программе окончательно, и за 4 года размышлений надумал 2 способа, которые могут помочь: (ни один из способов пока не проверял, ибо на моём компе всё копируется и без этих ухищрений)
Способ 1: перекодировать строку перед копированием через DataObject Вероятно, что проблема в кодировке исходной строки (например, поменять 1251 на 1250) Это несколько строк кода
Способ 2: как рекомендуется в одной из тем по ссылкам выше, использовать WinAPI Должно сработать, но кода много (нужно писать в 2 вариантах - для win32 и win64)
Пользователь
Сообщений: Регистрация: 10.09.2017
02.09.2019 13:17:18
Игорь, спасибо за обстоятельный ответ. Итак, если у автора темы 32-разрядный офис, то можно попробовать проверить "Способ 2". Для этого нужно скопировать макросы из и заменить в #1 текст на
Код
SetClipboard ActiveCell.value
Владимир
Пользователь
Сообщений: Регистрация: 01.01.1970
02.09.2019 13:20:54
Цитата
sokol92 написал: Как себя поведет этот кусок кода?
Ничего не изменилось. Почитал предоставленные ссылки. Это просто 3,14, -блуждающий глюк! Буду решать танцами с бубнами на тему Copy и РasteSpecial.
Цитата
sokol92 написал: Итак, если у автора темы 32-разрядный офис
64 разрядный.
Пользователь
Сообщений: Регистрация: 10.09.2017
02.09.2019 17:02:41
Владислав, вложил вариант функций SetClipboard и GetClipboard, который должен работать во всех версиях офиса. Проверил на Excel 2016 (32- ru) и Excel 2016 (64- En). Проверьте, пожалуйста, вдруг свершится чудо?
Да, все заработало! Огромное спасибо! DataObject у меня также продолжает некорректно вставлять в буфер. Т.е. у меня это не блуждающий глюк, а вполне себе стабильный.
Пользователь
Сообщений: Регистрация: 10.09.2017
03.09.2019 12:10:56
Цитата
Столбенко Владислав написал: у меня это не блуждающий глюк, а вполне себе стабильный
Берегите его (глюк), он незаменим при тестировании лекарств.
Успехов!
Владимир
Пользователь
Сообщений: Регистрация: 07.06.2020
08.06.2020 08:39:10
Цитата
Игорь написал: Способ 2: как рекомендуется в одной из тем по ссылкам выше, использовать WinAPIДолжно сработать, но кода много (нужно писать в 2 вариантах - для win32 и win64)
Коллеги, не удержался… даже зарегистрировался на форуме .
Во-первых, спасибо вам большое за подсказку на решение проблемы (Майкрософт сначала создала эту проблему, а потом её решила… хоть и костылём, но метод всё же рабочий) .
Во-вторых, я периодически сталкивался с подобным поведением буфера обмена на одном компьютере, плакал, но продолжал мучиться… просто выполнял макросы на другом компе… пока не столкнулся с проблемой и на втором. Не выдержав, стал рыть инет.
Оказывается, проблема совсем не нова. , например, с проблемой столкнулись аж в 2013 году , решить так и не смогли… но человек нашёл метод 100% воспроизведения проблемы копирования в буфер… Ей оказалась банальное присутствие в системе открытых окон эксплорера.
Я проверил, - так и есть: если открыто хоть одно окно эксплорера, буфер не заполняется; как только все окна эксплорера закрыть (даже Excel не обязательно трогать), буфер начинает работать как надо . В чём более глубокая причина - не в курсе, но эта информация - хоть что-то!