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

Страницы: 1
Обработка файлов *.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

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

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

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

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

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

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

Автоматизированная проверка машиночитаемых доверенностей, МЧД, 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
Формирование списка с уникальными значениями
 

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

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

Коды и регионы
 
Есть таблица с перечнем цифровых кодов регионов РФ, и названиями соответствующих регионов, около 80 пар. Сейчас данные (регионы) из этой таблицы извлекаются формулами (ВПР по коду), но уже желательно перевести такую работу в VBA.
Как лучше это реализовать и только - программно?
С помощью Select Case будет слишком громоздко, а как сделать это в программном коде нагляднее и лаконичнее?
Например массивами, просто перечислением этих пар?
Или попробовать Scripting.Dictionary?
Обработка писем в сетевой папке, извлечение данных и переименование файлов 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)
 

Вопрос по новым возможностям Excel.

Периодически приходят объемные отчеты из БД в формате xlsx и необходимо по своему списку значений производить отбор строк из него, упорядоченный по возрастанию. Интересует, в основном, только столбец отбора и пара других (заполненных) столбцов, но можно и всю строку.

Свой список находится в отдельном файле, но может быть выложен в одну папку с отчетом

Подобное, в принципе, может быть решено SQL-запросом в MS Access, но используется непрофессиональный Офис 2016.

А возможно ли данную задачу решить не макросами, а например PowerQuery?

Страницы: 1
Наверх