2015-05-28 58 views
3

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

我这样做的原因,而不是仅仅使用静态书签是程序不知道数组将多久或将包含什么数据,直到它运行。我的思考过程是首次迭代将使用一个“锚点”书签,然后根据需要在原始/前一个书签之后添加书签。

我在下面使用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 
+0

一个'Bookmark'对象有一个'End'财产 - 有你使用这种用于插入点的尝试,而不是' Range.End'? – ChipsLetten

回答

1

您应该能够使用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 
+0

@Alex昨天晚上我打开袋子之前,我看到了你的评论,但今天早上它没了。你把所有东西都分类了吗? – CuberChase

+0

是的,但是我不得不重新考虑如何创建列表。我必须创建列表,然后按相反的顺序进行格式设置,因为书签还包含上一行的最后一个字符。 '设置newRange = prevRange newRange.SetRange prevRange.End,prevRange.End wrdDoc.Bookmarks.Add “BmarkName”,newRange newRange.Text = vbNewLine&BmarkText wrdDoc.Bookmarks.Add名称:= BmarkName,范围:= newRange'然后在别处格式化 – Alex