Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 След.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
AlexGor написал:
может этот код кодировку б/о рихтонул?
Скорее всего этот код (через PowerShell) б/о сносит, из #30 и #75 т.к. на рабочей машине:
- этот код не запустился
- код через класс тестировался и работает
- проблемы с б/о не наблюдаются
-
Код
GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
работает, даже при открытых окнах проводника.
sokol92, может подскажете вариант откатить работу кода назад?
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
testuser написал:
Ну так если с этой книги копируете, то лучше сначала вставить это куда-то, прежде чем закрыть эту книгу..
Порядок отработки такой: В основной книге отработала куча функций, сформировались необходимые документы, нужные столбцы в необходимом виде упали в б/о, все книги закрылись, переходим к не офисной программе, вставляем туда столбцы и далее в ней работаем, не возвращаясь к Excel.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
nilske написал:
там ведь чуть выше ссылку на это давали
Ссылки есть а решения проблемы в них нет, только варианты как обойтись без
Код
GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
testuser написал:
Может быть сначала выполнить Close_TempWorkbook, потом ".Copy"?
Copy же из этой книги копирует, если её закрыть то откуда копировать будет.
В данном случае TempWorkbook мною коряво используется для того чтоб получить столбцы в нужном порядке и пару пустых столбцов между ними. Это чтоб в 1с вставлять не по одному столбцу, а сразу всё за раз. Приходится подгоняться под форму ввода которая там.
Вариант с TempWorkbook первое что пришло в голову, при обилии других нерешенных задач.

Похоже как-то паникерски я предыдущее сообщение написал, не так всё и страшно, со столбцами разберусь и жить можно.)
Может у меня просто код со столбцами корявый и по факту не работает только
Код
GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
а это более чем можно пережить.
Просто размышления: если все окна проводника закрою GetObject..... начинает нормально работать. Похоже в свежих офисах эту проблему устранили, т.к. раньше у меня работал по всякому и проблем с проводником не наблюдалось, а какой-то код из темы перепрописал кодировку б/о, перепрописал правильно, но без учёта дополнений в новых версиях офис.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
sokol92,
Цитата
sokol92 написал:
Это обсуждалось  здесь .
там вопрос восстановления стандартной работы б/о не решили.
Цитата
sokol92 написал:
CreateObject("htmlfile").ParentWindow.ClipboardData.SetData "Text", ""
ситуацию не меняет, б/о слетел и работает криво.
Цитата
sokol92 написал:
код  отсюда , указанный Владимиром ( ZVI ).
взял отсюда альтернативный способ кидания текста в б\о, Спасибо. теперь
Код
GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
можно не использовать.
Но главная проблема теперь что стандартные средства б/о не работают. Плюс моя же проблема из #70, обычный
Код
.Copy
работает через ж..., не факт, но возможно также связана с не корректной работой б/о.
Как откатиться назад, чтобы можно было выявить какой код сносит б/о?!

Может кто-то встречал вариант возврата б/о к стандартным настройкам?!
Изменено: AlexGor - 08.04.2024 16:42:06
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Где-то в проекте использовал вариант от sokol92, из #30
Код
Sub Буфер_Обмена_TEXT_Форматированый_HTML_PS() 'HTML - Может не работать на корпоративных машинах из-за ограничений (безопасности) для вызова PowerShell
  Dim txt1$, txt2$
  txt1 = "22.03.2024"
  txt2 = "This should paste as bold."
  HtmlToClipboard "<span style='font-family:Calibri;font-size:13pt;font-weight:bold;'><p>" & txt1 & "</p></span>" & _
                  "<span style='font-family:Calibri;font-size:13pt'><B>" & txt2 & "</B><br>" & _
                  "Этот текст" & "<br>" & "должен быть нормальным." & "&#128077</span>"
