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

Страницы: 1 2 След.
Лучший парсер VBA-Json (ваше мнение)
 
Подниму старинную тему, для оценки опытными - встретился ещё компактный и универсальный пример функции парсинга JSON в VBA:
https://medium.com/swlh/excel-vba-parse-json-easily-c2213f4d8e7a

Автор отмечает быстроту работы алгоритма, и помимо прочего, возможность отфильтровывания необходимых элементов в массив (через *)
Особенность - поступающие данные JSON должны быть валидны, результат выдается как есть - преобразования типов данных функцией и экранированных символов - не производится.
В комментах, в первом сообщении - дополнительные доработки пользователей этого макроса (Function ParseArr(key$)
Как закрепить несколько строк?, возможно ли это?
 
Цитата
написал:
НО.Возможно ли както эту закрепленную строку делать динамической?
Ответ в #3 - изучен?
(а то - как в анекдоте :D )
Как закрепить несколько строк?, возможно ли это?
 
Цитата
написал:
Подскажите пожалуйста, есть ли вообще в Эселе возможность закреплять сразу несколько строк на листе.
Для разных таблиц - только если их сделать "умными", тогда при выделении внутренней ячейки в одно из них и прокрутки видимой области, наверху будет образовываться "шапка":
6. При прокрутке Таблицы вниз заголовки столбцов (A, B, C…) меняются на названия полей, т.е. уже можно не закреплять шапку диапазона как раньше
https://www.planetaexcel.ru/techniques/2/136/
Как узнать где проблема на листе и какой лист тормозит эксель?, Найти конкретно причину подвисания экселя при добавлении новых данных
 
JRO, можно попробовать лишние объекты - раз, два
Обработка файлов *.msg - с сервера Exchange и из локальной папки
 
Имеется готовый макрос обработки рассылки с сервера MS Exchange, но изредка его нужно переключать на обработку писем, уже хранящихся в локальной папке, типа C:\msg\
Как именно (и попроще) предусмотреть это в имеющемся коде - типа в таком случае "закомментировать" временно ненужные сроки и раскомментировать для локальной обработки?
Код
Public Sub MSG()
    
    Dim objOutlApp As Object, oNSpace As Object, oIncoming As Object
    Dim oIncMails As Object, oMail As Object
    Dim IsNotAppRun As Boolean
    Application.Calculation = xlCalculationManual

    On Error Resume Next
    Set objOutlApp = New Outlook.Application
    If objOutlApp Is Nothing Then ' даже к закрытому
        Set objOutlApp = CreateObject("outlook.Application")
        IsNotAppRun = True
    End If

    Set oNSpace = objOutlApp.GetNamespace("MAPI")
    Set oIncoming = oNSpace.Folders("mail@mail.ru").Folders("ПОСТУПЛЕНИЯ")   
    Set oIncMails = oIncoming.Items    
    
    Dim nn As Long
    nn = oIncMails.Count ' сколько всего пришло писем    
    If nn = 0 Then
        MsgBox "Новых писем - нет", Title:="ПОСТУПЛЕНИЯ"
        Exit Sub
    End If
    I = 1   
    Dim m As Long ' счетчик для цикла
    m = 0    
    For Each oMail In oIncMails
        m = m + 1
        Application.StatusBar = "Обработка " & m & "-го письма из " & nn
    
        ...  ' код обработки
    
'    завершение цикла по строке
    Next
    
End Sub

VBA извлечение данных из информации о документе PDF
 
Miralex,
похоже, потребуется автоматизация через Adobe Acrobat Pro
https://forum.ozgrid.com/forum/index.php?thread/1229537-copy-pdf-metadata-title-year-author-etc-into...
Логическая формула Если (и), с чего начать писать формулу с ЕСЛИ
 
Sanja,
Ок! (перепутал разделители :D)
Логическая формула Если (и), с чего начать писать формулу с ЕСЛИ
 
Sanja,
Цитата
написал:
Если внимательно присмотритесь, то увидите, что в ВПР 4 ПАРЫ значений, т.е. Таблица 4(строки) Х 2 (столбца).
Что-то все равно, не до конца понятно. :sceptic:
В формуле с ВПР, внутри фигурных скобок видно ТРИ полных пары (1:26;2:36;3:41) и два дополнительных значения (0;...;4)
=ВПР(A1;{0;1:26;2:36;3:41;4};2)
Не затруднит ли расписать эти пары (элементы "массива")? Или в оставшейся четвертой паре опущено, как необязательное, его значение?
Логическая формула Если (и), с чего начать писать формулу с ЕСЛИ
 
Sanja,
Цитата
написал:
=ПРОСМОТР(A1;{0;26;36;41};{1;2;3;4})
=ВПР(A1;{0;1:26;2:36;3:41;4};2)
Просьба поподробнее объяснить работу столь эффективной записи  :)
В этих формулах используются фигурные скобки, но вся же запись - не "формулы массива"?
С ПРОСМОТРом, через Мастер формул, более-менее понятно (четыре элемента в векторе), а почему именно так (пять значений..) конструируется формула с ВПР? А то что-то подобных примеров - не встречалось..
PQ – построчный импорт "древовидных" XML-файлов со всеми данными, Power Query, XML, вложенные теги
 
