在Word中的项目符号列表中动态分配书签

时间:2015-05-29 20:06:51

标签: excel vba excel-vba ms-word

我正在尝试在项目符号列表中的上一个书签下方的行上生成书签,以便word文档以

开头
  • [Bookmark1]

然后转换为

  • [Bookmark1]
  • [Bookmark2]

这样我就可以逐行调整列表的格式,也可以在列表中输入文本。 1D数组Level()控制它将具有哪种类型的项目符号点。书签是基于动态分配的1D数组(称为clar())动态创建的,该数组包含工作表上各点的文本。程序在运行之前不知道数组将包含多少行文本。下面的代码将运行,但程序的输出是

  • [Bookmark1]

将变为(经过六次迭代)

  • [Boomark6]

所以我现在只有一个名为Bookmark6的书签,而不是列表中的六个。我尝试使用上一个书签末尾的范围,但这不会在下一个项目符号点或当前书签之外设置范围。我还尝试使用wbNewLine扩展范围,然后在结束时设置范围,但这是无效的。

   Dim Count As Integer
Dim CountM As Integer
Count = 1
Do While Clar(Count) <> ""
CountM = Count - 1
PrevBmarkName = "Clar" & CountM
BmarkName = "Clar" & Count
BmarkText = Clar(Count)

If Count <> 1 Then
    Set prevRange = wrdDoc.Bookmarks(PrevBmarkName).Range
    Set newRange = prevRange
    newRange.SetRange prevRange.End, prevRange.End
    ActiveDocument.Bookmarks.Add "BmarkName", newRange
    If DesClar(Count + 1) = "" Then    'Stops the program from generating a blank bullet
        wrdRange.Text = BmarkText
        wrdDoc.Bookmarks.Add Name:=BmarkName, Range:=wrdRange
        Level = Check1(Count)         'Used to adjust the bullet level/type
            If Level = 1 Then wrdRange.Style = wrdDoc.Styles("SD Bullets")
            If Level = 2 Then wrdRange.Style = wrdDoc.Styles("SD Bullets 2")
    Else
        wrdRange.Text = BmarkText & vbNewLine
        wrdDoc.Bookmarks.Add Name:=BmarkName, Range:=wrdRange
        Level = Check1(Count)
            If Level = 1 Then wrdRange.Style = wrdDoc.Styles("SD Bullets")
            If Level = 2 Then wrdRange.Style = wrdDoc.Styles("SD Bullets 2")
     End If
Else                         'Only used on the first iteration because it uses Bookmark1
    Set wrdRange = wrdDoc.Bookmarks(BmarkName).Range
    wrdRange.Text = BmarkText & vbNewLine
    wrdDoc.Bookmarks.Add Name:=BmarkName, Range:=wrdRange
    Level = Check1(Count)
        If Level = 1 Then wrdRange.Style = wrdDoc.Styles("SD Bullets")
        If Level = 2 Then wrdRange.Style = wrdDoc.Styles("SD Bullets 2")
End If

Count = Count + 1
CountM = CountM + 1
Loop

1 个答案:

答案 0 :(得分:1)

2个问题:

首先,wrdRange仅在第一次通过循环时设置,并且由于If Count <> 1测试而无法在此之后进行更改。检查wrdRangeIf Count <> 1的所有引用。

其次,当您设置newRange = prevRange时,您没有获得新的范围 - 您将获得具有相同引用的两个变量。将行Set newRange = prevRange更改为Set newRange = prevRange.Duplicate