End Sub
' Копирует в буфер обмена строку в Html - формате.
' Теги <HTML> и <BODY> указывать не следует.
Private 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 (&#код;).
Private 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
' Запуск внешних программ в синхронном режиме
Private Function RunPgm(ByVal pgm)
    Dim wshShell
    Set wshShell = CreateObject("WScript.Shell")
    RunPgm = wshShell.Run("%comspec% /c " & pgm, 0, True)
    Set wshShell = Nothing
End Function
может этот код кодировку б/о рихтонул?
Изменено: AlexGor - 07.04.2024 15:07:00
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Если запустить
Код
Sub Test_1()
всё норм
потом запустить
Код
Sub Буфер_Обмена()
вставляются ?? в квадратиках
далее снова запускаем
Код
Sub Test_1()
= сообщение "Приложению Microsoft Excel не удалось вставить данные."
Вставляю скопированное в этот же файл Excel, файл не закрываю.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
testuser,
Код
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.SetText "": .PutInClipboard
End With
не помогает
прпобовал
Код
    OpenClipboard 0
в конец кода поставить, не то.
или куда нужно Clear прикрутить?
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Здравствуйте
testuser, без Вас не справиться.
код из #67 работает без нареканий, но после его отработки перестают работать обычные средства копирования данных в буфер обмена:
Если после кода запустить
Код
Sub Буфер_Обмена()
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.SetText "Всем счастья": .PutInClipboard
End With
End Sub

то вставляются два знака вопроса в квадратиках￿￿
Причём достаточно один раз запустить код класса, и всё привет
Код
GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
нормально не работает совсем, даже после перезагрузки.
Думал глюк у меня, нет на другой машине запустил код из #67 и такая же проблема.

Помогите пожалуйста реанимировать буфер обмена.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Здравствуйте,
Вопрос немного в сторону от основной темы.
Приколхозил код из #26 для копирования нескольких столбцов в буфер обмена (как значения, но столбцы и определённое количество пустых столбцов между ними)
Запуск с кнопки:
- при попытке вставить скопированное, ошибка, выдаёт сообщение "Приложению Microsoft Excel не удаётся вставить данные."
Если сделать активным
Код
'Stop
и после остановки продолжить выполнение кода, скопируется правильно и код работает.

Подскажите пожалуйста, что не так с кодом
Код
Option Explicit
Public AFLName As String, awb As Workbook, wbx As Workbook
Private Sub Tovary_ToClipboard()
    AFLName = ActiveWorkbook.Name
Dim SheetNm As String, StrStart As Byte, StrStop As Byte, StrEnd As Byte, StbART As String, StbPCS As String, StbPrice As String
Application.ScreenUpdating = False
    Set awb = ActiveWorkbook
    StrStart = 7
    StbART = "E"
    StbPCS = "G"
    StbPrice = "W"
    StrEnd = 16
    StrStop = Columns(StbART).Find(What:="*", After:=Cells(StrEnd, StbART), LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious).Row
    Workbooks.Add
    Set wbx = ActiveWorkbook
'Stop 'Позже удалить
    ActiveWindow.Visible = False
With awb.Sheets(1)
    wbx.Sheets(1).Range("A1:A" & StrStop - 6).Value = .Range(StbART & StrStart & ":" & StbART & StrStop).Value
    wbx.Sheets(1).Range("D1:D" & StrStop - 6).Value = .Range(StbPCS & StrStart & ":" & StbPCS & StrStop).Value
    wbx.Sheets(1).Range("E1:E" & StrStop - 6).Value = .Range(StbPrice & StrStart & ":" & StbPrice & StrStop).Value
End With
    wbx.Sheets(1).Range("A1:E" & StrStop - 6).Copy
    Close_TempWorkbook
Endd:
Application.ScreenUpdating = True
End Sub
Private Sub Close_TempWorkbook()
On Error Resume Next
wbx.Close 0
Set wbx = Nothing
End Sub
Возможно у меня после тестирования кодов из темы настройки буфера обмена как-то сбились, как реанимировать. Просто предположение)
Изменено: AlexGor - 05.04.2024 05:26:27
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
testuser, Без костыля
Код
GetObject.........
работает нормально, глюк не выскакивал.
Спасибо Вам Огромное!!!
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
sokol92, поэтому я и написал
Цитата
AlexGor написал:
Проблема второго запуска наблюдается только если после запуска кода, скопированный текст никуда не вставить руками и снова запустить код.
Мне же нужно один раз кинуть форматированный текст в БО, после выполнения всех моих процедур и закрыть исходный файл. Поэтому всё ОК.
Позже проверю будет ли проблема второго запуска если поочерёдно отрабатывать 2 файла заканчивающихся вставкой текста в БО, если, после отработки первого файла, оператор передумал вставлять куда-то скопированный текст.
В данном случае увидел интерес специалистов к плавающему глюку и совершенно не против получить более отшлифованный код. Поэтому и трачу время на тестирования которые предлагают.
Изменено: AlexGor - 25.03.2024 16:04:30
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
testuser написал:
при повторном выполнении (без последующей вставки) происходит какая-то ошибка,  при следующем (не четном) выполнении ошибка уже исправлена
примерно так, только иу меня почему-то ещё есть зависимость какое окно активно:
-если на экране письмо Outlook и редактор, то запускай сколько угодно, глюка нет
- если же Word и редактор, то двойной запуск = глюк (причём если при этом не свернуть окно Excel, глюка не будет)
Изменено: AlexGor - 25.03.2024 15:51:37
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
sokol92,Запуск с кнопки описал ранее в #37
Цитата
AlexGor написал:
4 + Запуск с кнопки: проблемы второго запуска не наблюдаются, но запуск с кнопки мне и не нужен, просто проверял.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
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
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
sokol92 написал:
лучше все тестировать при закрытом редакторе
так я код запускаю клавишей "Run Sub" из редактора.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Только что проверил на 3-й машине с дополнением от Дмитрий(The_Prist) Щербаков #50, глюк не вылезает, даже при открытом окне проводника.
Удалил
Код
GetObject.........
, сохранил файл, закрыл.
Цитата
AlexGor написал:
Закрыл все файлы, открыл Excel с кодом, свернул файл, редактор VBA активен, открыл Word, два раза подряд запустил код, при попытке вставить глюк.
в точности всё как тут, сразу глюк.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
testuser, У меня нет форм в проекте, только модуль TEST и модуль класса, при этом всё сработало. Значит библиотеки подключены.
Может как-то сделать чтобы
Код
dataObj.SetText ""
    dataObj.PutInClipboard
