powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Автоматическое чтение данных документов Excel из почты
12 сообщений из 12, страница 1 из 1
Автоматическое чтение данных документов Excel из почты
    #39739495
net_Alex_tut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Помогите пожалуйста со скриптом VB, который
1. перебирает почтовые сообщения (по Subject, имени Excel документа в скрепке)
2. найдя нужные параметры читает данные из оперделенной ячейки Excel документа (который в скрепке)
3. складывает эти данные в другой документ Excel

Спасибо
С уважением
Алексей
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39739544
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
net_Alex_tut,

Начните с :
Outlook.MAPIFolder

GetDefaultFolder(olFolderInbox)

For Each Item In olFolder.Items

TypeOf Item Is Outlook.MailItem
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39739651
net_Alex_tut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
big-duke,

спасибо за ответ
и данный совет
я погуглю

буду также признателен если дадите ссылки на готовый скрипт похожий на то что я перечислил

сам программированием давно не занимюсь
по работе возникла необходимость обработать данные
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39740422
net_Alex_tut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
net_Alex_tut,

Разобрался
Написал скрипт
Все работает :
Ищутся непрочтенные письма по теме и типу приложения выбираются аттач и читаются данные
после прочтения данных сообщение помечается как прочитанное

два но:
1) при небольшом количестве непрочтенных сообщений - 6-15 при общем колве в инбох около 300-400 работает норм
если же количество непрочтенных 30-60 начинаются глюки- перескакивает через пачку сообщений в результате куски сообщений нерочтенные
приходится по нескольку раз запускать чтобы все сообщения перебрались
в чем тут дело ?
2) для чтения из эксель файла - аттачмента его нужно открыть что занимет время особенно если док эксель большой
можно ли без открытия эксель файла из него читать данные ?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
Const olFolderInbox As Integer = 6
'~~> Path for the attachment
Const AttachmentPath As String = "e:\temp\"


Sub DORscan_1()
    Dim oOlAp As Object, oOlns As Object, oOlInb As Object
    Dim oOlItm As Object, oOlAtch As Object
    Dim wb As Workbook
    Dim i As Integer
    i = 1
    Dim value As Variant
    Dim value1 As Variant
    Dim value2 As Variant
    Dim value3 As Variant
    Dim value4 As Variant
    Dim value5 As Variant
    
    Dim v_date As String
        
    '~~> New File Name for the attachment
    Dim NewFileName As String
    NewFileName = AttachmentPath & "test1.xls"

    '~~> Get Outlook instance
    Set oOlAp = GetObject(, "Outlook.application")
    Set oOlns = oOlAp.GetNamespace("MAPI")
    Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox)

    '~~> Check if there are any actual unread emails
    If oOlInb.Items.Restrict("[UnRead] = True").Count = 0 Then
        MsgBox "NO Unread Email In Inbox"
        Exit Sub
    End If

    '~~> Extract the attachment from the 1st unread email
    For Each oOlItm In oOlInb.Items.Restrict("[UnRead] = True")

    
        '~~> Check if the email actually has an attachment
        sSubj = oOlItm.Subject
        If Left(sSubj, 9) = "WD/CD DOR" Then
            If oOlItm.Attachments.Count <> 0 Then
                For Each oOlAtch In oOlItm.Attachments
                           
                        If Left(Right(oOlAtch.Filename, 5), 4) = ".xls" And Left(oOlAtch.Filename, 2) = "WD" Then
                            '~~> Download the attachment
                            oOlAtch.SaveAsFile NewFileName
                            Set wb = Workbooks.Open(NewFileName, UpdateLinks:=0)
                            i = i + 1
                            
                            Sheets("WDDP-A Daily Highlight").Select
                            
                            v_date = Range("L4")
                            value = Range("E33")
                            value1 = Range("E34")
                            
                            
                            Windows("WD DOR.xlsm").Activate
                            Sheets("list1").Select
                            Cells(i, 1).value = v_date
                            Cells(i, 2).value = value
                            Cells(i, 3).value = value1
                            
                            If i = 30 Or i = 100 Or i = 200 Or i = 300 Or i = 400 Then
                                ActiveWorkbook.Save
                            Else
                            End If
                            Application.DisplayAlerts = False
                            Workbooks("test1.xls").Close SaveChanges:=False
                            
                            
                            Else
                           ' MsgBox "attachment is not excel"
                        End If
                        'Exit For
                 Next
            Else
                'MsgBox "The First item doesn't have an attachment"
            End If
        Else
        End If
    
        
        oOlItm.UnRead = False
        'DoEvents
        'oOlItm.Save
    
    
    Next
         
 End Sub

Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39740454
net_Alex_tut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
модератору

