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

Страницы: 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, посоветуйте литературу
 
Цитата
написал:
Добрый день!

На работе начали преподавать VBA в качестве приложения к офисной работе. Увы, идет довольно туго. Посоветуйте каких-нибудь книг, где всё будет объясняться человеческим языком - с аналогиями из реального мира, с картинками. Может быть даже для школьников.
я в свое время на работу купил Нина Комолова, Елена Яковлева "Программирование на VBA в Excel", думал, коллеги захотят изучить. Хер с два.Так и унес домой. Но книжка периодически выручала, чтобы нет не серфить, там достаточно структурировано, и большое вниммание уделено визуализации данных.  
Как сделать отправку в Telegram из макроса VBA Excel, Telegram из макроса VBA Excel
 
Люди, вы что делаете? Теперь школьнички заспамят всех...
У меня сын уже попробовал в колледже бота подключить на общую рассылку (правда, на питоне), я имел неприятный разговор с директором. Но ладно, я бы понял, если бы сам написал, и от радости тестил на однокурсниках, а просто на 4PDA скачал.
Читали "Хищные вещи века" Стругацких? Вот это оно и есть.
Разделить числовое значения от общей ячейки
 
Цитата
написал:
используйте:
Код
    [URL=#]?[/URL]       1  2  3  4  5  6      Function   Weight(rg   As   Range)        Dim   re        Set   re = CreateObject(  "VBScript.RegExp"  )        re.Pattern =   "[0-9, ]+(?=г|кг)"  : re.IgnoreCase =   True        If   re.Test(rg.Value)   Then   Weight = re.Execute(rg.Value)(0)    End   Function   
 
без библиотеки может не работать
Разделить числовое значения от общей ячейки
 
Ввести вложенным циклом подсчет длины числа, проверку условия,  стоят ли буквы из справочника (Г; ГР; КГ; г; гр; кг.,) сразу после букв.
то есть, если у вас выполняется условие
Код
If IsNumeric(Mid(MyCell, i, 1)) Or Mid(MyCell, i, 1) = "," Then
тогда надо записывать в переменную-счетчик количество знаков, в которых это условие выполняется, после чего проверять, не стоит ли после i+количество знаков определенная буква.
У вас он просто встречает первую цифру и добавляет в значение функции  
Экспорт определенных строк из пдф в Excel, Нужно помощь по экспортированию
 
Цитата
написал:
Мне как раз нужен способ автоматизации этого процесса
Макросом из Excel запускаете Word, открываете PDF, ищете там нужные данные, копируете (например, в массив- так быстрей работает), вставляете. Закрываете и берете следующий.
Написать вам готовый бесплатно при условии, что вы сами над кодом не работаете и не собираетесь - ну, не знаю, имхо это штрейкбрехерство. Потому что есть разница - вы взялись самостоятельно работать, но у вас конкретные вопросы, на которые в интернете ответа не нашли (например, как найти таблицы в открытом Word'ом файле), а дрегое - если вы вывалили задачу под готовый проект малой автоматизации, за который на Яндекс услугах или в соседнем форуме деньги берут.  
Путевые листы, Автоматическое заполнение путевых листов
 
Радуют, надо сказать, люди, которые на форуме пытаются на халяву получить весь проект целиком, когда обычно за это платят деньги :)
Как подсказку могу сказать, что используйте для формул не относительные, а абсолютные адреса ячеек (т.е. в виде $A$1) для констант, и посмотрите на формулs IF (SUMIF,COUTIF и т.д.), и будет вам счастье.  
Как сохранить значения в памяти, а потом вставить за раз всё
 
Цитата
написал:
Спасибо всем большое. Но почему то при 1500 строк excel сильно задумывается.
Потому что Resize зациклено и каждый раз переопределяет массив.
Проще сразу рассчитать размер массива и просто записывать туда значения по условию.  
Вставка значения Input Box макросом другой книги
 
Добрый день, inputbox'ом ты просто присваиваешь значение какой-то переменной, не более. Открываешь другую книгу с паролем текущим макросом, берешь оттуда пароль в переменную, закрываешь и присваиваешь значение переменной напрямую, минуя Inputbox.  
Как с помощью 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 через VBA
 
Цитата
МатросНаЗебре написал:
Потом заменяете в .HTMLbody эту строку на текст с таблицей.
это как?
гугл предлагает решение просто вставить только таблицу в тело
.HTMLBody = RangetoHTML(rng)
чисто теоретически можно, если я все правильно понимаю:
а) перевести шаблон в HTML
б) загнать код шаблона в переменную
в) внутри переменной поменять PASTE_TABLE_HERE.на RangetoHTML(rng)
г) .HTMLBody =переменная

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

