Страницы: 1 2 3 След.
RSS
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Здравствуйте, уважаемые знатоки VBA, помогите пожалуйста.
Необходимо текст из переменной отформатировать и скопировать в буфер обмена, для последующей вставки.
В БО текст копирую этим кодом:
Код
Sub TEST_1()
    Dim Byf$
    Byf = "This is bold." & Chr(13) & "This is normal."
    SetClipBoardText Byf
End Sub
Function SetClipBoardText(ByVal Text As Variant) As Boolean
    SetClipBoardText = CreateObject("htmlfile").parentWindow.clipboardData.SetData("Text", Text)
End Function

Есть ещё такой вариант, не знаю есть ли между ними разница:
Код
Sub TEST_2()
    Dim Byf$
    Byf = "This is bold." & Chr(13) & "This is normal."
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .SetText Byf: .PutInClipboard
    End With
End Sub
Возможно ли в VBA форматирование текста, копируемого в буфер обмена?
Может возможно использовать что-то типа:
Код
<p><em><span style="font-family:Calibri;color: rgb(0, 41, 114);font-size:11pt;">Коллеги, Здравствуйте.</em></span></p>
Если да, то как это записать в случае с переменной?
Хотя бы выделять "полужирным", уже было бы счастье)
 
Для последующей вставки куда?
 
Цитата
nilske написал:
Для последующей вставки куда?
Здравствуйте.
По факту для вставки в описание задачи в "Teambition", но это не важно, текст из БО можно вставлять куда угодно.

Текст сформировался в процессе выполнения кода, нужно его отформатировать.
На выходе нужен отформатированный текст в буфере обмена, чтоб через Ctrl+V его туда вставить.

Проверил: Если туда вставлять отформатированный текст из Word, форматирование сохраняется, причём полностью, даже цвета.

Получается можно через VBA
  - создать временный Word файл,
  - записать туда текст из переменной
  - отформатировать (в моём случае: весть текст шрифтом "Calibri"; 13 шрифт; первая строка "полужирный")
  - отформатированный текст закинуть в буфер обмена
  - удалить временный Word файл.

Может кто поможет?
Думаю возможность вывода форматированного текста из VBA не одному мне пригодится.
 
А вот такое решение не подойдёт?
https://stackoverflow.com/questions/72277781/vba-store-formatted-text-in-clipboard

И вроде как уникальность задачи была поместить правильный текст из переменной, а не из Ворда или ячейки )
Изменено: nilske - 15.03.2024 03:42:04
 
Цитата
nilske написал:
И вроде как уникальность задачи была поместить правильный текст из переменной, а не из Ворда или ячейки )
Word, это как вариант решения задачи, т.к. другого пока в голову не пришло)
 
Цитата
nilske написал:
https://stackoverflow.com/questions/72277781/vba-store-formatted-text-in-clipboard

Код
Sub TestCopying()
    CopyWithSomeFormatting "This should paste as red/bold"
End Sub
Sub CopyWithSomeFormatting(txt As String)
    Dim myClipboard As New vbaClipboard 'Instantiate a vbaClipboard object
    myClipboard.SetClipBoardText _
        "<span style='color:#F00;font-weight:bold'>" & txt & "</span>", "HTML Format"
End Sub
Ругается на
Код
Dim myClipboard As New vbaClipboard
Пишет: "Compil error: User-defined typ not defined"
 
AlexGor,
If you use the clipboard classes from @GMCB found at https://stackoverflow.com/a/63735992/478884

https://stackoverflow.com/questions/63716400/injecting-rtf-code-in-the-clipboard-to-paste-into-ms-word-as-rtf-text-via-a-vba/63735992#63735992
Изменено: nilske - 15.03.2024 06:52:14
 
nilskeСпасибо Вам за Ваше время.
Видел эту ссылку. Понял что нужно подключать классы, но с классами не знаком.
Для меня это три кода, два из которых по километру (Реально километры кода, чтоб просто форматнуть текст), как их подключить, для меня...
Втыкал их в свой VBA, ничего не запускается, половина строк кода красные, адаптировать в рабочее состояние километр профессионального кода выше моих сил)
Кинуть текст в Word и оттуда в БО, на мой взгляд, код будет в 100 раз короче. Вот только c VBA в Word я совсем не знаком, от слова совсем.

Если в ячейке Excel прописать текст с форматированием HTML, то при создании письма Outlook со ссылкой на эту ячейку, в письмо падает уже форматированный текст. Поэтому я предположил, что есть какая-то команда которая сделает тоже самое, но в буфер обмена.

Неужели нет варианта поизящнее?
 
AlexGor, думаю что это самый изящный вариант. Более того, он ещё и самый короткий. И самый правильный - не требуется целый Word ))
Всё как Вам требуется, но нужно разобраться с классами один раз и навсегда.
 
Идея с Word понятная, но если не хочется заморачиваться с VBA в Word, то можно заморочиться с VBA Excel.
В файле макрос для копирования форматированного текста в буфер.