AlienSx,
Спасибо, ошибок при импорте рабочих XML - теперь нет :)  
PQ – построчный импорт "древовидных" XML-файлов со всеми данными, Power Query, XML, вложенные теги
 
AlienSx, здорово - солидный, структурированный код! :)

Но при прогоне на реальных файлах обнаружилась проблема, приводящая к ошибкам и пустым строкам в итоговом файле..
Как удалось определить, в некоторых XML могут отсутствовать отдельные теги, которые есть в других файлах - например <ObjectLocationExtraText>, который описывает дополнительную часть адреса.

Как будет лучше дополнить код обработчиком подобных ошибок?

PQ – построчный импорт "древовидных" XML-файлов со всеми данными, Power Query, XML, вложенные теги
 

Просьба посоветовать, как правильно создать запрос в Power Query для извлечения данных из большего количества однотипных XML-файлов.

Проблема заключается в том, что структура XML - "древовидная", данные в подтегах в <SectorList>, <FreqList> и <Condition> - "разветвляются", что при простом импорте приводит к "распуханию" итоговой таблицы, когда итоговое количество строк значительно превышает количество файлов…

Чтобы этого избежать, хотелось бы сделать так, чтобы все данные из повторяющихся тегов объединялись в одну соответствующую ячейку - например, через ";”

Для последующего анализа также полезно подсчитывать число таких тегов (например, по SectorID, FreqID, Position) и выводить их количество в соответствующие колонки.

Просьба помочь с M-кодом, т.к. похоже, через интерфейс редактора PQ такого уже не сделать..

сбор данных из гет запроса
 
Evgpetr,
например - https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=5&TID=120909&a...
Значение после определенного символа, требуется получить конкретное значение из последовательности данных
 
matfaker,
Есть и совсем простой (ленивый) способ - "Мгновенное заполнение": https://www.planetaexcel.ru/techniques/7/7751/
Правда, надо применять с осторожностью, но на представленном примере - срабатывает 8)
Обойти ограничение в 255 полей при слияние Ворда И экселя
 
levkaster97, как вариант - через CSV-файл:
https://techcommunity.microsoft.com/t5/excel/how-to-do-a-mail-merge-with-more-than-255-columns/m-p/7...
Автоматизированная проверка машиночитаемых доверенностей, МЧД, m4d
 
В общем, удалось разобраться - преодолевать защиту не понадобилось, нужно было передавать в Заголовках ApiKey, возвращаемый сайтом - он постоянный (отчего так сейчас и насколько продлится - вопрос, но - работает))

Успелось все вовремя :)
https://www.nalog.gov.ru/rn11/news/activities_fts/15170287/  
Р7 офис, Импортозамещение аналог excel
 
Feltor,
На тему - сегодняшняя статья: Создание первого макроса JavaScript для табличного редактора Р7 офис / Хабр (habr.com)
Но на сабжевый вопрос - направляют на Вводный курс Оглавление (r7-consult.ru)
Автоматизированная проверка машиночитаемых доверенностей, МЧД, m4d
 
После анализа по F12 и обращения на https://m4d.nalog.gov.ru/api/v1/poar-portal/get_info_short?dovelGuid=f0489fd5-8afa-45d0-bfd5-d062113... пока получается ответ Api Key was not provided
Изменено: LKN - 31.10.2024 23:07:26
Автоматизированная проверка машиночитаемых доверенностей, МЧД, m4d
 
