Поиск текста во вложениях - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу найти «string = my_string» в моих вложениях в папке «Входящие» outlook. Если эта «строка» существует, я хочу, чтобы письма перемещались в другую папку. Я нашел код, я пытался улучшить его, но он все еще не работает. Любая помощь будет высоко ценится.

EDIT Вот код:

 Sub test2()
 Const strFindText As String = "Completed"
 Const strFileType As String = "xlsx|xls"
 Const strPath As String = "C:\Users\PC2\Documents\Georg\Attachment\"
Dim vFileType As Variant
 Dim strFilename As String
 Dim strName As String
 Dim olItems As Outlook.Items
 Dim olItem As Outlook.MailItem
 Dim wb As Object
 Dim xlApp As Object
 Dim olAttach As Outlook.Attachment
 Dim strFolder As String
 Dim bStarted As Boolean
 Dim bFound As Boolean
 Dim i As Long, i_V As Long
Dim fdObj As FileSystemObject
    Set fdObj = CreateObject("Scripting.FileSystemObject")

    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    If Err Then
        Set xlApp = CreateObject("Excel.Application")
        bStarted = True
    End If
    On Error GoTo 0
    xlApp.Visible = True

If Not fdObj.FolderExists(strPath & strFindText) 
 Then fdObj.CreateFolder strPath & strFindText
End If

Set olItems = Session.GetDefaultFolder(olFolderInbox).Items
For i = olItems.Count To 1 Step -1
   Set olItem = olItems(i)
   If olItem.Attachments.Count > 0 Then
   vFileType = Split(strFileType, "|")
   For Each olAttach In olItem.Attachments
   For i_V = 0 To UBound(vFileType)
   If Right(LCase(olAttach.FileName), Len(vFileType(i_V))) = vFileType(i_V)
 Then strFilename = strPath & 
 Format(olItem.ReceivedTime, "yyyymmdd-HHMMSS") & _" " & olAttach.FileNameolAttach.SaveAsFile strFilename

    Set wb = xlApp.Workbooks.Open(strFilename)
    With xlApp.Find(strFilename, xlValues, xlWhole)
        bFound = False
    Do While .Find(strFindText).Activate    '<-I have problem here
        bFound = True
    Loop
    strName = wb.Name
    wb.Close 0
        If bFound Then
        Name strFilename As strPath & strFindText & "\" & strName
        End If
    End With
End If
Next i_V
Next olAttach
End If

Next i
    If bStarted Then xl.App.Quit
    Set wb = Nothing
    Set xlApp = Nothing
    Set olItem = Nothing
    Set olItems = Nothing
End Sub

1 Ответ

1 голос
/ 24 апреля 2019

Я быстро взглянул на ваш код и заметил ошибку, поэтому сообщил об этом в комментарии. Затем я заметил еще одну ошибку и еще одну, о которой я сообщил в комментарии. Только после публикации комментария я задумался о том, какой смысл будет иметь мой комментарий для автора этого кода. Этот ответ является увеличенной версией комментария. Это должно помочь вам улучшить ваш код, но слишком много не хватает, чтобы дать полный ответ.

  1. В Set wdApp = GetObject(, "Excel.Application"), wdApp - это имя, данное приложению Word. Я предполагаю, что вы нашли какой-то код, который использовал Word, чтобы что-то сделать, и адаптировали его. Set wdDoc = wdApp.Documents.Open(strFilename) недопустимо для приложения Excel. Я предлагаю использовать имя xlApp. Книга откроется, и код поиска необходимо будет переписать для Excel.

  2. Вы не включили код для FolderExists и CreateFolders, но я был бы удивлен, если бы они не использовали FileSystemObject. И FileSystemObject, и Outlook имеют тип данных Folder. Если весь этот код находится в Outlook, Folder интерпретируется как Outlook.Folder, а FolderExists и CreateFolders могут не работать. При необходимости вам необходимо заменить тип данных Folder в этих подпрограммах на Scripting.Folder.

  3. Set olItems = Session.GetDefaultFolder(olFolderInbox).Items не работает в моей системе. Я домашний пользователь с двумя адресами электронной почты, каждый из которых имеет собственный магазин и папку «Входящие». Входящие по умолчанию не используются. Если вы являетесь корпоративным пользователем с одним адресом электронной почты, то вашим почтовым ящиком по умолчанию, скорее всего, будет именно тот, который вам нужен.

  4. Вы пишете: «Если эта« строка »существует, я хочу, чтобы письма перемещались в другую папку». Я истолковал это как означающее, что вы хотите переместить Outlook MailItem в другую папку Outlook. Вот почему я критиковал вас за использование Name, который переименовывает файл диска или перемещает его в другую папку диска с, возможно, новым именем. Интересно, вы хотели переместить сохраненное вложение?

  5. Для этого ответа нужен параграф, объясняющий, как переместить MailItem или переместить сохраненное вложение в зависимости от того, что вам нужно. Пожалуйста, добавьте комментарий к этому ответу, объясняя, что вы хотите.

  6. В Const strPath As String = " my_root " я ценю, что «my_root» - это просто заполнитель, поэтому вам не нужно раскрывать что-то, что может быть конфиденциальным. Предположим, что истинное значение - «C: \ Users \ Georg \ Documents». Если это так, вы создаете путь «C: \ Users \ Georg \ Documentsmy_string». Если истинное значение - «C: \ Users \ Georg \ Documents \», вы создаете путь «C: \ Users \ Georg \ Documents \ my_string». В любом случае вы предполагаете, что истинное значение «my_string» не содержит символов, которые недопустимы в имени папки. Я не понимаю, почему вам нужно имя папки, чтобы включить строку поиска. Это просто временная папка для использования при тестировании вложений. Почему бы не назвать его «C: \ Users \ Georg \ Documents \ SavedAttachments» или другой временной папкой?

  7. Пожалуйста, будьте осторожны, разделяя имена папок и файлов. Вы используете Chr(32) и Chr(92). Я полагаю, Chr(32) является ошибкой. Почему бы не написать «\» вместо Chr(92), что намного понятнее? Я использую Chr() когда это необходимо, но обычно написание символа более четкое. Любой, кто использовал File Explorer, знает о «\», но сколько знает, что означает Chr(92), не просматривая его.

  8. Я не понимаю сложного имени файла, которое вы даете сохраненным вложениям. Если вложение необходимо переместить в другую папку с другим именем. Если вложение не требуется, вы должны удалить его, используя Kill. В любом случае некоторые простые. Все, что вам нужно - это фиксированное имя файла.

  9. Знаете ли вы, как найти в рабочей книге определенную строку? Весь ваш существующий код предназначен для открытия и поиска документов Word.

Я пронумеровал свои абзацы, чтобы вы могли легко ссылаться на них, если вам нужно задать вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...