2015-07-30 5 views
2

У меня есть письма, как это:Найти "возврат каретки" в mail.body

Здравствуйте,

Пожалуйста, обратите внимание, мы сделали ... на 16h15

проделанных действий: Перестройка и т.д.

искренне

Г-н

Действия изменяются в каждой почте, и я хочу, чтобы вставить действие в свой Excel. Проблема в том, что я не знаю, как получить «возврат каретки» (idk, если это правильное имя, это то, что мне передало). Что я нахожу в Интернете, так это то, что vbLfChr(10) - это «возврат каретки». То, что я пытался это найти начало:

TechnicPosition= InStr(1, .Body, "Actions done: ") 
TechnicAction= Mid(.Body, TechnicPosition, 14) ' first char from the action 

Но я не могу получить последний символ (первая «возврат каретки» из TechnicAction). Я пробовал много вещей, таких как: InStr(TechnicPosition, .Body, vbCrLf)

Мой вопрос: как получить предложение, которое начинается от слова до «возврата каретки» (первое, что приходит после начального слова)?

+0

Это просто линия подачи, используйте 'vbLf' вместо' 'vbCrLf' –

+0

vbLf' или 'Chr (10)' = Line Feed, 'vbCr' или' Chr (13) '= Возврат каретки,' vbCrLf' = Возврат каретки и подача строки –

+0

Я попробовал их все, прежде чем я спросил. Все они возвращают весь конец почтового ящика. – Slingr

ответ

3

carriage return в основном корпусе электронной почты vbNewline

Это, как я обычно делаю это

Sub Sample() 
    Dim sBody As String 
    Dim MyAr 
    Dim i As Long 

    ' 
    '~~> Rest of your code 
    ' 

    sBody = oMail.Body 

    '~~> For testing purpose 
    'sBody = "Hello," & vbNewLine & vbNewLine 
    'sBody = sBody & "Please note we did ... at 16h15" & vbNewLine & vbNewLine 
    'sBody = sBody & "Actions done: Rebuilding etc" & vbNewLine & vbNewLine 
    'sBody = sBody & "Sincerely" 

    '~~> Split the email body on vbnewline and store it in array 
    MyAr = Split(sBody, vbNewLine) 

    '~~> Loop through array 
    For i = LBound(MyAr) To UBound(MyAr) 
     '~~> Check if the line has "Actions done:" 
     If InStr(1, MyAr(i), "Actions done:") Then 
      '~~> This would give you "Rebuilding etc" 
      '~~> Split the line on "Actions done:" 
      '~~> You will get an array. Ar(0) will have "Actions done:" 
      '~~> And Ar(1) will have what you are looking for so we use 
      '~~> Split()(1) directly to access that item 
      MsgBox Split(MyAr(i), "Actions done:")(1) 
      Exit For 
     End If 
    Next i 
End Sub 

Редактировать

ANOTHER WAY

+0

Я не понимаю, что вы здесь сделали, но работает отлично. Большое спасибо: D – Slingr

+0

Я добавил объяснение :) Еще если у вас есть путаница, просто спросите :) –

+0

Я не понимаю, почему в конце 'Split' есть' (1) '. PLUS, так важно установить все 'set' в' nothing' в конце? – Slingr

0

Попробуйте это:

TechnicPosition = InStr(1, .Body, "Actions done: ") 
TechnicEndPosition = InStr(TechnicPosition, .Body, Chr(10)) 
TechnicAction = Mid(.Body, TechnicPosition + 14, TechnicEndPosition - TechnicPosition - 14) 
+0

Он все еще не находит «возврат каретки» – Slingr

+0

Это способ увидеть весь символ в письме (чтобы увидеть, как закодирован возврат каретки) – Slingr

+0

Добавьте это в свой код: 'Для i = 1 To Len (. Body): Debug.Print "[" & i & "]:" & Mid (.Body, i, 1) & "(Asc:" & Asc (Mid (.Body, i, 1)) & ")": Далее i'. Он напечатает все символы в окне Immediate. – mielk

0

Петля через тело, чтобы увидеть, что персонаж:

For i = 1 To Len(.Body) 
    If Not Mid(.Body, i, 1) Like "[A-Za-z0-9,'?!"".:]" Then 
     Debug.Print Asc(Mid(.Body, i, 1)) 
    End If 
Next 

После того, как вы нашли значение Asc(), разделить тело на него, и возвращают второй индекс:

TechnicAction = Split(.Body, Asc(10))(1) '// Or whatever Asc() is required 
+0

Это дает мне 'Invalid pattern string (Ошибка 93) '... – Slingr

+0

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

Смежные вопросы