Нужно периодически проверять перечни машиночитаемых доверенностей (МЧД) на сайте ФНС РФ: https://m4d.nalog.gov.ru/emchd/get-info
Сейчас это делается вручную, но хотелось бы автоматизировать процесс.
Сделана попытка реализации через стандартный XMLHTTP, однако все дело стопорится на защите этого сайта...
Есть ли возможность возможность её обойти и продолжить передавать запросы/получать данные методами Msxml2.ServerXMLHTTP/WinHttp.WinHttpRequest.5.1/Msxml2.ServerXMLHTTP ?
Код
Sub SendHTTPRequest()
    
    Dim httpReq As Object
    Set httpReq = CreateObject("MSXML2.XMLHTTP")

    httpReq.Open "GET", "https://m4d.nalog.gov.ru/emchd/get-info/data", False

    httpReq.setRequestHeader "Content-Type", "application/json"

    httpReq.Send

    If httpReq.Status = 200 Then
        Debug.Print httpReq.responseText
    Else
        Debug.Print "Ошибка: " & httpReq.Status
    End If
    
    Set httpReq = Nothing
    
End Sub
узнать код цвета ярлычка страницы
 
Хорошее объяснение по ColorIndex  :)  http://dmcritchie.mvps.org/excel/colors.htm
Формирование списка с уникальными значениями
 
Евгений Смирнов,
Благодарю! Только немного подправил под себя - т.к. используется умная таблица, то объявил диапазон как ListObjects("Таблица1").ListColumns("e-mail").DataBodyRange, чтобы счётчик - с единицы

Уточнение по коду - вызов функции удаления пробелов VBA.Trim обязательно делать с полным указанием (Application.Trim/Application.WorksheetFunction.Trim)? Вроде и без них - работает?

Павел \Ʌ/,
С новыми функциями - здорово, но в использовании - только 16й

Однако, как выясняется, в новых версиях Excel и команды соответствующее в VBA ещё появляются: https://stackoverflow.com/a/67053675
Формирование списка с уникальными значениями
 

Требуется периодически рассылать данные по соответствующим адресам электронной почты. Сейчас эта задача вручную решается пользователями так – копируется столбец с e-mail в Word, делается замена разделителя ";" на абзац, увеличившийся список в Excel через "Удалить дубликаты" делается уникальным, и затем снова в Word делается замена абзаца на ";" и итоговый список используется для отправки письма в Outlook адресатам без дублей.

А как правильнее решить эту задачу в VBA?

Коды и регионы
 
Цитата
написал:
таблица, а у нас нету
Таблицу не стал прикладывать, т.к. она стандартная, с двузначным кодом ГИБДД

БМВ, спасибо, поизучаю примеры с библиотеками.

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

И дополнительно - эта задача содержит описания связей "один-к-одному". Потом понадобится описывать региональную структуру (федеральное и областное деление) типа "многие-к-одному" - несколько кодов к одному названию.
Каким методом лучше это делать в VBA? Пока - думаю про Select Case, записывая нужные группы кодов через запятую.
Коды и регионы
 
Есть таблица с перечнем цифровых кодов регионов РФ, и названиями соответствующих регионов, около 80 пар. Сейчас данные (регионы) из этой таблицы извлекаются формулами (ВПР по коду), но уже желательно перевести такую работу в VBA.
Как лучше это реализовать и только - программно?
С помощью Select Case будет слишком громоздко, а как сделать это в программном коде нагляднее и лаконичнее?
Например массивами, просто перечислением этих пар?
Или попробовать Scripting.Dictionary?
Обработка писем в сетевой папке, извлечение данных и переименование файлов msg
 
Кстати, из отмеченного - обнаружилось, что при дальнейшей пересылке переименованных файлов *.msg через клиент Outlook, имена приаттаченых файлов обретают свой прежний вид! 8-0  (похоже, они извлекается из свойств самих фалов)
Поэтому приходится их архивировать, чтобы получатели, распаковав, видели новые имена и не удивлялись обыденности при простом вложении  :)  
Обработка писем в сетевой папке, извлечение данных и переименование файлов msg
 
Разобрался - оказалось легко!
Код
'        ПЕРЕИМЕНОВАНИЕ
        On Error Resume Next
        Name inPath & thisFile As inPath & ws.Cells(i, 2) & ".msg"
