Страницы: 1
RSS
VBA: DataObject - некорректное отображение символов при вставке из буфера обмена
 
Отказался работать DataObject .

Запускаю код
Код
Dim MyDataObj As New DataObject
MyDataObj.SetText ActiveCell.Value  
MyDataObj.PutInClipboard  

После этого на Ctrl+V из буфера выдается белиберда,- непечатные символы ��.

Ссылка на библиотеку Forms 2.0  подключена.

Ранее этот код работал. Почему перестали ехать лыжи ?

 
Цитата
Столбенко Владислав написал:
Ранее этот код работал. Почему перестали ехать лыжи ?
ОС сменилась? Просто так ничего не перестает работать, произошли какие-то изменения.
 
А какие - такие изменения могли бы произойти?

ОС как была Windows 10 так и осталась  ,Office 2013,  библиотека Forms 2.0.  
 
Если в редакторе кода попробовать написать на кириллице, будет нормально отображаться или в виде белиберды?
 
А причем кодировка и некорректное отображение, если на любою входную  строку- числовую или символьную,  любой длинны из буфера возвращает два символа "?"  с кодом 63?

Цитата
Oleg Boyaroff написал: Если в редакторе кода попробовать написать на кириллице, будет нормально отображаться или в виде белиберды?
в IDE кириллица набирается норм., вставляется  криво - вопросами.  
 
Цитата
Столбенко Владислав написал:
А причем кодировка и некорректное отображение
Потому что у вас проблема как раз в отображении кодировки. Если нет, то проверьте локально что передается свойству MyDataObj.SetText из ActiveCell.Value.
Цитата
Столбенко Владислав написал:
если на любою входную  строку- числовую или символьную,  любой длинны из буфера возвращает два символа "?"  с кодом 63  ?
Этого указано не было.

Как себя поведет этот кусок кода?
Код
With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
     .SetText ActiveCell.Text
     .PutInClipboard
End With
 
Посмотрите, пожалуйста, мы на форуме обсуждали эту тему здесь,  здесь и здесь.
Символы из #1 - не вопросительные знаки, а Заменяющий символ.
Изменено: sokol92 - 02.09.2019 12:42:09
Владимир
 
Исходя из своего опыта по использованию этого кода на 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)
 
Игорь, спасибо за обстоятельный ответ.
Итак, если у автора темы 32-разрядный офис, то можно попробовать проверить "Способ 2".
Для этого нужно скопировать макросы из ссылки и заменить в #1 текст на
Код
SetClipboard ActiveCell.value
Владимир
 
Цитата
sokol92 написал: Как себя поведет этот кусок кода?
Ничего не изменилось.
Почитал предоставленные sokol92 ссылки. Это просто 3,14, -блуждающий глюк!  Буду решать танцами с бубнами на тему Copy и РasteSpecial.

Цитата
sokol92 написал: Итак, если у автора темы 32-разрядный офис
64 разрядный.
 
Владислав, вложил вариант функций SetClipboard и GetClipboard, который должен работать во всех версиях офиса. Проверил на Excel 2016 (32- ru) и Excel 2016 (64- En).
Проверьте, пожалуйста, вдруг свершится чудо?
Владимир
 
Да, все заработало! Огромное спасибо!
DataObject   у меня также продолжает некорректно вставлять в буфер. Т.е. у меня это не блуждающий глюк, а вполне себе стабильный.  
 
Цитата
Столбенко Владислав написал:
у меня это не блуждающий глюк, а вполне себе стабильный
Берегите его (глюк), он незаменим при тестировании лекарств. :)

Успехов!
Владимир
 
Цитата
Игорь написал:
Способ 2: как рекомендуется в одной из тем по ссылкам выше, использовать WinAPIДолжно сработать, но кода много (нужно писать в 2 вариантах - для win32 и win64)
Коллеги, не удержался… даже зарегистрировался на форуме  :D .

Во-первых, спасибо вам большое за подсказку на решение проблемы (Майкрософт сначала создала эту проблему, а потом её решила… хоть и костылём, но метод всё же рабочий)  ;) .

Во-вторых, я периодически сталкивался с подобным поведением буфера обмена на одном компьютере, плакал, но продолжал мучиться… просто выполнял макросы на другом компе… пока не столкнулся с проблемой и на втором. Не выдержав, стал рыть инет.

Оказывается, проблема совсем не нова. Вот здесь, например, с проблемой столкнулись аж в 2013 году :excl: , решить так и не смогли… но человек нашёл  :idea: метод 100% воспроизведения проблемы копирования в буфер… Ей оказалась банальное присутствие в системе открытых окон эксплорера.

Я проверил, - так и есть: если открыто хоть одно окно эксплорера, буфер не заполняется; как только все окна эксплорера закрыть (даже Excel не обязательно трогать), буфер начинает работать как надо  :) .
В чём более глубокая причина - не в курсе, но эта информация - хоть что-то!

Ещё раз спасибо за решение проблемы,

Удачи и успехов всем!
Аркадий
Страницы: 1
Наверх