Announcement

Collapse
No announcement yet.

PB9 MSWORD - Open an existing document

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • PB9 MSWORD - Open an existing document

    I'm still learning MS word VBA equivalents in PB, to date the only one I can't get working cleanly is the "end of function" cleanup after opening an existing document.
    In the code below the line "oWordDoc = NOTHING" fails, almost implying that the OBJECT does not exists, yet the document referenced opens and closes normally and can be manipulated (code not shown) while open with no problems.
    Any comments much appreciated.

    TIA

    Ian B

    Code:
    #COMPILER PBWIN 9
    #COMPILE EXE
    #DIM ALL
    '   oWord.inc CONTAINS THE MS WORD INTERFACE DEFINITIONS CREATED WITH THE PBCOM BROWSER
    #INCLUDE "oWord.inc"
    
    ' MAIN APPLICATION ENTRY POINT
    FUNCTION PBMAIN()
    CALL WordDemo
    END FUNCTION
    
    FUNCTION WordDemo AS LONG
      LOCAL oWordApp     AS Int__Application ' Application Interface
      LOCAL oWordDoc     AS Int__Document    ' Document Interface
      LOCAL oWordSel     AS Selection        ' Selection Interface
      LOCAL oWordFont    AS Int__Font        ' Font inteface
      LOCAL sDocPath     AS STRING           ' Utility for various paths
      LOCAL vDoc         AS VARIANT          ' Utility for various document names
      LOCAL sText        AS STRING           ' Utility for various text items
      LOCAL vUtility     AS VARIANT          ' Utility variant
    '   OPEN AN INSTANCE OF WORD
      oWordApp = NEWCOM $PROGID_Application
    
    ' OPEN SUCCESSFUL?
      IF ISFALSE ISOBJECT(oWordApp) THEN
        MSGBOX "Unable to open or start MSWORD!"
        EXIT FUNCTION
      END IF
     ' MAKE WORD VISIBLE AND SHOW IN NORMAL STATE
      oWordApp.Visible = 1
      oWordApp.WindowState = %wdWindowStateNormal
      '   OPEN AN EXISTING DOCUMENT
      sDocPath = UCODE$("C:\PBWin90\Samples\Com\Word\")  '<<<< CHANGE TO SUIT
      oWordApp.ChangeFileOpenDirectory (sDocPath)
      vDoc="IansTest.doc"                                '<<<< CHANGE TO SUIT
      oWordDoc = oWordApp.Documents.Open(vDoc)
      IF ISFALSE ISOBJECT(oWordDoc) THEN
        MSGBOX "MSWORD was not able to open document."
        GOTO Terminate
      END IF
    '  TEST CODE GOES HERE
    MSGBOX "About to close"
    vUtility = %wdDoNotSaveChanges
    oWordApp.Documents.Close vUtility
    '   CLOSE ALL INTERFACES
    TERMINATE:
    oWordApp.Quit
    oWordSel = NOTHING
    oWordDoc = NOTHING                                  '<<<< CODE FAILS HERE, IF COMMENTED OUT CODE FAILS ON END FUNCTION
    oWordApp  = NOTHING
    
    END FUNCTION

  • #2
    Replacing the oWordApp.Documents.Close vUtility, with oWordApp.ActiveWindow.Close vUtility, gracefully closes and terminates this function.
    oWord.inc shows "Close" to be a valid Document method, so I'll keep coming back as time allows and retry to see if I can get it working.

    Ian B

    Comment


    • #3
      On my system, the ID binding call
      Code:
        OBJECT CALL oWordApp.Documents.Open(vDoc) TO oWordDoc
      returns a valid object.

      But the Vtbl binding version
      Code:
        oWordDoc = oWordApp.Documents.Open(vDoc)
      does not.

      The following, however, works on my system
      Code:
      ...
      
        sDocPath = UCODE$("F:\Support\MsWord\")
        oWordApp.ChangeFileOpenDirectory (sDocPath)
        vDoc = "BOOKINGS.doc"    
        oWordApp.Documents.Open(vDoc)
        oWordDoc = oWordApp.Documents.Item(vDoc)  
        
      ...
      
        oWordApp.Documents.Close(vUtility) 
        
      TERMINATE:
        oWordApp.Quit
        oWordSel = NOTHING
        oWordDoc = NOTHING     
        oWordApp  = NOTHING
      Dominic Mitchell
      Phoenix Visual Designer
      http://www.phnxthunder.com

      Comment


      • #4
        MS Word - closing a document.

        Dominic
        Thank you for your efforts and reply.
        I think I see where my logic was failing.
        Code:
        oWordApp.Documents.Close
        Does not point to a specific document, which is probably what was causing the problem.

        I'm somewhat puzzled by your failure to get an object
        after creating the oWordDoc object with the code below
        Code:
        OWordDoc=oWordApp.Documents.Open(vDoc)
        I have an ISOBJECT test on oWordDoc which does not return FALSE.
        Code:
        If ISFALSE ISOBJECT(oWordDoc) THEN ...
        Again thankyou for your assistance.
        I am gathering together sample code which shows the PB code for the commonly used MS Word VBA calls and will post this when complete.
        Can I include your technique in this code please.

        Ian B

        Comment


        • #5
          The Close method of the Documents collections closes all open documents. This
          should not cause a GPF in the sample you posted.
          Code:
          OWordDoc=oWordApp.Documents.Open(vDoc)
          On my system, this code opens the file in Microsoft Word, but oWordDoc does not contain a valid object.

          Can I include your technique in this code please
          Be my guess.
          Dominic Mitchell
          Phoenix Visual Designer
          http://www.phnxthunder.com

          Comment


          • #6
            I have similar problems.

            I want to open an existing Word Document and print it out. The procedure opens the document (document appears on the screen), the ISOBJECT test succeeds, but the first line referring the newly assigned document object (PrintOut method) triggers a GPF.

            Code:
            SUB PrintWithWord(rtDocPath AS STRING)
              LOCAL oWordApp AS Int__Application
              LOCAL oWordDoc AS Int__Document
              LOCAL vDocPath AS VARIANT
              oWordApp = NEWCOM $PROGID_Word_Application
              IF ISOBJECT(oWordApp) THEN
                oWordApp.Visible = 1
                oWordApp.WindowState = %WdWindowState_wdWindowStateNormal
                vDocPath = rtDocPath
                oWordDoc = oWordApp.Documents.Open(vDocPath)
                IF ISOBJECT(oWordDoc) THEN
                  oWordDoc.PrintOut
                  oWorddoc.Saved = 1
                  oWordDoc.Close
                  oWordDoc = NOTHING
                END IF
                oWordApp.Quit
                oWordApp = NOTHING
              END IF
            END SUB
            If I replace oWordApp.Documents.Open with oWordApp.Documents.Add, the above code works fine.

            Dominic's workaround triggers a GPF as well:

            Code:
            sDocPath = UCODE$("F:\Support\MsWord\")
              oWordApp.ChangeFileOpenDirectory (sDocPath)
              vDoc = "BOOKINGS.doc"    
              oWordApp.Documents.Open(vDoc)
              oWordDoc = oWordApp.Documents.Item(vDoc)
            I'm rather clueless by now...

            Heinz Salomon

            Comment


            • #7
              I bet that you are using an include file that doesn't match with the version of MS WORD that you are using. Office applications are not well suited to be used with direct interface calls because they are a mess. M$ likes to break all his own rules.

              For example, MS WORD 2003 has three PrintOut methods. The original one, with an offset of 705, has been renamed as PrintOutOld:

              Code:
                 METHOD PrintOutOld <109> ( _                         ' VTable offset = 704
                   OPTIONAL BYREF VARIANT _                           ' [opt][in] *Background VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Append VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Range VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *OutputFileName VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *From VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *To VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Item VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Copies VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Pages VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PageType VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintToFile VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Collate VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *ActivePrinterMacGX VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *ManualDuplexPrint VT_VARIANT <Variant>
                 )                                                    ' void
              The second one, that was named PrintOut in the 2000 version, and has an offset of 996, has been renamed in the 2003 version as PrintOut2000:

              Code:
                 METHOD PrintOut2000 <444> ( _                        ' VTable offset = 996
                   OPTIONAL BYREF VARIANT _                           ' [opt][in] *Background VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Append VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Range VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *OutputFileName VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *From VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *To VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Item VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Copies VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Pages VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PageType VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintToFile VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Collate VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *ActivePrinterMacGX VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *ManualDuplexPrint VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintZoomColumn VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintZoomRow VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintZoomPaperWidth VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintZoomPaperHeight VT_VARIANT <Variant>
                 )                                                    ' void
              And finally, the PrintOut method in the 2003 version, with an offset of 1008, is as follows:

              Code:
                 METHOD PrintOut <446> ( _                            ' VTable offset = 1008
                   OPTIONAL BYREF VARIANT _                           ' [opt][in] *Background VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Append VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Range VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *OutputFileName VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *From VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *To VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Item VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Copies VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Pages VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PageType VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintToFile VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *Collate VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *ActivePrinterMacGX VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *ManualDuplexPrint VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintZoomColumn VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintZoomRow VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintZoomPaperWidth VT_VARIANT <Variant>
                 , OPTIONAL BYREF VARIANT _                           ' [opt][in] *PrintZoomPaperHeight VT_VARIANT <Variant>
                 )                                                    ' void
              Therefore, if you use this method with an include file that doesn't match your version, it will GPF, because you will be calling he wrong offset. Keep in mind that with direct interface calls what counts is the offset, not the name.

              My advice: With Office applications use automation (OBJECT CALL/GET/LET/SET) and late binding.
              Forum: http://www.jose.it-berater.org/smfforum/index.php

              Comment

              Working...
              X