Но интересен совет гуру про регулярку и в целом, по коду :)  
Обработка писем в сетевой папке, извлечение данных и переименование файлов msg
 
После подписки на сервис ежедневных сообщений, необходимо обрабатывать поступающее в Outlook - определять содержащийся в теле каждого письма номер, с последующим анализом полученного и пересылкой отобранных групп писем, как вложений, конкретным адресатам.

Пока задача решается так - все письма за сутки копируются в сетевую папку и затем обрабатываются адаптированным макросом в Excel.

Но все письма в приходящей рассылке имеют одинаковую "Тему", и весьма желательно переименовывать сохранённые *.msg в извлечённый регуляркой номер (myStr2)

И дополнительно - в каждом письме находится только один искомый номер - т.е. не обязательно в регулярке перебирать всю коллекцию For Each myStr1 In myObj ? И в завершение, обнулять объект RegExp требуется?

Код
Option Explicit
'   https://stackoverflow.com/a/35296933

 Sub importMsg()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.DisplayAlerts = False

    Dim i As Long
    Dim inPath As String
    Dim thisFile As String
'    Dim Msg As MailItem
    Dim ws As Worksheet
'    Dim myOlApp As Outlook.Application
    Dim myOlApp As Object ' Object/Application
'    Dim MyItem As Outlook.MailItem
    Dim MyItem As Variant ' Variant/Object/MailItem

    Set myOlApp = CreateObject("Outlook.Application")
    Set ws = ThisWorkbook.Worksheets(1)

    With Application.FileDialog(msoFileDialogFolderPicker)
       .AllowMultiSelect = False
            If .Show = False Then
                Exit Sub
            End If
        On Error Resume Next
        inPath = .SelectedItems(1) & "\"
    End With
    thisFile = Dir(inPath & "*.msg")
    i = 4

    Sheets(1).Cells.Clear

    Do While thisFile <> ""
        Set MyItem = myOlApp.CreateItemFromTemplate(inPath & thisFile)
        ws.Cells(i, 1) = MyItem.Body
        
'        -----извлечение номера-----
        Dim myRegExp As Object, myObj As Object, myStr1 As Object
        Dim msgText As String, myStr2 As String
        msgText = ws.Cells(i, 1)
        Set myRegExp = CreateObject("VBScript.RegExp")
        With myRegExp
            .Global = True
            .Pattern = "\d{2}\s\d{2}\s[№]\s\d{5,6}"
            Set myObj = .Execute(msgText)
        End With
        For Each myStr1 In myObj
            myStr2 = myStr1.Value
        Next myStr1
        ws.Cells(i, 2) = myStr2
        
'Как здесь переименовывать каждый *.msg в имя из ws.Cells(i, 2) = myStr2?

        i = i + 1
        thisFile = Dir()
    Loop

    Sheets(1).UsedRange.Columns.AutoFit

    Set MyItem = Nothing
    Set myOlApp = Nothing

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True
End Sub
Отбор строк из таблицы (без VBA)
 
Антон,
Спасибо - работает! Буду, не торопясь, разбираться, как именно - отлаживая под свои условия :)

(Такой уровень владения языком M приходит только с опытом, или и через меню редактора PQ аналогичного добиться можно?)
Отбор строк из таблицы (без VBA)
 
