替换电子邮件正文

时间:2016-04-13 07:27:08

标签: vba email outlook

我在电子邮件中有一些点数跟他们有关。问题在于它们在电子邮件中下降:6。5. 4. 3. 2. 1. - 首先问好后是6. 5. 4. 3. 2. 1.但并非总是如此,有时仅为3或4或者其中2个:2。1.或4. 3. 2. 1.有没有办法让他们在问候后提升:1。2. 3. 4. 5. 6.通过vba?文本是纯文本编号,在电子邮件中只有6个数字,后面有点。这些数字不是自动生成的。

例如:

Hello, 

6. some thing to be done
5. some thing to be done
4. some thing to be done
3. some thing to be done
2. some thing to be done
1. some thing to be done

Have a nice day.

Hello, 

4. some thing to be done
3. some thing to be done
2. some thing to be done
1. some thing to be done

Have a nice day.

自动段落不起作用:

   * Hello, 
   * 
    4. some thing to be done
    3. some thing to be done
    2. some thing to be done
    1. some thing to be done
   * 
   * Have a nice day.

我试过这个但是它没有用。

With objItem.Content.Find
    .Text = "6."
    .Forward = True
    .Execute

    If .Found = True Then
    objItem.HTMLBody = Replace(objItem.HTMLBody, "6.", "1.")
    objItem.HTMLBody = Replace(objItem.HTMLBody, "5.", "2.")
    objItem.HTMLBody = Replace(objItem.HTMLBody, "4.", "3.")
    objItem.HTMLBody = Replace(objItem.HTMLBody, "3.", "4.")
    objItem.HTMLBody = Replace(objItem.HTMLBody, "2.", "5.")
    objItem.HTMLBody = Replace(objItem.HTMLBody, "1.", "6.")

    Else

    With objItem.Content.Find
    .Text = "5."
    .Forward = True
    .Execute

    If .Found = True Then
    objItem.HTMLBody = Replace(objItem.HTMLBody, "5.", "1.")
    objItem.HTMLBody = Replace(objItem.HTMLBody, "4.", "2.")
    objItem.HTMLBody = Replace(objItem.HTMLBody, "2.", "4.")
    objItem.HTMLBody = Replace(objItem.HTMLBody, "1.", "5.")

    'Else...

    End With

End With

1 个答案:

答案 0 :(得分:1)

您的要求很高。这是因为您要解析一个您没有正确定义的字符串"。缺少的部分是:

(1)什么使一行成为你的字符串中的一行?它们是否以vbCrLf换行符分隔,或者您使用的是Chr(10)还是其他任何内容?可以互换吗?

(2)您如何告诉VBA列表开始并且列表结束?是否有一个数字作为一行中的第一个字符?如果一条线由于其他原因而以数字开头,或者有人在该数字之前放置一个空格,例如2. some thing to be done,该怎么办?然后第一个字符是空格而不是数字。特别是,如果您的列表超过10个项目,那么前9个数字可能会被写为1.(带有前导空格)。

(3)列表完成后,不再生成列表项,列表应标记为“#34;关闭"”。你怎么定义这个?是不是之前有一个以数字开头的行,并且下一行不再以数字开头?但这也意味着没有人可以在任何订单项中使用Return(因为应该完成的内容的说明过长)。

由于您的问题中没有包含上述内容,因此读者可能会得出结论,您尚未完全理解该问题。我想这也解释了@CindyMeister的评论。

尽管如此,我还有一点闲暇时间,并考虑了一下,并提出了以下小分:

Option Explicit

Public Sub HTML_List()

Dim lngRow As Long
Dim lngChar As Long
Dim strTmp() As String
Dim strHTMLbody As String
Dim bolListStart As Boolean

strHTMLbody = "Hello,  " & vbCrLf
strHTMLbody = strHTMLbody & " " & vbCrLf
strHTMLbody = strHTMLbody & "6. some thing to be done " & vbCrLf
strHTMLbody = strHTMLbody & "5. some thing to be done " & vbCrLf
strHTMLbody = strHTMLbody & "4. some thing to be done " & vbCrLf
strHTMLbody = strHTMLbody & "3. some thing to be done " & vbCrLf
strHTMLbody = strHTMLbody & "2. some thing to be done " & vbCrLf
strHTMLbody = strHTMLbody & "1. some thing to be done " & vbCrLf
strHTMLbody = strHTMLbody & " " & vbCrLf
strHTMLbody = strHTMLbody & "Have a nice day. "

strTmp() = Split(strHTMLbody, vbCrLf)

For lngRow = LBound(strTmp) To UBound(strTmp)
    strTmp(lngRow) = Trim(strTmp(lngRow))
    If strTmp(lngRow) <> vbNullString Then
        Select Case Asc(strTmp(lngRow))
        Case 48 To 57
            strTmp(lngRow) = Mid(strTmp(lngRow), InStr(1, strTmp(lngRow), ".", vbTextCompare) + 1)
            strTmp(lngRow) = "<li>" & strTmp(lngRow) & "</li>"
            If bolListStart = False Then
                strTmp(lngRow) = "<ol>" & strTmp(lngRow)
                bolListStart = True
            End If
        Case Else
            If bolListStart = True Then
                bolListStart = False
                strTmp(lngRow - 1) = strTmp(lngRow - 1) & "</ol>"
            End If
        End Select
    End If
Next lngRow

strHTMLbody = ""
For lngRow = LBound(strTmp) To UBound(strTmp)
    strHTMLbody = strHTMLbody & strTmp(lngRow) & vbCrLf
Next lngRow

Debug.Print strHTMLbody

End Sub

因此,sub背后的基本步骤如下:

  1. 将初始字符串拆分为vbCrLf(希望这会使一行成为一行)。
  2. 检查该行中的第一个字符是否为数字。
  3. 随着上面的第一次出现,将开始列表。在HTML中,列表以<ol>开始。
  4. 从该行中删除数字,而不是告诉HTML这是一个列表项。该标记在列表项的开头标有<li>,在该订单项的末尾标有</li>
  5. 一旦使用数字不再启动行,该列表将以HTML </ol>关闭。
  6. 将所有行重新组合成一个HTML字符串。
  7. 如果您在Outlook电子邮件中将此字符串用作.HTMLbody,则HTML会自动设置列表格式并相应地为订单项编号。

    作为上述代码的结果,您将获得以下回复:

    &#13;
    &#13;
    Hello,
    
    <ol><li> some thing to be done</li>
    <li> some thing to be done</li>
    <li> some thing to be done</li>
    <li> some thing to be done</li>
    <li> some thing to be done</li>
    <li> some thing to be done</li>
    </ol>
    Have a nice day.
    &#13;
    &#13;
    &#13;

    我希望有所帮助。如果您有任何问题,请告诉我。