Private Sub Command1_Click()
    Dim wdapp As Word.Application
    Dim wddoc As Word.Document
    Set wdapp = New Word.Application
    Set wddoc = wdapp.Documents.Open(App.Path & "\f.doc")
    Dim filepage As String
    filepage = CStr(wddoc.BuiltinDocumentProperties(wdPropertyPages) - 3)
    MsgBox filepage
    wddoc.Close
    wdapp.Quit
    Set wddoc = Nothing
    Set wdapp = Nothing
End Sub
f.doc是一个8页的文档,其中第一节3页是封面、说明,第二节正文部分为5页,我要在“说明”部分中显示正文页数,上面程序有错吗?为什么运行时显示0,可逐语句调试,却能显示正确的数值:5

解决方案 »

  1.   

    只是略知vb,很多的不明白,要延时,我还可以理解,可为什么要在每句之后?而且延时多长时间怎样确定?请多多指教!
    刚刚试过,在我的机子上(赛扬2.4G,winxp,vb6,office2000)最少700ms,在别的机子上呢?
    只在本句之前延时:filepage = CStr(wddoc.BuiltInDocumentProperties(wdPropertyPages) - 3)
      

  2.   

    把延时换成循环,下面的代码我没有测试
    Private Sub Command1_Click() 
        Dim wdapp As Word.Application 
        Dim wddoc As Word.Document 
        Set wdapp = New Word.Application 
        Set wddoc = wdapp.Documents.Open(App.Path & "\f.doc") 
        Dim filepage As String 
        do while wddoc.BuiltinDocumentProperties(wdPropertyPages)=0 '这个判断条件如果不行,你自己再改改
            doevents
        loop
        filepage = CStr(wddoc.BuiltinDocumentProperties(wdPropertyPages) - 3) 
        MsgBox filepage 
        wddoc.Close 
        wdapp.Quit 
        Set wddoc = Nothing 
        Set wdapp = Nothing 
    End Sub 
      

  3.   

    to happy_sea:
    不行,结果还是0,条件设<5,好想又成了死循环,还是延时吧,就设1000ms了。
      

  4.   

    Mark
      

  5.   

    今天,把这段测试程序连同延时程序(API调用)插入主程序,延时10秒,竟然还是时对时不对,受不了了。打开一个word文档,在“工具”->“字数统计”中显示页数没见延时呀。
    实在不行,要用笨办法了:程序中选取最后一段(必须的)(幸好只有一行),读取页脚字串(设的第*页),提取“*”。
    谁还有高招呀,谁能解释一下延时为什么不好用???
      

  6.   


    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Sub Command1_Click()
        
        Dim wdapp As Word.Application
        Dim wddoc As Word.Document
        Set wdapp = New Word.Application
        Set wddoc = wdapp.Documents.Open("G:\2007\Document\F.doc") '(App.Path & "\f.doc")
        Dim filepage As String
        
        Sleep (1000)
        
        filepage = CStr(wddoc.BuiltinDocumentProperties(wdPropertyPages) - 3)
        MsgBox filepage
        wddoc.Close
        wdapp.Quit
        Set wddoc = Nothing
        Set wdapp = NothingEnd Sub我测试了下
    这样没什么问题
    不加这句时开始显示0
    加了后显示正常了
      

  7.   

    加个Label1 并用下面的方式再看看,更奇怪了。
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Sub Command1_Click()
        
        Dim wdapp As Word.Application
        Dim wddoc As Word.Document
        Dim filepage As String
        Set wdapp = New Word.Application
        Set wddoc = wdapp.Documents.Open("C:\D.doc") '(App.Path & "\f.doc")
        Label1.Caption = wddoc.BuiltInDocumentProperties(wdPropertyPages)
            'Sleep (1000)
          filepage = CStr(wddoc.BuiltInDocumentProperties(wdPropertyPages) - 3)
          Label1.Caption = Label1.Caption & "|" & filepage & "|" & wddoc.BuiltInDocumentProperties(wdPropertyPages)
        MsgBox filepage
        wddoc.Close
        wdapp.Quit
        Set wddoc = Nothing
        Set wdapp = NothingEnd Sub
      

  8.   

    应该是这样的:word在装入一个文档时,为了不让我们等的时间太长,并不是把文档一次读入的,如果文档大于3页,则打开的同时只读入前3页,我试验了一下第2次好像读入至21页,以后没再试。所以在open方法以后不管这个文档是多少页,.BuiltInDocumentProperties(wdPropertyPages)的值总是3或者小于3(当文档不足3页时)。word在显示出前3页文档后,后台继续读入后面的内容,这就是为什么加一定的延时才能正确获取总页数的原因。我目前也还不知道如何解决这个问题,只能提供一下思路供楼主参考:
    1、有没有另一个函数可以在word读入全部文档内容之前就可以获取总页数;
    2、应该有一个函数或事件说明word已读入全部文档内容,此时再取页数就准确了。
      

  9.   

    如果能保证文档是大于3页且小于21页(这个21页是我自己测试的,只测试了一次,不一定准确,楼主可以自行试验一下),那么下面的代码应该是可用的:
    Private Sub Command1_Click() 
        Dim wdapp As Word.Application 
        Dim wddoc As Word.Document 
        Set wdapp = New Word.Application 
        Set wddoc = wdapp.Documents.Open(App.Path & "\f.doc") 
        Dim filepage As String 
        do while wddoc.BuiltinDocumentProperties(wdPropertyPages)<=3  
            doevents 
        loop 
        filepage = CStr(wddoc.BuiltinDocumentProperties(wdPropertyPages) - 3) 
        MsgBox filepage 
        wddoc.Close 
        wdapp.Quit 
        Set wddoc = Nothing 
        Set wdapp = Nothing 
    End Sub 
      

  10.   

    用Sleep延时可能不对吧,Sleep是暂停线程,所有操作都暂停的~
      

  11.   

    我试着用word2007打开一个64页的doc文档,发现word首先读入前3页,第二次读入到21页,后面的我没继续测试,如果楼主能保证文档的页数大于3而且小于21的话,用下面的代码就行了:
    Private Sub Command1_Click() 
        Dim wdapp As Word.Application 
        Dim wddoc As Word.Document 
        Set wdapp = New Word.Application 
        Set wddoc = wdapp.Documents.Open(App.Path & "\f.doc") 
        Dim filepage As String 
        do while wddoc.BuiltinDocumentProperties(wdPropertyPages)<=3
            doevents 
        loop 
        filepage = CStr(wddoc.BuiltinDocumentProperties(wdPropertyPages) - 3) 
        MsgBox filepage 
        wddoc.Close 
        wdapp.Quit 
        Set wddoc = Nothing 
        Set wdapp = Nothing 
    End Sub 不建议用sleep,虽然不会像楼上朋友说的暂停word进程,但是由于不同的计算机的处理能力不同,甚至在同一台机子上打开不同的文档,word读入前三页内容的用时都不会是相同的。
      

  12.   

    感谢happysea提供的思路,问题已圆满解决,续挂两天贴。不用延时,只要在
    filepage = CStr(wddoc.BuiltinDocumentProperties(wdPropertyPages) - 3)
    之前加一句:
    wddoc.Paragraphs(wddoc.Paragraphs.Count).Range.Select(最后一段为落款,不足一行)