从Excel VBA在Outlook中创建多级列表

从Excel VBA在Outlook中创建多级列表,excel,vba,outlook,ms-word,Excel,Vba,Outlook,Ms Word,我正在使用excel处理用户输入,然后根据输入输出一封标准化的电子邮件,然后将格式化文本保存到一个变量中,然后将其添加到剪贴板中,以便于输入我们用于内部文档的系统 我有一种使用HTML作为电子邮件格式的有效方法,但这并不能解决我想让它将代码复制到剪贴板或变量的意图,因为HTML标记也会被复制。我希望获得Word的项目符号列表的功能,因此我一直在尝试以一种可以按需调用的方式修改MS Word代码 我目前已将Word和Outlook的默认excel库、表单库和对象库添加到程序中 我的目标是通过Wor

我正在使用excel处理用户输入,然后根据输入输出一封标准化的电子邮件,然后将格式化文本保存到一个变量中,然后将其添加到剪贴板中,以便于输入我们用于内部文档的系统

我有一种使用HTML作为电子邮件格式的有效方法,但这并不能解决我想让它将代码复制到剪贴板或变量的意图,因为HTML标记也会被复制。我希望获得Word的项目符号列表的功能,因此我一直在尝试以一种可以按需调用的方式修改MS Word代码

我目前已将Word和Outlook的默认excel库、表单库和对象库添加到程序中

我的目标是通过Word列表传递一个基于excel表格构建的数组列表,并对其进行格式化,然后将文本写入outlook草稿中的Word编辑器。将有不同数量的章节(不超过6个)需要编写,通常每个章节不超过10个项目,通常更少。因此,我打算让其他子/函数调用此函数,以根据需要格式化每个部分

附件是本节的输出示例,以及数据来源示例。每个部分都有自己的Excel表格。每个部分的第二级列表将来自单独的表格

我包含了一部分显示新outlook草稿启动和文本输入的实际代码。EmailBody()当前只处理这些部分之外的任何文本,并为每个部分调用单独的函数来解析表(当前为未格式化文本,仅输入换行符)

输出示例

数据源示例

我正在努力适应的多级列表代码。我在注释掉的代码部分不断遇到错误,并且不确定如何正确地更正它,以便它既可以运行,也可以按需调用:

运行时错误“450”:参数数目错误或属性无效 分配


请原谅我,如果这看起来效率低下,或是一个奇怪的方法。我几周前就开始学习VBA,在我的工作职责和我目前所学的知识之间只有几个小时的申请时间。任何帮助都将不胜感激

出现该错误的原因是,它无法解析对象
选择
。您需要完全限定选择对象,否则Excel将引用Excel中的当前选择

您可能从Excel中引用了Word对象库,但这还不够。复制此错误的最简单方法是从Excel运行此命令

Sub Sample()
    Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
    wdWord10ListBehavior
End Sub
Sub Sample()
    Dim wrd As Object

    Set wrd = GetObject(, "word.application")

    wrd.Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= wdWord10ListBehavior
End Sub

下面是一个可以工作的示例代码。要测试这一点,请打开word文档并选择一些文本,然后从Excel中运行此代码

Sub Sample()
    Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
    wdWord10ListBehavior
End Sub
Sub Sample()
    Dim wrd As Object

    Set wrd = GetObject(, "word.application")

    wrd.Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= wdWord10ListBehavior
End Sub

将此应用于代码。您需要使用Word对象并完全限定您的对象,如Word应用程序、Word文档、Word范围等。例如

Dim oWordApp As Object, oWordDoc As Object
Dim FlName As String

FlName = "C:\MyFile.Docx"

'~~> Establish an Word application object
On Error Resume Next
Set oWordApp = GetObject(, "Word.Application")

If Err.Number <> 0 Then
    Set oWordApp = CreateObject("Word.Application")
End If
Err.Clear
On Error GoTo 0

oWordApp.Visible = True

