Open password protected MSWord using the apiShellExecute Lib "shell32.dll" in VBA RRS feed

  • Question

  • In VBA - a reference from MS Access code can be used to open an Excel doc for example, then keep it open for the user. Keeping the doc open is a problem if a second document needs to be opened. The solution was to us and API shown below. This doesn't tie up the reference pointer.

    The Question: The same code worked for a Word Document. Except when a Word document is Password Protected. How can the password be passed into this function. (or is there a better way to open a document with VBA without the pointer reference tied up?)

    e.g.  to open "C:\Book1.xlsx"           use fHandleFile "C:\Book1.xlsx", WIN_NORMA

    Private Declare Function apiShellExecute Lib "shell32.dll" _
        Alias "ShellExecuteA" _
        (ByVal hwnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) _
        As Long
    '***App Window Constants***
    Public Const WIN_NORMAL = 1         'Open Normal
    Public Const WIN_MAX = 3            'Open Maximized
    Public Const WIN_MIN = 2            'Open Minimized
    '***Error Codes***
    Private Const ERROR_SUCCESS = 32&
    Private Const ERROR_NO_ASSOC = 31&
    Private Const ERROR_OUT_OF_MEM = 0&
    Private Const ERROR_FILE_NOT_FOUND = 2&
    Private Const ERROR_PATH_NOT_FOUND = 3&
    Private Const ERROR_BAD_FORMAT = 11&
    '***************Usage Examples***********************
    'Open a folder:     ?fHandleFile("C:\TEMP\",WIN_NORMAL)
    'Call Email app:    ?fHandleFile("",WIN_NORMAL)
    'Open URL:          ?fHandleFile("", WIN_NORMAL)
    'Handle Unknown extensions (call Open With Dialog):
    '                   ?fHandleFile("C:\TEMP\TestThis",Win_Normal)
    'Start Access instance:
    '                   ?fHandleFile("I:\mdbs\CodeNStuff.mdb", Win_NORMAL)
    Function fHandleFile(stFile As String, lShowHow As Long)
    Dim lRet As Long, varTaskID As Variant
    Dim stRet As String
        'First try ShellExecute
        lRet = apiShellExecute(hWndAccessApp, vbNullString, _
                stFile, vbNullString, vbNullString, lShowHow)
        If lRet > ERROR_SUCCESS Then
            stRet = vbNullString
            lRet = -1
            Select Case lRet
                Case ERROR_NO_ASSOC:
                    'Try the OpenWith dialog
                    varTaskID = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " _
                            & stFile, WIN_NORMAL)
                    lRet = (varTaskID <> 0)
                Case ERROR_OUT_OF_MEM:
                    stRet = "Error: Out of Memory/Resources. Couldn't Execute!"
                Case ERROR_FILE_NOT_FOUND:
                    stRet = "Error: File not found.  Couldn't Execute!"
                Case ERROR_PATH_NOT_FOUND:
                    stRet = "Error: Path not found. Couldn't Execute!"
                Case ERROR_BAD_FORMAT:
                    stRet = "Error:  Bad File Format. Couldn't Execute!"
                Case Else:
            End Select
        End If
        fHandleFile = lRet & _
                    IIf(stRet = "", vbNullString, ", " & stRet)
    End Function


    Thursday, April 4, 2013 4:10 PM

All replies

  • Did you try assign Word application to a variable and use Open method?

    Sub fMain()
        Dim appWord As Object 'Word.Application
        Dim doc As Object 'Word.Document
        Set appWord = CreateObject("Word.Application")
        Set doc = appWord.Documents.Open("c:\temp\123.docx", , , , "passwordhere")
        'Add code here to manipulate the Word Document
        doc.Close SaveChanges:=False 'choose True or False
        'Then, open a new Word Document, if you want:
        Set doc = appWord.Documents.Open("c:\temp\456.docx", , , , "passwordhere")
        'Then, add code to manipulate it, and close it.
        'Then, quit Word application:
    End Sub

    Felipe Costa Gualberto -

    Thursday, April 4, 2013 11:43 PM