使用VBA动态创建书签

时间:2015-05-28 21:21:37

标签: excel vba excel-vba ms-word

我正在尝试根据动态分配的数组的长度从Excel动态地将书签添加到Word文件中。然后,我想将每个书签的文本更改为数组中的相应值。

我这样做而不仅仅是使用静态书签的原因是程序不知道阵列将持续多长时间或者在运行之前将包含哪些数据。我的思维过程就是拥有一个锚点。第一次迭代将使用的书签,然后在原始/上一个迭代之后根据需要添加书签。

我在下面使用的是prevRange.End,但它有缺陷,因为这不是一个范围,但我觉得它会让我明白我想要做的事情。

我会使用Bookmarks.InsertAfter,除了我试图在Word中创建一个项目符号列表,这会混淆格式并反转列表的顺序。

我宁愿找到一种方法来动态地执行此操作,而不是使用大量书签的暴力方法,然后删除我不需要的那些。

wrdRange,prevRange和wrdDoc在程序的其他地方定义。

Dim Count As Integer
Dim CountM As Integer
Count = 1

Do While Clar(Count) <> ""       'Clar() is a dynamically allocated 1D array containing text
CountM = Count - 1
PrevBmarkName = "Clar" & CountM
BmarkName = "Clar" & Count      'Only bookmark in Word document to start with is Clar1
BmarkText = Clar(Count)

If Count <> 1 Then
    Set prevRange = wrdDoc.Bookmarks(PrevBmarkName).Range
    wrdDoc.Bookmarks.Add Name:="BmarkName", Range:=prevRange.End 'Faults here because prevRange.end isn't a range
    Set wrdRange = wrdDoc.Bookmarks(BmarkName).Range
    If Clar(Count + 1) = "" Then   'Used for the end of the list so there isn't a floating bullet point
        wrdRange.Text = BmarkText
        wrdDoc.Bookmarks.Add Name:=BmarkName, Range:=wrdRange
    Else
        wrdRange.Text = BmarkText & vbNewLine
        wrdDoc.Bookmarks.Add Name:=BmarkName, Range:=wrdRange
    End If
Else         'Functions normally through the first iteration, replaces Clar1 with clar(1) text
    Set wrdRange = wrdDoc.Bookmarks(BmarkName).Range
    wrdRange.Text = BmarkText & vbNewLine
    wrdDoc.Bookmarks.Add Name:=BmarkName, Range:=wrdRange
End If

Count = Count + 1
CountM = CountM + 1
Loop

1 个答案:

答案 0 :(得分:2)

您应该可以按照以下方式使用SetRange方法:

    Set prevRange = wrdDoc.Bookmarks(PrevBmarkName).Range
    Set newRange = prevRange   'Have to set the range to something initially
    newRange.SetRange prevRange.End, prevRange.End
    ActiveDocument.Bookmarks.Add "BmarkName", newRange