Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 0
Регистрация: 28.06.2014
Сообщений: 35
Excel

Clipboard мониторинг, чтение

22.04.2023, 19:58. Показов 1323. Ответов 9

Студворк — интернет-сервис помощи студентам
Приветствую.
Задача состоит в том, что бы из Excel следить за буфером обмена Windows. И если текстовая составляющая буфера обмена меняется, сохранять ее в таблице. Прилагаю файл с примером кода. Для запуска нажать на кнопку, после чего, копирование текста в буфер обмена в различных приложениях будет последовательно попадать в ячейки таблицы. Что бы остановить выполнение кода, скопируйте в буфер обмена строку длинной в два символа. Пример почти рабочий). В цикле с интервалом в две секунды проверяется текст в буфере обмена, если проверка выявила разницу с прошлым разом, значит буфер обмена изменился и я заношу его в таблицу.
Проблема в том, что при повторных обращениях к буферу обмена может вывалиться ошибка. Мутная ошибка -2147221040 (800401d0). Ничего толкового по ней я не нашел. Самое толковое что народ рекомендует, это перехватывать ее, ждать еще и снова ломиться к тексту в буфере обмена. Такое себе решение. Если в коде интервал обращения к буферу обмена уменьшить до секунды, то ошибка с высокой долей вероятности случиться при нескольких повторений копирования в буфер обмена. Если выставить интервал в 2 секунды, то вероятность вылета в ошибку очень низкая.
Может можно все реализовать по другому, что бы не обращаться к буферу обмена каждую секунду а как то перехватывать событие изменения буфера обмена. или можно избежать ошибки? прошу помощи.
Вложения
Тип файла: zip clipboard.zip (18.3 Кб, 10 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.04.2023, 19:58
Ответы с готовыми решениями:

Чтение изображения из Clipboard в PictureBox
Здравствуйте! Подскажите пожалуйста такую делать... Мне вот нужно в моей программе сделать так, чтобы пользователь мог загружать в...

Clipboard (запись/чтение) массива структур
Привет, форумчане! Прошу консультации по работе с буфером обмена Windows. Нужно корректно записывать/считывать массив структур...

Класс Clipboard - ошибка «Requested Clipboard operation did not succeed»
Пытаюсь скопировать текст программно таким образом: Clipboard.SetText("something") Вместо выполнения поручения, он напрочь отказывается...

9
Часто онлайн
 Аватар для КостяФедореев
987 / 637 / 280
Регистрация: 09.01.2017
Сообщений: 2,080
22.04.2023, 21:45
Xalyf,
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#If VBA7 Then ' проверяем, что используется 64-битная версия VBA
    Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hWnd As LongPtr) As LongPtr ' объявляем функцию API для установки фокуса на окно
    Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal nCmdShow As Long) As LongPtr ' объявляем функцию API для показа окна
#Else ' для 32-битной версии VBA
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long ' объявляем функцию API для установки фокуса на окно
    Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long ' объявляем функцию API для показа окна
#End If
Dim buffer(1 To 2) As String ' храним последнии состояния буфера обмена
Sub Кнопка1_Щелчок()
    SetClipboardText ("") ' очищаем буфер обмена
    buffer(1) = "" ' текст из буфера обмена в переменную (очищаем попросту)
 
    Do ' в цикле с задержкой в 2 секунды проверяем содержимое буфера обмена и сравниваем с эталоном
        Application.Wait (Now + TimeValue("0:00:02")) ' пауза в 1 сек вызывает ошибку
        buffer(2) = ClipboardText() ' читаем буфер обмена
        If (buffer(2) <> buffer(1)) And (Len(buffer(2)) <> 2) Then ' сравнимаем результат с последним состоянием буфера обмена
            ActiveCell = Replace(Replace(Trim(buffer(2)), vbLf, " "), "  ", " ") ' буфер обмена изменился, сохраняем текст буфера в текущую ячейку убираем переносы строк и двойные пробелы
            buffer(1) = buffer(2) ' сохраняем текущее состояние буфера обмена
            Cells(ActiveCell.Row + 1, ActiveCell.Column).Select ' переходим на следующую ячейку
        End If
    Loop While (Len(buffer(2)) <> 2) ' делаем пока длинна текста в буфере обмена не будет равна двум символам
 
    'Beep 500, 300
    SetForegroundWindow Application.hWnd ' устанавливаем фокус на окно Excel
    ShowWindow Application.hWnd, vbMinimizedFocus ' сворачиваем окно Excel
End Sub
 
Function ClipboardText() ' чтение из буфера обмена
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        ClipboardText = .GetText
    End With
End Function
 
Sub SetClipboardText(ByVal txt$) ' запись в буфер обмена
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText txt$
        .PutInClipboard
    End With
End Sub
0
22.04.2023, 21:53

Не по теме:

Опять GPT?

