用录制宏的方法得到添加书签的代码如下:
    With ActiveDocument.Books
        .Add Range:=Selection.Range, Name:="abcd"
        .DefaultSorting = wdSortByName
        .ShowHidden = True
    End With
看是看明白了,但是如何把它转化成VC的代码呢?
在VC里,Books.Add()函数有两个参数,第一个是书签名字的字符串,第二个是个VARIANT*类型,应该是表示书签覆盖的范围的,但是不知道如何写该参数?

解决方案 »

  1.   

    就是Selection.Range啊!
    下面是SDK:
    创建、定义和重定义范围
    一般通过这种方法来创建 Range 对象:先声明 Range 类型的对象变量,然后使用 Document 对象的 Range 方法或其他对象的 Range 属性例示该变量,如字符、词、句或 Selection 对象。例如,以下代码可创建两个 Range 对象,都表示活动文档中的第二个句子。Public Sub GetRangeExample()
       ' 该示例显示 Range 方法和
       ' Range 属性如何都返回相同的字符。
       
       Dim rngRangeMethod        As Word.Range
       Dim rngRangeProperty      As Word.Range
       
       With ActiveDocument
          If .Sentences.Count >= 2 Then
                Set rngRangeMethod = .Range(.Sentences(2).Start, _
                    .Sentences(2).End)
                Set rngRangeProperty = .Sentences(2)
          End If
       End With
       
       Debug.Print rngRangeMethod.Text
       Debug.Print rngRangeProperty.Text
    End Sub
    利用 Range 方法指定文档的特定区域时,使用该方法的 Start 参数指定该范围开始的字符位置,并使用 End 参数指定该范围的结束位置。文档中第一个字符的字符位置是 0。最后一个字符位置等于文档中字符的总数。可以使用 Characters 集合的 Count 属性确定文档中的字符数。如前面示例中所示,还可以使用 Book、Selection 或 Range 对象的 Start 和 End 属性,来指定 Range 方法的 Start 和 End 参数。可以将 Start 和 End 参数设置成同一数字。在这种情况下,创建的是不包括任何字符的范围。可以使用对象的 SetRange 方法,设置或重定义 Range 对象的内容。可以使用 Range 对象的 Start 属性或其 MoveStart 方法,指定或重定义范围的起始位置。同样,可以使用 Range 对象的 End 属性或其 MoveEnd 方法,指定或重定义范围的结束位置。下例中,先使用 Content 属性创建一个包括整个文档内容的 Range 对象。再更改 End 属性,指定该范围的结束位置在文档第一句的末尾。然后使用 SetRange 方法重定义该范围以包括文档的第一段。最后,使用 MoveEnd 方法将该范围的结束位置扩展到文档第二段的末尾。在示例的每一步上,范围中包含的字符数都打印到“立即窗口”。Public Sub RedefineRangeExample1()
       ' 此过程说明如何使用多种属性
       ' 和方法重定义 Range 对象的内容。
       ' 请参阅 RedefineRangeExample2 过程。
       Dim rngSample As Range
       
       Set rngSample = ActiveDocument.Content
       
       With rngSample
          Debug.Print "The range now contains " & .Characters.Count _
                & " characters."
          .End = ActiveDocument.Sentences(1).End
          Debug.Print "The range now contains " & .Characters.Count _
                & " characters."
          .SetRange Start:=0, End:=ActiveDocument.Paragraphs(1).Range.End
          Debug.Print "The range now contains " & .Characters.Count _
                & " characters."
          .MoveEnd Unit:=wdParagraph, Count:=1
          Debug.Print "The range now contains " & .Characters.Count _
                & " characters."
       End With
    End Sub
    还可以使用 Range 对象的 Find 属性重定义该 Range 对象,以返回 Find 对象。下例说明使用 Find 属性定位活动文档中的文本。如果找到了该文本,Range 对象将被自动重定义,以包含与搜索条件匹配的文本。With rngRangeText.Find
       .ClearFormatting
       If .Execute(FindText:=strTextToFind) Then
          Set RedefineRangeExample2 = rngRangeText
       Else
          Set RedefineRangeExample2 = Nothing
       End If
    End With
    很多 Word 对象都具有返回 Range 对象的 Range 属性。可以使用对象的 Range 属性,在必须使用对象本身不能提供的 Range 对象的属性或方法的环境下,返回 Range 对象。例如,以下代码使用 Paragraph 对象的 Range 属性返回 Range 对象,用于格式化文档第一段的文本。Dim rngPara As RangeSet rngPara = ActiveDocument.Paragraphs(1).Range
    With rngPara
       .Bold = True
       .ParagraphFormat.Alignment = wdAlignParagraphCenter
       .Font.Name = "Arial"
    End With
    识别 Range 对象后,就可以应用该对象的方法和属性,修改该范围的内容或获得关于该范围的信息。使用 Range 对象的 StoryType 属性,可以确定 Range 在该文档中的位置。
      

  2.   

    谢谢lins(*无间行者*) ,我知道是Selection.Range,我也知道如何创建它,但是我不知道如何将它转化成VARIANT*类型来进行传参(在VC里,Books.Add()函数有两个参数,第一个是书签名字的字符串,第二个是个VARIANT*类型,应该是表示书签覆盖的范围的),如果您能告诉我如何做,我一定给分。
      

  3.   

    vb里调用容易,就是不知道vc里怎么调用
      

  4.   

    呵呵,自己搞定了。
    COleVariant vt;
    vt.vt = VT_DISPATCH;
    vt.pdispVal = range.m_lpDispatch;
    bkitem = books.Add("abcd", &vt);
      

  5.   

    晕倒!这样的问题我当初也是,后来我发贴求这样的转换方法!http://expert.csdn.net/Expert/topic/1452/1452788.xml?temp=.646969希望大家以后不要被这样的问题难住