Кратко работает так:
Создаём временную скрытую книгу Excel.
Берём текст и помещаем его в скрытую книгу.
Там в ячейке форматируем как надо (в макросе - только ячейку с первым текстом, вторую оставляем как есть).
Копируем в буфер нужные ячейки (в макросе - 2 ячейки).
Переходим в нужное приложение и вставляем куда надо.

Если потом в Excel что-то поменять на листе, то значок Вставить становится неактивным и Ctrl+C также не срабатывает. Но если развернуть буфер обмена, то можно вставить отформатированные данные оттуда.

В макросе временная книга сама закроется при закрытии основного файла (Workbook_BeforeClose в модуле Эта Книга)

Минусы метода через Excel: в Word и другие программы данные из буфера вставляются как табличка, что не всегда нужно. Поэтому вариант макроса с непосредственным задействованием Word имеет смысл. Возможно, кто-то сможет реализовать.

Проверял на 2021 Excel, Word, Outlook. Про остальное - не знаю.


ЗЫ. Вариант от nilske с классами -  классный! Жаль, что не хватает тямы разобраться в нём...
Изменено: tolikt - 16.03.2024 11:34:40
 
Вариант рабочий, но
Цитата
tolikt написал:
данные из буфера вставляются как табличка,
как раз мне и не подходит.
Вариант с классами скорее всего без этого нюанса, но запустить и проверить пока не получается)
 
В тему ))
Как я полюбил vba-классы
 
Off
nilske, возможно дальше и что-то дельное, но кроме словесной диареи в первых двух пунктах ничего нет. Да еше и факты исковерканы, мол на планете еще массывы не "открыли".... да и комменты к статье мои слова только подтверждают. Когда уже хоанилища автоматом будут отторгать этот бред? Жду с нетерпением.
Изменено: БМВ - 18.03.2024 08:29:45
По вопросам из тем форума, личку не читаю.
 
БМВ, согласен с тем, что там много воды и ошибочных утверждений, но для каждого "дельное" будет своё (или не будет).
комментарии, на мой взгляд, в основном неплохие и также полезные.
 
nilske, в том то и дело, что если есть дельное, то многим может показаться что и все остальное по делу. А там и вода , да еще и не верная вода.
По вопросам из тем форума, личку не читаю.
 
Цитата
nilske написал:
А вот такое решение не подойдёт?
Попробовал разобраться с классами, кое как запустил. Работает но нужно допилить.
Скомпоновал вариант HTML, я конечно прям топором, но как умею.
Подскажите пожалуйста зачем в классе
Код
BEGIN
  MultiUse = -1  'True
End
Attribute VB_Name = "vbaClipboard"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
"BEGIN" - выдаёт ошибку, а Атрибуты сразу же красные. Чтоб код запустить просто их убрал.

Работает моментально, скопированный, форматированный текст в буфере, пока не скопируешь что-то другое, даже если закрыть исходный файл.
Допилить:
1. если запустить код 2-й раз в БО будет пусто. Если запустить код 3-й раз, текст в БО упадёт. Второй запуск сработает если руками что-то скопировать и потом запустить. В общем после завершения кода с БО что-то происходит, даже если после кода руками что-то копируешь, в БО падают какие-то значки, а не то, что копировал. Проблема самоустраняется если снова руками что-то скопировать.
2. вместо кириллицы выдаёт кракозябры.

В прикреплённом файле модуль "TEST"
 
БМВ, Название темы, наверное, можно было бы изменить на:
«VBA, Вывод текста из переменной в буфер обмена, с применением форматирования»
 
Цитата
AlexGor написал:
зачем в классе
https://vbaplanet.com/attributes.php
попробуйте сделать как там написано - все атрибуты в модуле на месте, но из редактора VBA недоступны  )
 
Цитата
БМВ,  написал:
А там и вода , да еще и не верная вода.
Действительно, как-то все некрасиво и проблемы с символами Unicode, не попадающими в диапазон 0-127.
Проще сделать так:
1. Создать временный файл и записать туда HTML в кодировке utf-8.
Например, файл C:\Temp\test2.html c содержимым
Код
<html> <body>Это обычный шрифт.<b>Это полужирный.</b> <i><b>This is bold italic.</b> This is italic.</i></body> </html>
2. Скопировать содержимое файла в буфер обмена в формате "Html". Например, через PowerShell:
Код
Sub Test()
  RunPgm "powershell -command ""type C:\Temp\test2.html | Set-Clipboard -AsHtml"""
End Sub

' Запуск внешних программ в синхронном режиме
Function RunPgm(ByVal pgm)
    Dim wshShell
    Set wshShell = CreateObject("WScript.Shell")
    RunPgm = wshShell.Run("%comspec% /c " & pgm, 0, True)
    Set wshShell = Nothing
End Function
Наверняка, есть и более краткие пути.
Владимир
 
sokol92, приветствую и спасибо!  :idea:
Мне нравится такой метод  8)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
sokol92, а в каких случаях Вы используете пользовательские классы (если используете)?
Почему через PowerShell или Word сделать красивее, чем через пользовательский класс? Или мне так сложно=некрасиво?
 