запускался только если в БО чего то-там нет, или такая проверка больше производительности съест?
Изменено: AlexGor - 25.03.2024 09:20:34
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Прошу прощения ...
Цитата
testuser написал:
Для того чтобы использовать DataObject в vba-проекте должна быть хотя бы одна форма.
это объяснение откуда глюк или пояснение для использования DataObject?
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
testuser написал:
лечится стандартным dataobect-ом
Глюк ушёл, всё круто. СПАСИБО!
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
testuser написал:
У меня данной проблемы не наблюдается
Какой-то плавающий глюк.
На другой машине раз 30 в Excel копируемое вставлял, дважды запускал без вставки, нет глюка.
Открыл Word файл:
- запустил код, вставил
- запустил код, ничего никуда не вставляю, сразу второй раз запустил код = глюк

Закрыл все файлы, открыл Excel с кодом, свернул файл, редактор VBA активен, открыл Word, два раза подряд запустил код, при попытке вставить глюк.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
testuser написал:
Вношу свою лепту.
Спасибо Вам большое!
Ваш вариант расширяет возможности применения, каждый может выбрать кому что подходит.
Для моих задач подходит HTML вариант. Скомпоновал то, что касается именно его.

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

Позже проверю будет ли проблема второго запуска если поочерёдно отрабатывать 2 файла заканчивающихся вставкой текста в БО, если, после отработки первого файла, оператор передумал вставлять куда-то скопированный текст.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
На сегодня есть 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" не запускаются (не работают).
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
sokol92 написал:
Протестируйте, пожалуйста
На другой машине работает, Офис 2019.
Цитата
AlexGor написал:
Не работает:
Это тестирование на 2013-м офисе. Хотя тут и политика безопасности может не давать работать. После запуска на первой машине Инф.безопасник позвонил - типа у меня вирус в этом файле. Хотя с другими файлами на рабочем без проблем работаю, и кода в них больше.
Второе тестирование на личном компе.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
sokol92 написал:
Протестируйте, пожалуйста (занести в стандартный модуль книги):
Не работает:
1. первый запуск - в БО то, что копировалось ранее, руками
2. второй запуск - ошибка, останавливается на строке:
Код
RunPgm = wshShell.Run("%comspec% /c " & pgm, 0, True)
Если в редакторе VBA нажать продолжить, выполнение кода продолжается. Но результат тот же - БО не изменился.
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
tolikt, Вариант очень даже рабочий.
Минусы:
1. Скопированный текст не доступен если закрыть исходный файл.
2. Нужно высчитывать количество знаков для форматирования. А так как переменная это переменная, не совсем удобно.
Да, я сам написал "Часть текста", но тут это слишком буквально.

Вариант #19 предварительно предпочтительнее, т.к. можно сразу собрать в одну строку форматирование и форматируемые переменные, (это я так вижу))) Особенно если длинный текст, проще его собрать из сформировавшихся переменных.
Осталось только накопать:
Цитата
sokol92 написал:
Создать временный файл и записать туда HTML в кодировке utf-8.
Ну и классы, учить и учить!
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
БМВ, Название темы, наверное, можно было бы изменить на:
«VBA, Вывод текста из переменной в буфер обмена, с применением форматирования»
VBA Часть текста "полужирный" в буфер обмена, из переменной, Скопировать текст в буфер обмена, при этом его часть сделать "полужирной"
 
Цитата
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 при наличии Китайских символов, В переменную падают "?" вместо Китайских иероглифов
 
Цитата
andypetr написал:
Возможно, чуть быстрее будет напрямую менять имя файла?
Быстрее). СПАСИБО!!!
ошибка VBA при наличии Китайских символов, В переменную падают "?" вместо Китайских иероглифов
 
Цитата
andypetr написал:
Попробуйте через объект FSO:
Работает! Спасибо Огромное!!!
Визуально показалось что CreateObject медленнее работает, но это субъективно.
Тормоза возможно из-зи того что файлы на Яндекс диске лежат. Главное что работает.
Ещё раз СПАСИБО!!!
Страницы: 1 2 3 4 5 6 След.
Наверх