17

Доступ к тексту в буфере обмена в vba/vbs

Попросили помочь со скриптами vbs. Благодаря криворукости разработчиков специфическому поведению SAP, решением проблемы было использование буфера обмена. С чтением содержимого всё просто, а вот с записью уже не так тривиально. Причём, сторонний софт туда не скопировать и не скомпилировать - огорожено. Так что пользуют "васик".


Вобщем, нарыл вот такое. Кому надо, пользуйтесь:


Функция:

Function ClipBoard(input)
If IsNull(input) Then
ClipBoard = CreateObject("HTMLFile").parentWindow.clipboardData.getData("Text")
If IsNull(ClipBoard) Then ClipBoard = ""
Else
CreateObject("WScript.Shell").Run "mshta.exe javascript:eval(""document.parentWindow.clipboardData.setData('text','" & Replace(Replace(Replace(input, "'", "\\u0027"), """","\\u0022"),Chr(13),"\\r\\n") & "');window.close()"")", 0,True
End If
End Function

Использование:


Получение текста:

result = ClipBoard(null)

Установка текста:

ClipBoard("новый текст")

Если установка не нужна, можно функцию не использовать, хватит простой строки:

result = CreateObject("HTMLFile").parentWindow.clipboardData.getData("Text")

Для установки через setData такой способ не подходит (М$ пофиксили возможность зачем-то), посему приходится извращаться с помощью HTA.

MS, Libreoffice & Google docs

762 поста14.9K подписчика

Правила сообщества

1. Не нарушать правила Пикабу

2. Публиковать посты соответствующие тематике сообщества

3. Проявлять уважение к пользователям

4. Не допускается публикация постов с вопросами, ответы на которые легко найти с помощью любого поискового сайта.

По интересующим вопросам можно обратиться к автору поста схожей тематики, либо к пользователям в комментариях


Важно - сообщество призвано помочь, а не постебаться над постами авторов! Помните, не все обладают 100 процентными знаниями и навыками работы с Office. Хотя вы и можете написать, что вы знали об описываемом приёме раньше, пост неинтересный и т.п. и т.д., просьба воздержаться от подобных комментариев, вместо этого предложите способ лучше, либо дополните его своей полезной информацией и вам будут благодарны пользователи.

Утверждения вроде "пост - отстой", это оскорбление автора и будет наказываться баном.

0
Автор поста оценил этот комментарий

цитата забавная. но по сути неверная. надо "кто не читал документацию и пытался работать"

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Не берусь оценивать уровень компетенции сотрудников, поскольку сам там не работаю.

0
Автор поста оценил этот комментарий

вы вместо нормального экспорта на абапе прикручиваете к одному костылю другой, а виноват сап :)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

У пользователей, и соответственно у меня, нет доступа к abap'у, автоматизация только через vbs. Что дали, с тем и работают. Понятно, что не разработчики сап, а внедренцы или собственные программеры сделали такое говно окно, к которому нет нормального доступа. Это извращение с буфером появилось не от хорошей жизни.

показать ответы
1
Автор поста оценил этот комментарий
Безопасность по шапке не даст?)

vbs официально можно. А вот autoIt уже нельзя)


Какую задачу-то решаете?

Там форма открывается по рандомным координатам с фокусом на рандомном элементе управления, причём форма модальная и доступа к ней через апи SAPа изнутри нет. Поэтому навигация только через SendKeys "вслепую". В единственный textedit (там ещё списки и куча кнопок) нужно вставить текст и нажать кнопку. Вся эта хрень нужна чтобы определить, где сейчас фокус ввода: скрипт пытается ввести заранее установленный текст (больше его, слава Ктулху, ввести некуда), потом копирует в буфер содержимое и сверяет с введённым. Если совпало - значит фокус там где надо. Установка буфера нужна для многократного запуска. Без неё можно было бы обойтись, например, использованием текущего времени в качестве шаблона, но мне было просто интересно возможно ли это в принципе. А так-то, vbs вообще не мой профиль, просто помочь попросили.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Как шутят сами сотрудники, "кто работал в SAP, тот в цирке не смеётся".

показать ответы
1
Автор поста оценил этот комментарий
Безопасность по шапке не даст?)
Какую задачу-то решаете?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Безопасность по шапке не даст?)

vbs официально можно. А вот autoIt уже нельзя)


Какую задачу-то решаете?

Там форма открывается по рандомным координатам с фокусом на рандомном элементе управления, причём форма модальная и доступа к ней через апи SAPа изнутри нет. Поэтому навигация только через SendKeys "вслепую". В единственный textedit (там ещё списки и куча кнопок) нужно вставить текст и нажать кнопку. Вся эта хрень нужна чтобы определить, где сейчас фокус ввода: скрипт пытается ввести заранее установленный текст (больше его, слава Ктулху, ввести некуда), потом копирует в буфер содержимое и сверяет с введённым. Если совпало - значит фокус там где надо. Установка буфера нужна для многократного запуска. Без неё можно было бы обойтись, например, использованием текущего времени в качестве шаблона, но мне было просто интересно возможно ли это в принципе. А так-то, vbs вообще не мой профиль, просто помочь попросили.

показать ответы
1
Автор поста оценил этот комментарий
У пользователей ... нет доступа к abap'у
и слава богу
ЗЫ но мне нравятся такие конторы. покупают систему с ценником вместе с железом в несколько лямоевров, и жмутся на найм и обучение нормальных специалистов.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну так они ж не для работы его покупают, а для имиджа и капитализации холдинга, чтобы "как у всех чотких пацанов". Лет пятнадцать назад со стороны наблюдал, как в одном из подразделений Лукойла сап внедряли вместо 1с (в принципе их всё устраивало, но в москве решили, что нет). Бухгалтера через полгода внедрения волосы на жопе рвали, когда увидели, как у них основные средства начали рандомно троиться, а ответственные внедренцы свалили в отпуск.

0
Автор поста оценил этот комментарий

А что за транзакция, и какой должен быть результат?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Фиг его знает что за транзакция, даже не хочу вникать в эту муть, работает и хорошо. Окно модальное при сохранении/экспорте. Судя по тому, что оно визуально отличается от окон в других транзакциях - какой-то результат "творчества" их айтишников.

показать ответы
0
Автор поста оценил этот комментарий
Отошла, бл*, от компа, отдохнуть от sap чуток...
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Сочувствую...

0
Автор поста оценил этот комментарий
Ну тогда... При помощи скотча и такой то матери придётся извращаться)))
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

К тому же, скриптами пользуются, меняют их и обмениваются ими сами пользователи, а питон все учить не будут, даже если бы разрешили.

показать ответы
0
Автор поста оценил этот комментарий
Так и до python недалеко. Там проще реализовать доступ в буфер обмена
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Конечно проще. Почти чем угодно проще, блин. Но нельзя))

показать ответы
1
Автор поста оценил этот комментарий

Я всё понимаю, но получать clipboard через запуск mshta или cmd?

https://docs.microsoft.com/ru-ru/office/vba/access/concepts/...
https://docs.microsoft.com/en-us/office/vba/language/referen...

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Т.е. Вы предлагаете запустить из vbs access...

показать ответы
0
Автор поста оценил этот комментарий

Для установки через setData такой способ не подходит (М$ пофиксили возможность зачем-то), посему приходится извращаться с помощью HTA.

через cmd уже не модно или прав не хватает?

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "cmd.exe /c echo hello world | clip", 0, TRUE


Dim string

String = "text here" &chr(13)& "more text here"

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "cmd.exe /c echo " & String & " | clip", 0, TRUE


раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Не пашет.

0
DELETED
Автор поста оценил этот комментарий

в VBA можно через

activesheet.paste

буфер в ячейку листа вставить и не терять время на поиск/ вспоминание этой простыни кода

и скопировать оттуда же

cells(1,1).copy
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Это не для работы с ячейками экселя, а для произвольных приложений. Запускать экземпляр экселя для получения строки, ну такое...

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества