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

Страницы: 1
VBA - как импортировать XML программно с подключенной внешне схемой, проблемы с программным импортом XML
 
Всем доброе время суток!  Проблема следующая. Есть энное количество XML файлов, которые надо импортировать в Excel и далее их там обрабатывать.
Но есть проблема - встроенная схема предполагает, что одно поле имеет тип "integer", в результате чего 18-значное число округляет последние 3 цифры.
Но мы ж не идиоты, мы ж читаем, что в документации Мелкософтов. Так как все файлы XML однотипные, выгружаем из одного из них макросом схему:
Код
Sub save_XML_scheme()
Dim fPath As String
Dim s As String
fPath = "C:\TEMP\sc1.xsd"
s = ActiveWorkbook.XmlMaps(1).Schemas(1).XML
Open fPath For Output As #1
    Print #1, s
    Close #1
MsgBox "Схема сохранена в файл C:\TEMP\sc1.xsd "
End Sub

потом Блокнотом меняем нужный параметр на "string"
Загружаю ручками файл, выбираю "Use the XML Source task pane".  
После чего импортирую сохраненную схему и переношу поля на лист.
После чего лезу в панель разработчика и импортирую
Все получается, ОК.
Но простому пользователю (а их несколько десятков у меня) такую фигню не объяснишь и ручками делать не заставишь, даже если не выгружать схему и не править в блокноте, а сразу дать готовенькую. "Нужна кнопка, Урри!"  (с)
Вычитываем документацию еще и пишем макрос:
Код
Sub xmlImportScheme()
Dim src()
Dim schm As String
src = Application.GetOpenFilename(, , "Выберите файл .xml", , True)
schm = Application.GetOpenFilename(, , "Выберите схему", , False)
Dim a As XmlMap

For Each x In src
Workbooks.Add
ActiveWorkbook.XmlMaps.Add(schm, "DESSCC").Name = "DESSCC_Map1"
With ActiveWorkbook.XmlMaps("DESSCC_Map1")
        .ShowImportExportValidationErrors = True
        .AdjustColumnWidth = True
        .PreserveColumnFilter = True
        .PreserveNumberFormatting = True
        .AppendOnImport = True
    End With
For Each y In ActiveWorkbook.XmlMaps
If y.Name = "DESSCC_Map1" Then Set a = y
Next y
ActiveWorkbook.XmlImport Url:=x, ImportMap:=a, Overwrite:=True, Destination:=Range("$A$1")
Next x
End Sub

И тут получается фейл, потому что мало того, что файл импортируется по дефолтной схеме, на по прописанной карте DESSCC_Map1, но и значение переменной "a" меняется на текущую дефолтную схему.  На Stackoverflow вопрос про эту неведому зверушку висит третий день, его даже не смотрят.
Поиском и макрорекордером удалось найти еще способ импортировать схему - через XMLMAps
Код
ActiveWorkbook.XmlMaps("DESSCC_Map1").Import Url:=x
Но выдает ошибку, связанную c XPath. То есть, надо к ячейкам привязать как-то поля XML, а как и что делать -  понятия не имею.
PS. На Stackoverflow excel - VBA - Doesn't import XML with the customs XML scheme - Stack Overflow
Изменено: kohet - 13.10.2022 09:31:40
Как с помощью 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
Наверх