0
3 / 3 / 0
Регистрация: 28.06.2014
Сообщений: 35
22.04.2023, 23:17  [ТС]
КостяФедореев,
причесал код, но проблему не решил. Так же валится в ошибку, если таймаут в одну секунду поставить. Прикладываю скрин и pdf файлик по которому я тестирую копирование в буфер обмена.
Миниатюры
Clipboard мониторинг, чтение  
Вложения
Тип файла: pdf 21.04.202312-05-00REC0007.pdf (470.0 Кб, 5 просмотров)
0
3 / 3 / 0
Регистрация: 28.06.2014
Сообщений: 35
22.04.2023, 23:54  [ТС]
в 14й строке исправляем 2 на 1, в 31й строке получаем ошибку, но не сразу а на какой то одной из повторных попытках прочесть буфер обмена.
0
1390 / 847 / 92
Регистрация: 08.02.2017
Сообщений: 3,614
Записей в блоге: 2
23.04.2023, 15:17
Лучший ответ Сообщение было отмечено Xalyf как решение

Решение

Из нюансов, если одновременно работать в Excel лучше данный файл запускать в отдельном процессе (Excel /x).
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub StartCleapMonitor()
    With ThisWorkbook.Sheets(1)
        Set curCell = .Cells(.Cells(2), 1)
    End With
    Set dataObj = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") 'Set dataObj = New MSForms.DataObject
    clpmOn = 1
    CleapMonitor
End Sub
Sub StopCleapMonitor()
    clpmOn = 0
End Sub
Sub CleapMonitor()
    Static oldClp$
    Dim Clp$, ln&
    If clpmOn = 0 Then Exit Sub
    DoEvents
    If Application.ClipboardFormats(1) = 0 Then    'проверка наличия текста в б/о
        dataObj.GetFromClipboard
'        if dataObj.GetFormat(1) =True then        'второй способ проверки наличия текста в б/о
        Clp = dataObj.GetText
        ln = Len(Clp)
        If ln Then
            If ln = 2& Then Exit Sub               'отключение слежки если 2 символа
            If Clp <> oldClp Then
                With curCell '                     'запись текста в ячейку
                    .Value = Clp
                    .WrapText = False
                End With
                Set curCell = curCell.Offset(1)
                oldClp = Clp
            End If
            dataObj.Clear
            dataObj.SetText ""
            dataObj.PutInClipboard                 'очистка буфера
        End If
    End If
    Application.OnTime Now + TimeValue("00:00:01"), "CleapMonitor"
End Sub
Вложения
Тип файла: zip clipboard.zip (22.7 Кб, 6 просмотров)
1
1390 / 847 / 92
Регистрация: 08.02.2017
Сообщений: 3,614
Записей в блоге: 2
23.04.2023, 15:46
Кстати вот не понял, для чего очистка б/о, просто взял идею из оригинала.
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
24.04.2023, 10:41
Есть кросс на Планете
0
3 / 3 / 0
Регистрация: 28.06.2014
Сообщений: 35
24.04.2023, 13:51  [ТС]
testuser2, спасибо! Действительно рабочий код в такой компоновке.
Это был тестовый пример, очистка буфера попала из рабочего проекта. Там вначале очищаю буфер, что бы не попало в таблицу то что не планировалось в нее вносить.
На соседском форуме мне предложили решение на WinAPI минуя DataObject. И это решение легло в мой алгоритм без каких либо модификаций самого алгоритма, и пофиксило проблему с вылетом в ошибку. Автор решения заявляет, что DataObject работает нестабильно. Вот ссылка на ветку с решением https://www.planetaexcel.ru/fo... 1%82%D0%B8
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
24.04.2023, 14:27
Цитата Сообщение от Xalyf Посмотреть сообщение
Автор решения заявляет, что DataObject работает нестабильно
возможно, проблема существует только при позднем связывании, т.к. я за годы использования её в раннем — косяков не заметил.
Впрочем, API должна быть шустрее вариантов на DataObject и HTML.parentWindow.clipboardData (не тестил).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2023, 14:27
Помогаю со студенческими работами здесь

Ошибка при работе с Clipboard: "Сannot open clipboard. Отказано в доступе."
Хотел написать программу для автоматической замены текста в буфере обмена, но при обращении к буферу получаю ошибку &quot;Сannot open...

Вставка из clipboard
Здравствуйте ! Как вставить текст в input из clipboard на JS?

Странности с clipboard
С некоторого времени в работе clipboard (WinXP Pro SP3) возникли странности. Либо никак не удается перенести сохраненный текст (таблицу и т...

Не работает clipboard :(
Вечер как занимаюсь переустанавливанием Лазаря... ClipBoard как не работал, так и не работает. Качал вот отсюда:...

Работа с Clipboard
Здравствуйте! Заметил, что если скопировать картинку (клик ПКМ-&gt;Копировать), в буфер обмена помещается строка с адресом этой картинки. Хочу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru