Excel interop prevent showing password dialog

后端 未结 3 1188
Happy的楠姐
Happy的楠姐 2020-12-17 19:37

I am writing a program to clean excel files from empty rows and columns, i started from my own question Fastest method to remove Empty rows and Columns From Excel Files usin

相关标签:
3条回答
  • 2020-12-17 19:44

    Concerning your solution, are you sure that it will not work with anything, that is not the password? Something like this:

    Public Function wb_get_workbook(ByVal sFullName As String) As Workbook
    
        Dim sFile As String
        Dim wbReturn As Workbook
    
        sFile = Dir(sFullName)
    
        On Error Resume Next
            Set wbReturn = Workbooks(sFile)
    
            If wbReturn Is Nothing Then
                Application.AskToUpdateLinks = False
                Set wbReturn = Workbooks.Open(sFullName, , , , "ThisIsDefinitelyAPasswordThatNooneHasUsed681")
            End If
        On Error GoTo 0
    
        Set wb_get_workbook = wbReturn
    
    End Function
    

    Will also throw an error, if it is password protected, and if it is not, then it would not care about the password you are providing. I am trying in VBA, but in C# you use the Excel Application object, so it should not be different.

    0 讨论(0)
  • 2020-12-17 19:49

    I found a solution, but i will accept other working answers

    Problem

    When passing an empty string as password the excel consider it as nothing. So it ask for a password and show the dialog.

    Solution

    The solution is to pass a single quotation as a password, excel will consider it as empty string. If workbook is not password protected it will open, else it will throw the following exception

    The password you supplied is not correct. Verify that the CAPS LOCK key is off and be sure to use the correct capitalization

    The code will be:

    m_xlWrkb = m_xlWrkbs.Open(strFile, Password:="'")
    

    Note

    In microsoft excel, single quotation on the beginning of a value is used to force text formatting.

    example; '0 is readed as a text of value 0

    0 讨论(0)
  • 2020-12-17 20:07

    Do not use Nothing for method arguments you do not want to supply.

    Instead of:

    m_xlWrkb = m_xlWrkbs.Open(strFile, Nothing, Nothing, Nothing, "", Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing)
    

    use any of the following:

    m_xlWrkb = m_xlWrkbs.Open(strFile, Password:="")
    

    or

    m_xlWrkb = m_xlWrkbs.Open(strFile, , , , "", , , , , , , , , , )
    

    or

    Dim missing As System.Reflection.Missing = System.Reflection.Missing.Value
    m_xlWrkb = m_xlWrkbs.Open(strFile,missing, missing, missing, "", missing, missing, missing, missing, missing, missing, missing, missing, missing, missing)
    

    If the Workbook is password protected, doing this will cause a COMException to be thrown with a message of:

    "The password you supplied is not correct. Verify that the CAPS LOCK key is off and be sure to use the correct capitalization."

    If the Workbook is not password protected, no exception will be thrown assuming the file is accessible.

    You can also define the "missing" object shown above like this:

    Dim missing As Object = Type.Missing
    

    Type.Missing and System.Reflection.Missing refer to the same object.

    0 讨论(0)
提交回复
热议问题