nilske, я по вашей ссылке в #18 вообще ничего про форматирования символов не увидел
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, в #18 есть цитата-вопрос ТС, к которому относится мой ответ
 
Цитата
nilske написал:
Почему через PowerShell или Word сделать красивее, чем через пользовательский класс
Если Вы о программе из #16, то пользовательские классы не при чем, всё это без проблем переносится в стандартный модуль. Там используются Windows API для работы с буфером обмена. Соответственно, нужно разбираться с проблемами. Например:
Цитата
AlexGor написал:
2. вместо кириллицы выдаёт кракозябры.
Могу (не вникая в текст макросов) предположить, что проблема с использованием ASCII версий Windows API вместо Unicode версий.

На мой взгляд, лучше идти проторенными путями и контролировать свои шаги.
Например, в результате пункта 1 из #19 будет создан (временный) файл формата html. Мы сможем проверить его корректность, открыв в любом браузере.
Владимир
 
Цитата
sokol92 написал:
лучше идти проторенными путями
спасибо за ответ.
 
Пока суперспециалисты спорят о классах, хтмл и прочем высоком, вернёмся на грешную землю к сермяжно-посконному подходу к решению данной задачи.
Если слегка подрихтовать кувалдой и ломом предыдущий колхозный вариант, то из буфера в Word вставляется в простом виде, а не табличкой.
В схему работы макроса добавлен нюанс: всю строку во временной книге, куда вставляем текст, делаем объединённой.
Проверено на 2010(32), про остальное ничего не могу сказать.
 
tolikt, за неимением решений по теме - возможно тоже вариант )
 
tolikt, Вариант очень даже рабочий.
Минусы:
1. Скопированный текст не доступен если закрыть исходный файл.
2. Нужно высчитывать количество знаков для форматирования. А так как переменная это переменная, не совсем удобно.
Да, я сам написал "Часть текста", но тут это слишком буквально.

Вариант #19 предварительно предпочтительнее, т.к. можно сразу собрать в одну строку форматирование и форматируемые переменные, (это я так вижу))) Особенно если длинный текст, проще его собрать из сформировавшихся переменных.
Осталось только накопать:
Цитата
sokol92 написал:
Создать временный файл и записать туда HTML в кодировке utf-8.
Ну и классы, учить и учить!
 
Цитата
tolikt: Пока суперспециалисты спорят о классах, хтмл и прочем высоком, вернёмся на грешную землю к сермяжно-посконному подходу к решению данной задачи.Если слегка подрихтовать кувалдой и ломом предыдущий колхозный вариант, то из буфера в Word вставляется в простом виде, а не табличкой.
:D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Тестирование показывает, что не все программы соблюдают стандарты и корректно работают с русскими буквами при вставке из буфера обмена, имеющего формат "Html". Так что придется до копирования в буфер обмена кодировать (по старинке) все символы юникода с кодом >=128. После этого кодировка utf-8 не отличается от кодировки windows-1251.  :)

Протестируйте, пожалуйста (занести в стандартный модуль книги):
Код
Option Explicit

' Копирует в буфер обмена строку в Html - формате.
' Теги <HTML> и <BODY> указывать не следует.
Sub HtmlToClipboard(ByVal txt As String)
  Dim fso As Object, f As Object, fileName As String
  Set fso = CreateObject("Scripting.FileSystemObject")
  fileName = fso.GetSpecialFolder(2) & "\" & fso.GetTempName() & ".html" ' временный файл
  Set f = fso.OpenTextFile(fileName, 2, True)  ' для записи
  f.Write HtmlEncode("<HTML><BODY>" & txt & "</BODY></HTML>")
  f.Close
  
  RunPgm "powershell -command ""type " & fileName & " | Set-Clipboard -AsHtml"""

  Set f = Nothing
  Set fso = Nothing
  Kill fileName
End Sub

' Кодирует в строке txt все символы с кодом >=128 по стандарту Html (&#код;).
Function HtmlEncode(ByVal txt As String) As String
  Dim arr, n As Long, i As Long, s As String
  If Len(txt) = 0 Then Exit Function
  ReDim arr(1 To Len(txt))
  For i = 1 To Len(txt)
    s = Mid(txt, i, 1)
    n = AscW(s)
    If n > 127 Then
      arr(i) = "&#" & n & ";"
    Else
      arr(i) = s
    End If
  Next i
  
  HtmlEncode = Join(arr, "")
End Function

' Запуск внешних программ в синхронном режиме
Function RunPgm(ByVal pgm)
    Dim wshShell
    Set wshShell = CreateObject("WScript.Shell")
    RunPgm = wshShell.Run("%comspec% /c " & pgm, 0, True)
    Set wshShell = Nothing
End Function

Sub Test()
  HtmlToClipboard "<B>Это полужирный</B> and <I>this is italic.</I>"
End Sub

Изменено: sokol92 - 21.03.2024 17:20:34
Владимир
Страницы: 1 2 3 След.
Наверх