эх нэкогда ! :)
посовнтуйте лучше :)
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39740978
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
относительно перескакивания - это известная фича оутлуковской объектной модели: когда считываете только непрочитанные, за время пробега цикла часть сообщений могут стать прочитанными, плюс прийти новые. Поэтому коллекция oOlInb.Items бывает динамически меняется на ходу (до окончания цикла).
Код: vbnet
1.
2.
'~~> Extract the attachment from the 1st unread email
    For Each oOlItm In oOlInb.Items.Restrict("[UnRead] = True")



Надёжный способ - вычитать коллекцию перед for-each - т.е. сделать "снимок" в отдельную переменную. И по нему уже крутить цикл.
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39740993
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и в плане производительности - не лучшее решение открывать-закрывать книгу на каждом обороте цикла по аттачам.

Почему бы сначала в цикле не сгрузить все аттачи (можно в массив копить ссылки), а потом после него 1 раз их просканировать и консолидировать в общую книгу?

Тем более, что у вас там походу простая поколоночная сборка - можно вообще в итоговой книге формулами связи собрать, а не тратить ресурсы на обработку "открой книгу-скопируй 3 цифры-закрой книгу".
Код: vbnet
1.
2.
3.
4.
5.
                            
Sheets("list1").Select
Cells(i, 1).value = v_date
Cells(i, 2).value = value
Cells(i, 3).value = value1
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39743379
net_Alex_tut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate,

спасибо за ответ

можете пример скрипта кинуть
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39743982
net_Alex_tut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate,

насчет непрочитынных которые в ходе цикла становятся прочитанными и типа поэтому не читаются

так когда я по нескольку раз скрипт запускаю то все непрочитанные дочитываются

Вообщем покажите пожалуйста как
" вычитать коллекцию перед for-each - т.е. сделать "снимок" в отдельную переменную. И по нему уже крутить цикл."
скрипт пожалуста


насчет
"грузить все аттачи (можно в массив копить ссылки), а потом после него 1 раз их просканировать и консолидировать в общую книгу? "
когда аттачей более 300 ? книга станет оооочень большая
Подскажите лучше как считывать даные с книги не открывая ее
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39744395
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
net_Alex_tutвычитать коллекцию перед for-each - т.е. сделать "снимок" в отдельную переменную. И по нему уже крутить цикл."


dim snimok as Outlook.MailItems
Outlook.MAPIFolder
GetDefaultFolder(olFolderInbox)
set snimok = olFolder.Items 'снимок (коллекция писем)
For Each Item In snimok
...

net_Alex_tutПодскажите лучше как считывать даные с книги не открывая ее

Разные варианты:
1 вариант - Формулами связей ессно. Откройте две книги, напишите формулу "=" и кликните мышкой в ячейку соседней книги, потом закройте соседнюю книгу. Увидите полный текст формулы ссылки, чтото типа ='путь\имясоседнейкниги.xls![Лист1]$A$1'.
Вот в сводной книге можно макросом пробивать такие формулы ссылок, они вытянут из принятых почтой книг в сводную значения, не открывая книги. Потом заменять их на значения через
Range.Copy
Range.Pastespecial xlpastevalues
application.cutcopymode=false

Это хорошо работает, если исходные книги имеют статичную структуру (фиксированное кол-во строк и столбцов). А если у них ещё и имена файлов унифицированы (т.е. в почту шлют правильно прокодированные файлы одинаковой структуры, у которых в названии закодирован отправитель), - то можно вообще динамически текст формулы связи собирать формулой СЦЕПИТЬ() и оборачивать её формулой ДВССЫЛ(). Тогда формула в сводной таблице будет сама тянуться в нужный файл, который из почты сложится в каталог обработки.

2 вариант - штатным экселевским инструментом "Консолидация". Особенно когда файлы одинаковые по структуре.

3 вариант - через query (кодится вызов объекта QueryTable). Там можно наворотить очень сложные правила отбора из исходных книг (и он очень шустро работает на книгах большого объёма 10-50000 позиций), т.к. сводная экселина к экселине обращается не поячеечно, а как к таблице базы данных, через специальный диалект SQL. Там можно условия WHERE наворотить в полстраницы текста. Но там свои грабли, если исходные книги плохо структурированы, или если в одной колонке вперемешку числовые и текстовые значения лежат.
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39747692
net_Alex_tut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate,

Спасибо большое за совет и за Ваше время!
Осталось мне найти время и поэксперементировать :)
...
Рейтинг: 0 / 0
Автоматическое чтение данных документов Excel из почты
    #39747700
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ползи улитка на вершину фудзи :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Автоматическое чтение данных документов Excel из почты
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]