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

Страницы: 1
Как с помощью VBA нажать кнопку подтверждения в системном окне Win32.API
 
Вчера столкнулся со следующим.
Есть макрос, берет из списка в Эксель номер, вызывает SAP и выполняет некоторые операции, записанные саповским скрипт рекордером.
И на одной из операций выкачивается файл PDF, но вылезает системное окно подтверждения с кнопками "Open", "Save", "Cancel". Нужно программно выбрать "Save", и перейти к следующей итерации. Варианта обойти или перенастроить SAP, как понимаете, нет.  
Поиском найден вариант https://www.cyberforum.ru/visual-basic/thread802877.html,, он единственный на весь тырнет, я его утажил практически без изменений, лишь адаптировав под х64 и поменяв лишь параметр Command2 на Save
Цитата
Код
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, _
     ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const BM_CLICK = &HF5
' Кликаем по первой кнопке, она нажимает вторую кнопку программно.
Private Sub Command1_Click()
Ret = GetForegroundWindow()
hwndButt = FindWindowEx(Ret, ByVal 0&, vbNullString, "Command2") 'вместо Command2 написать реальный текст на кнопке!
PostMessage hwndButt, BM_CLICK, 0, 0
End Sub
Но  он не работает - в том смысле, что ошибок не выдает, но и нажимать ничего не нажимает.
Мне не очень понятен код, где и как он выбирает нужную кнопку.  Если  кто-нибудь мне разъяснит, что делать, в чем ошибка, буду очень благодарен коньяком.
Нужно автоматически собирать эти чертовы PDFы...,


Обновление от 24.05
Короче, нашел я, как это сделать - там целый комплекс
1. GetForegroundWindow() выдавал отнюдь не окно с текстом "File Download". hWnd какого окна выдавал - выяснять не стал.
2. Окно загрузки "File Download" искал функцией API GetWindow перебором всех окон, через функцияю GetWindowText
3. Но опять случилась засада - таких окон вываливалось аж 2. На одном из них была только одна кнопка "Cancel", а на другом находилась кнопка Save. Причем находилось то, на котором нужной кнопки не было. После долгих размышлений выбор из них осуществлять решил поиском внутри найденного окна через FindWindowEx пресловутой кнопки "Save", которая называлась.... "&Save" (мать-мать-мать Билла Гейтса)
4. Нажать кнопку Save через  PostMessage hwndButt, BM_CLICK, 0, 0 не удалось. Удалось только сделать кнопку активной. Послал туда после активации кнопки    keybd_event VK_ENTER, 0, 0, 0 Наконец-то у меня менюшка провалилась в другое меню с выбором пути сохранения.

5. Встал другой вопрос теперь - не могу найти на окне hWnd комбо-бокса, куда мне надо вставить путь. Окно нашел, кнопку "Save" нашел, а как обратиться к сомбобоксу, куда вставить имя файла? HELP!!!

Люди, ну не верю, что никто не работал с Win32.API.....

Обновление на 25.05
Так как никто не ответил, справился сам. Интернет знает все, надо только поглубже нырнуть в эту кроличью нору.
Значит, так.
Код
 a = FindWindowEx(0, ByVal &O0, vbNullString, "Save As")  ' ищу окно "Save As"    
Код
 s1 = FindWindowEx(a, ByVal &O0, vbNullString, "&Save")
subWindow = FindWindowEx(a, ByVal 0&, "DUIViewWndClassName", vbNullString)' в этом окне ищу hwnd окна класса "DUIViewWndClassName"
subWindow = FindWindowEx(subWindow, ByVal 0&, "DirectUIHWND", vbNullString)'затем в найденном окне элемент класса "DirectUIHWND"
subWindow = FindWindowEx(subWindow, ByVal 0&, "FloatNotifySink", vbNullString)'затем в найденном окне элемент класса "FloatNotifySink"
subWindow = FindWindowEx(subWindow, ByVal 0&, "ComboBox", vbNullString)'и только после этого в найденном окне элемент класса "ComboBox" 
'- эта кроличья нора невероятно глубока, и нигде нахрена не описана. Исполать тебе, чувак на stackoverflow, 3 года назад ответивший на запрос 5-летней давности  
'https://translated.turbopages.org/proxy_u/en-ru.ru.44b1acf2-628dc03e-2a272283-74722d776562/https/sta...

subWindow = FindWindowEx(subWindow, ByVal 0&, "Edit", vbNullString)'дальше все просто, находим объект combobox edit

FullPath = "C:\Users\etc\" & fName 'нужное имя
SendMessage subWindow, WM_SETTEXT, False, ByVal FullPath' посылаем туда путь
 a = FindWindowEx(0, ByVal &O0, vbNullString, "Save As")'снова находим окно и кнопку "Save" (иначе почему-то не нажимается кнопка, видимо, не активно оказывается окно)
 s1 = FindWindowEx(a, ByVal &O0, vbNullString, "&Save")
