Страницы: Пред. 1 2 3 След.
RSS
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
sokol92 написал:
Протестируйте, пожалуйста (занести в стандартный модуль книги):
Не работает:
1. первый запуск - в БО то, что копировалось ранее, руками
2. второй запуск - ошибка, останавливается на строке:
Код
RunPgm = wshShell.Run("%comspec% /c " & pgm, 0, True)
Если в редакторе VBA нажать продолжить, выполнение кода продолжается. Но результат тот же - БО не изменился.
 
Цитата
sokol92 написал:
Протестируйте, пожалуйста
На другой машине работает, Офис 2019.
Цитата
AlexGor написал:
Не работает:
Это тестирование на 2013-м офисе. Хотя тут и политика безопасности может не давать работать. После запуска на первой машине Инф.безопасник позвонил - типа у меня вирус в этом файле. Хотя с другими файлами на рабочем без проблем работаю, и кода в них больше.
Второе тестирование на личном компе.
 
Спасибо за тестирование!
Отмеченные Вами проблемы могут быть связаны с ограничениями (безопасности) для вызова PowerShell.

Об отображении букв русского алфавита.
"HTML Format" буфера обмена использует для текста кодировку utf-8.
Текст программы из сообщения #16 этого не учитывает.
Можно обойти эту проблему так.
1. Добавьте в модуль vbaClipboard функцию HtmlEncode из сообщения #30.
2. В модуле vbaClipboard в функции addHTMLWraper перед строкой
Код
sData = sHtmlHeader & sContextStart & sHtmlElement & sContextEnd

добавьте строку
Код
sHtmlElement = HtmlEncode(sHtmlElement)

Расскажите о результате. Успехов!
Изменено: sokol92 - 22.03.2024 14:46:26
Владимир
 
sokol92, ну вот, уже не "проторенными путями", а как "суперспециалисты"  )
очень немного решений на форуме с использованием пользовательских классов, как-то помощники их избегают, так сказать.
будет здорово, если всё получится
 
Использование пользовательских классов, или не использование -  дело вкуса автора, к алгоритмам в данной теме не имеющее отношения.
Вот редакция макросов из #16 без использования классов (потратил минут 5, детально не проверял). Функция  HtmlEncode и ее вызов добавлены.
Изменено: sokol92 - 23.03.2024 20:07:42 (Исправлено вложение (была неточность в макросе addHTMLWraper))
Владимир
 
sokol92, с изменениями в классах по вашей инструкции из #33 - в Word текст из буфера вставляется форматированным, без кракозябров. Нужны тесты от ТС )
Изменено: nilske - 22.03.2024 20:40:29
 
На сегодня есть 3 варианта решения, файлы во вложении:
Вариант №1 от sokol92, через PowerShell, файл "TextToClipboard — HTML"
1. + Маленький код
2. + Всё работает
3. + С кириллицей проблем нет
4. - Может не работать на корпоративных машинах из-за ограничений (безопасности) для вызова PowerShell
Вариант №2 от sokol92, без использования классов, файл"TextToClipboard_3"
1. + По идее работает везде
2. + С кириллицей проблем нет
3. - Запуск из редактора VBA:
   -  второй запуск кода не работает, В БО пусто, третий запуск всё норм
   -  если после запуска кода скопировать что-то руками, в самом редакторе VBA и вставить, вставляются кракозябры, в других местах всё норм, проблема только в редакторе.
4 + Запуск с кнопки: проблемы второго запуска не наблюдаются, но запуск с кнопки мне и не нужен, просто проверял.
Вариант №3 от nilske, с дополнениями от sokol92 Файл "MineTextToClipboard 2":
Код идентчен второму варианту, только расположен в модуле класса. Разницу увидел только в этой строке
Код
     Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As LongPtr) As LongPtr
'был Private Declare PtrSafe Function GetClipBoardData Lib "user32" Alias "GetClipboardData" (ByVal wFormat As LongPtr) As LongPtr
ссылки на оригинал кода в #4 и #7. Код одинаковый со 2-м вариантом, поэтому "+" и "-" одинаковые, проверял. Таже проблема второго запуска.
Файл "MineTextToClipboard 2" - код оригинала только процедуры расположил по порядку их работы и добавил перевод.
Модуль класса "ClipboardFormat" в варианте HTML не используется, также как и процедуры ниже строки
Код
'================= В HTML не учавствуют =====================
Тесты от автора, в модуле "AuthorsTests" не запускаются (не работают).
 
Цитата
AlexGor написал:
проблема только в редакторе
разве изначально проблема была не в переменной?
Скрытый текст
 
Большое спасибо за проделанную работу!
Изменено: sokol92 - 24.03.2024 19:40:00
Владимир
 
Вношу свою лепту. Переработал данный класс, повыкидывал все лишнее (на мой взгляд), поменял все Api на w-версии, добаил преобразование в Utf8. Класс CleapBoardFormat не нужен.

Скрытый текст

Пример использования
Изменено: testuser - 26.03.2024 16:28:26
 
testuser, совсем не маленькая лепта - изменения значительные.  :idea:
Спасибо!
 
Цитата
testuser написал:
Вношу свою лепту.
Спасибо Вам большое!
Ваш вариант расширяет возможности применения, каждый может выбрать кому что подходит.
Для моих задач подходит HTML вариант. Скомпоновал то, что касается именно его.

Проблема второго запуска наблюдается только если после запуска кода, скопированный текст никуда не вставить руками и снова запустить код.
Мне же нужно один раз кинуть форматированный текст в БО, после выполнения всех моих процедур и закрыть исходный файл. Поэтому всё ОК. На корпоративной машине проверил, работает, безопасники не звонили).

Позже проверю будет ли проблема второго запуска если поочерёдно отрабатывать 2 файла заканчивающихся вставкой текста в БО, если, после отработки первого файла, оператор передумал вставлять куда-то скопированный текст.
 
Цитата
AlexGor написал:
Проблема второго запуска наблюдается только если после запуска кода, скопированный текст никуда не вставить руками и снова запустить код.
У меня данной проблемы не наблюдается
 
Цитата
testuser написал:
У меня данной проблемы не наблюдается
Какой-то плавающий глюк.
На другой машине раз 30 в Excel копируемое вставлял, дважды запускал без вставки, нет глюка.
Открыл Word файл:
- запустил код, вставил
- запустил код, ничего никуда не вставляю, сразу второй раз запустил код = глюк

Закрыл все файлы, открыл Excel с кодом, свернул файл, редактор VBA активен, открыл Word, два раза подряд запустил код, при попытке вставить глюк.
 
Да увидел все-таки дефект. Проверил, лечится стандартным dataobect-ом, нужно ставить перед записью в буфер, костыльно конечно.. Для того чтобы использовать DataObject в vba-проекте должна быть хотябы одна форма.
Код
    Dim dataObj As New DataObject    
    dataObj.SetText ""
    dataObj.PutInClipboard
Изменено: testuser - 25.03.2024 07:35:21 (немного упростил)
 
Цитата
testuser написал:
лечится стандартным dataobect-ом
Глюк ушёл, всё круто. СПАСИБО!
 
Прошу прощения ...
Цитата
testuser написал:
Для того чтобы использовать DataObject в vba-проекте должна быть хотя бы одна форма.
это объяснение откуда глюк или пояснение для использования DataObject?
 
AlexGor, без формы нужно вручную подключать библиотеку msforms в которой есть dataobject. С формой библиотека автоматически подключается
 
testuser, У меня нет форм в проекте, только модуль TEST и модуль класса, при этом всё сработало. Значит библиотеки подключены.
Может как-то сделать чтобы
Код
dataObj.SetText ""
    dataObj.PutInClipboard
запускался только если в БО чего то-там нет, или такая проверка больше производительности съест?
Изменено: AlexGor - 25.03.2024 09:20:34
 
Цитата
testuser написал:
без формы нужно вручную подключать библиотеку msforms в которой есть dataobject
или можно так:
Код
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
 .SetText ""
 .PutInClipboard
End With

тогда и форма не нужна и подключать ничего не нужно.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
AlexGor написал:
Глюк ушёл
DataObject и сам по себе может глючить, когда открыто диалоговое окно экслорера Windows, на всякий случай проверьте и такую ситуацию.
Не смотрел коды этой темы, но почему бы вначале не очищать буфер с помощью API EmptyClipboard?
 