Set oWordDoc = oWordApp.Documents.Open(FlName)

With oWordDoc
    '
    '~~> Rest of the code here
    '
End With
Dim oWordApp作为对象,oWordDoc作为对象
将名称设置为字符串
FlName=“C:\MyFile.Docx”
“~~>建立Word应用程序对象
出错时继续下一步
Set oWordApp=GetObject(,“Word.Application”)
如果错误号为0,则
设置oWordApp=CreateObject(“Word.Application”)
如果结束
呃,明白了
错误转到0
oWordApp.Visible=True
设置oWordDoc=oWordApp.Documents.Open(FlName)
与oWordDoc
'
“~~>这里的其余代码
'
以

出现该错误的原因是,它无法解析对象
选择
。您需要完全限定选择对象,否则Excel将引用Excel中的当前选择

您可能从Excel中引用了Word对象库,但这还不够。复制此错误的最简单方法是从Excel运行此命令

Sub Sample()
    Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
    wdWord10ListBehavior
End Sub
Sub Sample()
    Dim wrd As Object

    Set wrd = GetObject(, "word.application")

    wrd.Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= wdWord10ListBehavior
End Sub

下面是一个可以工作的示例代码。要测试这一点,请打开word文档并选择一些文本,然后从Excel中运行此代码

Sub Sample()
    Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
    wdWord10ListBehavior
End Sub
Sub Sample()
    Dim wrd As Object

    Set wrd = GetObject(, "word.application")

    wrd.Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= wdWord10ListBehavior
End Sub

将此应用于代码。您需要使用Word对象并完全限定您的对象,如Word应用程序、Word文档、Word范围等。例如

Dim oWordApp As Object, oWordDoc As Object
Dim FlName As String

FlName = "C:\MyFile.Docx"

'~~> Establish an Word application object
On Error Resume Next
Set oWordApp = GetObject(, "Word.Application")

If Err.Number <> 0 Then
    Set oWordApp = CreateObject("Word.Application")
End If
Err.Clear
On Error GoTo 0

oWordApp.Visible = True

Set oWordDoc = oWordApp.Documents.Open(FlName)

With oWordDoc
    '
    '~~> Rest of the code here
    '
End With
Dim oWordApp作为对象,oWordDoc作为对象
将名称设置为字符串
FlName=“C:\MyFile.Docx”
“~~>建立Word应用程序对象
出错时继续下一步
Set oWordApp=GetObject(,“Word.Application”)
如果错误号为0,则
设置oWordApp=CreateObject(“Word.Application”)
如果结束
呃,明白了
错误转到0
oWordApp.Visible=True
设置oWordDoc=oWordApp.Documents.Open(FlName)
与oWordDoc
'
“~~>这里的其余代码
'
以

由于需要声明Word和Outlook对象并解决它们之间的关系,因此在这种情况下使用Word列表会造成编码上的某种繁琐

似乎我在原始代码中错误地声明了HTML列表。我移动了
  • 的边距,而不是嵌套
    来逐步移动列表

    通过嵌套HTML列表标记,您可以获得与单词列表相同的功能,并且当复制到其他文本编辑器时,格式将保持不变。但是,复制必须在写入.HTMLBody之后进行

    <ul><li>Apple</li><ul><li>Fruit</li></ul></ul>
    
    • 苹果
      • 水果
    或对于VBA:

    .HTMLBody = "<ul><li>" & arg1 & "</li><ul><li>" & arg2 & "</li></ul></ul>"
    
    .HTMLBody=“
    • ”&arg1&“
      • ”&arg2&“
    以上内容将输出到.HTMLBody:

    • 苹果
      • 水果

        要复制文本,您只需在Outlook word编辑器中选择所有文本,然后将其按原样粘贴到剪贴板,或者在将其放入剪贴板之前,如果需要进行其他更改,则将其分配到变量。

        利用单词列表,在这种情况下,由于需要进行dec,因此在编码方面产生了一定的繁琐