PostMessage s1, BM_CLICK, 0, 0'выбирает кнопку
PostMessage s1, BM_CLICK, 0, 0
  keybd_event VK_ENTER, 0, 0, 0'жмет Enter

Таким образом, 3 дня мучений, и мне удалось через Win32.API  из макроса прогруммно нажать внешние кнопки подтверждения скачивания файла, задать ему путь сохранения и имя.  Заявленную бутылку коньяка, к сожалению, сегодня не выиграл никто.

Изменено: kohet - 25.05.2022 10:18:22 (все вопросы решены самостоятельно, просто делюсь опытом, чтобы другие не задавали те же вопросы)
А какие есть альтернативы Excel'ю в плане политики импортозамещения? И что из них поддерживает VBA&
 
Итак, Microsoft уходит с российского рынка вместе с экселькой.
В связи с чем возникает 2 вопроса:
1. Чем его могут заменить
2. Что из них может быть автоматизировано на VBA
Просто получилось так, что много-много лет я безальтернативно просидел в Excel и на VBA, а так как работал в коммерческой структуре, то совершенно не в курсе того, чем предполагается это импортозамещать (это в основном была окологосударственная тема - госструктуры этим озадачивались, а  я работал мало того, что в коммерческих, но и импортных структурах, совершенно не касавшихся этих тем).
Подскажите, други, куда бежать? Что делать?

P.S. "Шеф, все пропало!" я уже кричал.  
Как вставить таблицу в нужное место шаблона Outlook через VBA
 
Итак, есть у меня шаблон Outlook, в котором достаточно длинная инструкция с картинками, ссылками и прочей фигней. И есть табличка Excel, в которой список задач. которые надо вставить в тело шаблона в строчку 10.
Гуглил-гуглил, и нагуглил, что в таких случаях табличку переводят в код HTML и через .HTMLbody задают тело письма этим переведенным кодом.
Это отправит в тело письма одну табличку. А как эту табличку вставить в определенную строчку готового шаблона?
Принципиально именно в шаблон вставлять, потому что у меня таких рассылок как грязи, и надоело копипастом заниматься.  
Англоязычные форумы по VBA, ссылки на англоязычные форумы
 
Приветствую всех!
Накидайте, плз, ссылки на авторитетные англоязычные форумы по VBA. А то иногда возникают неоднозначные вопросы, а в российском сегменте и спросить-то не у кого - никто так не извращается. А мир, я верю, огромный и разнообразный.  
Полоса прокрутки для CheckBox'ов
 
Доброе время суток, добрые форумчане, столкнулся с задачей - необходимо дать пользователю выбрать энное количество, причем постоянно меняющееся, вариантов значений (имена полей) в диалоговом окне. В принципе, все просто - делаются CheckBox'ы с лейблами из массива. Но их более 100 штук в каждом случае, и на юзерформу влезает только 24 штуки.Как прикрутить полосу прокрутки, которая прокручивала бы мне список этих чекбоксов? Весь интернет вычитал, ничего толкового не нашел.

Пока вариант наклевывается только один - менять Caption для всего списка в зависимости от ScrollBar.Value и потом, при обработке брать текущее значение Caption, сравнивать с массивом  таким образом, у нас получится выборка из массива, которую хочет юзер.
Но это напоминает чесание левого уха правой пяткой.
Нет ли решения попроще?
Изменено: kohet - 20.10.2020 07:38:02 (загрузил скриншот)
Ошибка при воспроизведении записанного макрорекордером создания сводной таблицы
 
Добрый вечер, коллеги, нигде толкового ответа на проблему не нашел.
Создаю отдельный лист.
Записываю макрорекордером создание сводной таблицы на отдельном листе. При воспроизведении кода даже для того же файла выдает ошибку. Полдня вычитывал Интернет, узнал про сводные таблицы много интересного, но ни черта не понял, откуда ошибка. По синтаксису - все идеально, изменения в источнике данных ничего не дают, версия Офиса - 2013. Аналогичная ошибка же возникает, когда пытаюсь сначала задать pivot cashe, а потом добавить сводную таблицу. Обойти сумел, когда создавал макрорекордером не на отдельном, а на том же листе.
Очень нужно таких таблиц насоздавать на отдельных листах много,
Изменено: kohet - 30.01.2020 21:57:18
Где брать практические задачи для VBA
 
Всем привет.
Изучаю VBA, на работе написал все, что мог, но диапазон применимости там очень узкий, и спектр задач достаточно однотипный. Учебные задачи не очень интересны, так как они абстрактны, оторваны от практики.
Встал вопрос, где бы попрактиковаться в самых разных задачах, пусть бы бесплатно, но зато на пользу  мне, и людям.
Фрилансер из меня  не очень - бываю сильно загружен по работе и дома, да и тем более спецам в VBA я не конкурент, поэтому всякие там сайты фриланса - это не вариант. Как вы решали такую проблему, поделитесь опытом.
Страницы: 1
Наверх