Цитата
написал:
DataObject и сам по себе может глючить
там все глючит, даже появление самого глюка какое-то не стабильное. Сейчас раз десять пытался его вызвать - безрезультатно! Предположение, что сбой кроется в какой-то ассинхронной несостыковке, в связи с этим можно попробовать вариант "в лоб"
Код
    OpenClipboard 0                   'копирование текста в б/о из выделенной памяти
    DoEvents
    EmptyClipboard
    DoEvents
    SetClipboardData FormatNumber, iStrPtr
    CloseClipboard

Есче можно EmptyClipboard жахнуть дуплетом, тут уж б/о должен раздуплиться как надо )
 
DoEvents у меня всегда после EmptyClipboard и CloseClipboard.
В своей надстройке обязательно проверяю (без DoEvents), что буфер обмена отрыт успешно:
Код
  If OpenClipboard(0) = 0 Then
    MsgBox "Can't open Clipboard" & vbLf & "Try hitting Win-V and clean a Clipboard buffer", vbCritical, "Get Clipboard Error"
    Exit Function
  End If

Причем EmptyClipboard у меня опциональный, то есть и без него норм. работает.
Никогда проблем не было, тестировать помогали 2 человека на своих компах - тоже без проблем.
Изменено: ZVI - 25.03.2024 13:40:24
 
Только что проверил на 3-й машине с дополнением от Дмитрий(The_Prist) Щербаков #50, глюк не вылезает, даже при открытом окне проводника.
Удалил
Код
GetObject.........
, сохранил файл, закрыл.
Цитата
AlexGor написал:
Закрыл все файлы, открыл Excel с кодом, свернул файл, редактор VBA активен, открыл Word, два раза подряд запустил код, при попытке вставить глюк.
в точности всё как тут, сразу глюк.
 
Пробовал по всякому, даже такую конструкцию. Все выводы говорят об успешном выполнении, но..
Код
Debug.Print OpenClipboard(0)                  'копирование текста в б/о из выделенной памяти
    DoEvents
    DoEvents
    Debug.Print EmptyClipboard
    DoEvents
    DoEvents
    Debug.Print EmptyClipboard
    DoEvents
    DoEvents
    Debug.Print SetClipboardData(FormatNumber, iStrPtr)
    DoEvents
    DoEvents
    Debug.Print CloseClipboard
    DoEvents
    DoEvents
    Debug.Print CloseClipboard

Есть забавный момент, если макрос выполнить четное число раз - вставка текста из не работает, если нечетное - работает
 
Цитата
AlexGor написал:
редактор VBA активен
Редактор VBE - отдельная песня, лучше все тестировать при закрытом редакторе.
Владимир
 
Цитата
sokol92 написал:
лучше все тестировать при закрытом редакторе
так я код запускаю клавишей "Run Sub" из редактора.
 
Для инфо:
В современных операционках буфер обмена (БО) - множественный: хранит не только последнее, но и предыдущие значения, а там могут быть тяжеловесные объекты. Перейдите на рабочий стол  и нажмите Win+V - откроется панель БО операционной системы.
Такое нововведение (с Win10 вроде бы) тормозит работу приложений с БО.
От его заполненности и неповоротливости зависят и задержки.
OpenClipboard(0) очищает лишь последнее значение в буфере  обмена.
Excel использует свой собственный БО, который взаимодействует и с БО операционной системы.
Кроме того, есть приложения, которые мониторят содержимое БО, что еще добавляет проблем.
Тестировать код лучше с БО операционки, набитым всякими разными данными.
 
Цитата
AlexGor написал:
так я код запускаю клавишей "Run Sub" из редактора.
Попробуйте закрыть редактор и запускать макрос непосредственно из Excel посредством диалога "Макрос" (Alt+F8) или назначьте на макрос горячую клавишу (можно через кнопку "Параметры" в том же диалоге).
Изменено: sokol92 - 25.03.2024 15:24:59
Владимир
 
ZVI, у меня выключен журнал буфера обмена. Да и зачем его нагружать если глюк итак появляется если убрать из TEST
Код
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
 .SetText ""
 .PutInClipboard
End With
и сделать в точнасти как написал ранее:
Цитата
AlexGor написал:
Закрыл все файлы, открыл Excel с кодом, свернул файл, редактор VBA активен, открыл Word, два раза подряд запустил код, при попытке вставить глюк.
Изменено: AlexGor - 25.03.2024 15:31:33
Страницы: Пред. 1 2 3 След.
Наверх