Alien Sphinx,
Присвоил своей таблице (через диспетчер имен) название Source, но другая ошибка синтаксиса - первая скобка, "Ожидается токен Equal"
Другие подсказки пока не знаю,  как применить :sceptic:
Код
let
    Источник = Excel.Workbook(File.Contents("C:\Users\1\Desktop\Пример отчета.xlsx"), null, true),
    Лист1_Sheet = Источник{[Item="Лист1",Kind="Sheet"]}[Data],
    #"Повышенные заголовки" = Table.PromoteHeaders(Лист1_Sheet, [PromoteAllScalars=true]),
    #"Измененный тип" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"Отчет ", type any}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}, {"Column10", type text}, {"Column11", type text}, {"Column12", type text}, {"Column13", type text}, {"Column14", type text}, {"Column15", type text}, {"Column16", type text}, {"Column17", type text}, {"Column18", type text}, {"Column19", type text}, {"Column20", type text}, {"Column21", type text}, {"Column22", type text}, {"Column23", type text}, {"Column24", type text}, {"Column25", type text}, {"Column26", type text}, {"Column27", type text}, {"Column28", type text}, {"Column29", type text}, {"Column30", type text}, {"Column31", type text}}),
    #"Удаленные верхние строки" = Table.Skip(#"Измененный тип",1),
    #"Повышенные заголовки1" = Table.PromoteHeaders(#"Удаленные верхние строки", [PromoteAllScalars=true]),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Повышенные заголовки1",{{"столбец1", type any}, {"столбец2", type text}, {"столбец3", Int64.Type}, {"столбец4", type text}, {"столбец5", type text}, {"столбец6", type text}, {"столбец7", type text}, {"столбец8", type text}, {"столбец9", type text}, {"столбец10", type text}, {"столбец11", type text}, {"столбец12", type text}, {"столбец13", type text}, {"столбец14", type text}, {"столбец15", type text}, {"столбец16", type text}, {"столбец17", type text}, {"столбец18", type text}, {"столбец19", type text}, {"столбец20", type text}, {"столбец21", type text}, {"столбец22", type text}, {"столбец23", type text}, {"столбец24", type text}, {"столбец25", type text}, {"столбец26", type text}, {"столбец27", type text}, {"столбец28", type text}, {"столбец29", type text}, {"столбец30", type text}, {"столбец31", type text}}),
    #"Удаленные нижние строки" = Table.RemoveLastN(#"Измененный тип1",11),
    Table.SelectRows(Source, (x)=> List.IsEmpty(List.RemoveMatchingItems({x[столбец3]}, {"11","1011","20501"})))
in
    #"Удаленные нижние строки"
Отбор строк из таблицы (без VBA)
 
Антон,
Начал пробовать с M в PowerQuery, но получил ошибку синтаксиса "Ожидался токен Comma" в Table.Select
Код
let
    Источник = Excel.Workbook(File.Contents("C:\Users\1\Desktop\Пример отчета.xlsx"), null, true),
    Лист1_Sheet = Источник{[Item="Лист1",Kind="Sheet"]}[Data],
    #"Повышенные заголовки" = Table.PromoteHeaders(Лист1_Sheet, [PromoteAllScalars=true]),
    #"Измененный тип" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"Отчет ", type any}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}, {"Column10", type text}, {"Column11", type text}, {"Column12", type text}, {"Column13", type text}, {"Column14", type text}, {"Column15", type text}, {"Column16", type text}, {"Column17", type text}, {"Column18", type text}, {"Column19", type text}, {"Column20", type text}, {"Column21", type text}, {"Column22", type text}, {"Column23", type text}, {"Column24", type text}, {"Column25", type text}, {"Column26", type text}, {"Column27", type text}, {"Column28", type text}, {"Column29", type text}, {"Column30", type text}, {"Column31", type text}}),
    #"Удаленные верхние строки" = Table.Skip(#"Измененный тип",1),
    #"Повышенные заголовки1" = Table.PromoteHeaders(#"Удаленные верхние строки", [PromoteAllScalars=true]),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Повышенные заголовки1",{{"столбец1", type any}, {"столбец2", type text}, {"столбец3", Int64.Type}, {"столбец4", type text}, {"столбец5", type text}, {"столбец6", type text}, {"столбец7", type text}, {"столбец8", type text}, {"столбец9", type text}, {"столбец10", type text}, {"столбец11", type text}, {"столбец12", type text}, {"столбец13", type text}, {"столбец14", type text}, {"столбец15", type text}, {"столбец16", type text}, {"столбец17", type text}, {"столбец18", type text}, {"столбец19", type text}, {"столбец20", type text}, {"столбец21", type text}, {"столбец22", type text}, {"столбец23", type text}, {"столбец24", type text}, {"столбец25", type text}, {"столбец26", type text}, {"столбец27", type text}, {"столбец28", type text}, {"столбец29", type text}, {"столбец30", type text}, {"столбец31", type text}}),
    #"Удаленные нижние строки" = Table.RemoveLastN(#"Измененный тип1",11)
    Table.SelectRows(Source, (x)=> List.IsEmpty(List.RemoveMatchingItems({x[столбец3]}, {"11","1011","20501"})))
in
    #"Удаленные нижние строки"
Страницы: 1 2 След.
Наверх