Дмитрий(The_Prist) Щербаков, спасибо, не знал, что у листбокса мультиселект включается.  Идея маскировать прокрутку очень занятна.  
Полоса прокрутки для CheckBox'ов
 
БМВ, там ситуация в том, что есть чертова уйма разных табличек, в которых только юзер может определить, в каом поле могут находиться нужные значения. Шапки там разные, но их все надо прочесать и сделать выборку по соответстию с группой значений. Альтернативой является только менюшка с жестким указанием номеров столбцов для каждого случая или прописывание имени столбца, но юзер первого не понимает, а во втором неизбежно наделает ошибок, что сведет всю полезность макроса к нулю.  
Полоса прокрутки для CheckBox'ов
 
Alemox, Спасибо, дельно. Сейчас попробую.
Полоса прокрутки для CheckBox'ов
 
_Igor_61, мы все сталкиваемся с одной проблемой - пользователь тупой, и делать на листе диалог выбора это однозначно вогнать его в ступор.
Тут вон написал как-то в инструкции к макросу, что значения в форме прогрузки должны быть уникальными, целая группа людей с ИНЖЕНЕРНЫМ образованием этой фразы в упор не поняла, и упорно пихала неуникальные списки, что же от него требуется, пришлось писать дополнительно создание уникального списка из предлагаемого пользователем файла. Бухгалтерия тем паче не поймет.
Полоса прокрутки для CheckBox'ов
 
Цитата
Андрей VG написал:
Поместить ваши checkboxes во Frame
А в чем разница между Frame и просто формой в этом случае? Полоса прокрутки ж точно так же обрабатывается как в рамке, так и на форме, не?
Полоса прокрутки для CheckBox'ов
 
Доброе время суток, добрые форумчане, столкнулся с задачей - необходимо дать пользователю выбрать энное количество, причем постоянно меняющееся, вариантов значений (имена полей) в диалоговом окне. В принципе, все просто - делаются CheckBox'ы с лейблами из массива. Но их более 100 штук в каждом случае, и на юзерформу влезает только 24 штуки.Как прикрутить полосу прокрутки, которая прокручивала бы мне список этих чекбоксов? Весь интернет вычитал, ничего толкового не нашел.

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

Вопрос заключается в том, что  хотете на выходе. Стать архитектором или программистом, или просто владеть инструментом.

хотелось бы владеть инструкментом, но на высоком уровне. То есть, перевести хобби в один из рабочих навыков. Это на текущей работе задач нет, а пойду на другую - там никто не будет ждать, пока я что-то там изучу или методом проб и ошибок дойду до каких-то решений.  
Где брать практические задачи для VBA
 
Цитата
Alemox написал:
Посещайте форум, смотрите темы, что интересно, внедряйтесь, спрашивайте и познавайте. Главное сами делитесь.
Ну, во-первых, я посещаю в режиме чтения год, тут какие-то обрывки задач, очень полезно, когда Уже занимаешься какой-то задачей, и ищешь решения.
Но тут-то совсем другое. Поковырять задачу от и до самостоятельно, без подпорок, потому что дьявол очень часто кроется в деталях, а здесь по-любому решение найдут раньше.
Во-вторых, это все-таки не полноценная производственная практика.  
Где брать практические задачи для VBA
 
Всем привет.
Изучаю VBA, на работе написал все, что мог, но диапазон применимости там очень узкий, и спектр задач достаточно однотипный. Учебные задачи не очень интересны, так как они абстрактны, оторваны от практики.
Встал вопрос, где бы попрактиковаться в самых разных задачах, пусть бы бесплатно, но зато на пользу  мне, и людям.
Фрилансер из меня  не очень - бываю сильно загружен по работе и дома, да и тем более спецам в VBA я не конкурент, поэтому всякие там сайты фриланса - это не вариант. Как вы решали такую проблему, поделитесь опытом.
Страницы: 1
Наверх