none
ERROR Exception from HRESULT: 0x800A03EC RRS feed

  • Pregunta

  • Hola a todos, estoy desarrollando un sistema en vb.net, en una parte del sistema creo uno o varios archivos excel, al guardarlos y de existir ya el archivo me hace la pregunta normal si deseo reescribirlo, si respondo SI todo normal, pero si respondo NO me da Exception from HRESULT: 0x800A03EC, la linea de comando donde  lo hago es la siguiente:

    objLibroExcel.SaveAs(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & drogueria & " " & Trim(cmbFecha.Text))
    

    Muchas gracias de antemano por la ayuda que me puedan dar.

    martes, 26 de junio de 2018 14:28

Respuestas

  • "Rafael Rubio" escribió:

    > ... en una parte del sistema creo uno o varios archivos excel, al guardarlos y de
    > existir ya el archivo me hace la pregunta normal si deseo reescribirlo, si respondo
    > SI todo normal, pero si respondo NO me da Exception from HRESULT: 0x800A03EC, la
    > linea de comando donde  lo hago es la siguiente:
    >
    > objLibroExcel.SaveAs(...)

    Hola, Rafael:

    Digo yo que te aparecerá ese mensaje de error porque tú mismo le estás indicando que muestre dicho mensaje de error, ya que seguramente en el bloque Catch tendrás algo parecido a lo siguiente:

        Try
            ' Código para ejecutar.

        Catch ex As Exception
            ' Mostrar el mensaje de error.
            MessageBox.Show(ex.Message)

        End Try

    Lo que tienes que hacer es capturar una excepción del tipo COMException, que son las que normalmente desencadenará el objeto de Excel que estás utilizando, y NO MOSTRAR al usuario ningún mensaje de error:

        Try
            ' Código para ejecutar.
            ' ...
    ' ...
    ' ...
    objLibroExcel.SaveAs(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "drogueria" & " " & cmbFecha.Text.Trim()))
    Catch ex As Runtime.InteropServices.COMException ' Excepciones del tipo COMException If (ex.ErrorCode = -2146827284) Then ' Mensaje de error 'Excepción de HRESULT: 0x800A03EC' ' If (Not objLibroExcel Is Nothing) Then
    ' Indicar que el libro ya ha sido guardado. objLibroExcel.Saved = True End If End If Catch ex As Exception ' En último lugar capturamos otras excepciones diferentes a COMException
      If (Not objLibroExcel Is Nothing) Then
    ' Indicar que el libro ya ha sido guardado.
                objLibroExcel.Saved = True
            End If
    ' Mostrar el mensaje de error. MessageBox.Show(ex.Message) End Try

    ¿Que te da igual el tipo de excepción COMException que se haya producido? Entonces lo correcto sería derivar el cierre del objeto y limpieza de objetos al bloque Finally:

        ' Variable local que indica que se ha capturado un error.
        Dim errorCatched As Boolean
    
        Try
            ' Código para ejecutar.
            ' ...
            ' ...
            ' ...
            objLibroExcel.SaveAs(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "drogueria" & " " & cmbFecha.Text.Trim()))
    Catch ex As System.Runtime.InteropServices.COMException ' Excepciones del tipo COMException. Sin implementación. errorCatched = True Catch ex As Exception ' En último lugar capturamos otras excepciones diferentes a COMException ' Mostrar el mensaje de error. MessageBox.Show(ex.Message) errorCatched = True Finally If ((Not objLibroExcel Is Nothing) AndAlso (errorCatched )) Then ' Se ha capturado un error; indicar que el libro ha sido guardado. objLibroExcel.Saved = True End If ' Resto del código de cierre y destrucción de objetos de Excel que estés utilizado en tu código. End Try

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    martes, 26 de junio de 2018 14:56
    Moderador

Todas las respuestas

  • "Rafael Rubio" escribió:

    > ... en una parte del sistema creo uno o varios archivos excel, al guardarlos y de
    > existir ya el archivo me hace la pregunta normal si deseo reescribirlo, si respondo
    > SI todo normal, pero si respondo NO me da Exception from HRESULT: 0x800A03EC, la
    > linea de comando donde  lo hago es la siguiente:
    >
    > objLibroExcel.SaveAs(...)

    Hola, Rafael:

    Digo yo que te aparecerá ese mensaje de error porque tú mismo le estás indicando que muestre dicho mensaje de error, ya que seguramente en el bloque Catch tendrás algo parecido a lo siguiente:

        Try
            ' Código para ejecutar.

        Catch ex As Exception
            ' Mostrar el mensaje de error.
            MessageBox.Show(ex.Message)

        End Try

    Lo que tienes que hacer es capturar una excepción del tipo COMException, que son las que normalmente desencadenará el objeto de Excel que estás utilizando, y NO MOSTRAR al usuario ningún mensaje de error:

        Try
            ' Código para ejecutar.
            ' ...
    ' ...
    ' ...
    objLibroExcel.SaveAs(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "drogueria" & " " & cmbFecha.Text.Trim()))
    Catch ex As Runtime.InteropServices.COMException ' Excepciones del tipo COMException If (ex.ErrorCode = -2146827284) Then ' Mensaje de error 'Excepción de HRESULT: 0x800A03EC' ' If (Not objLibroExcel Is Nothing) Then
    ' Indicar que el libro ya ha sido guardado. objLibroExcel.Saved = True End If End If Catch ex As Exception ' En último lugar capturamos otras excepciones diferentes a COMException
      If (Not objLibroExcel Is Nothing) Then
    ' Indicar que el libro ya ha sido guardado.
                objLibroExcel.Saved = True
            End If
    ' Mostrar el mensaje de error. MessageBox.Show(ex.Message) End Try

    ¿Que te da igual el tipo de excepción COMException que se haya producido? Entonces lo correcto sería derivar el cierre del objeto y limpieza de objetos al bloque Finally:

        ' Variable local que indica que se ha capturado un error.
        Dim errorCatched As Boolean
    
        Try
            ' Código para ejecutar.
            ' ...
            ' ...
            ' ...
            objLibroExcel.SaveAs(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "drogueria" & " " & cmbFecha.Text.Trim()))
    Catch ex As System.Runtime.InteropServices.COMException ' Excepciones del tipo COMException. Sin implementación. errorCatched = True Catch ex As Exception ' En último lugar capturamos otras excepciones diferentes a COMException ' Mostrar el mensaje de error. MessageBox.Show(ex.Message) errorCatched = True Finally If ((Not objLibroExcel Is Nothing) AndAlso (errorCatched )) Then ' Se ha capturado un error; indicar que el libro ha sido guardado. objLibroExcel.Saved = True End If ' Resto del código de cierre y destrucción de objetos de Excel que estés utilizado en tu código. End Try

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    martes, 26 de junio de 2018 14:56
    Moderador
  • Gracias Enrique por la pronta respuesta, era justo lo que andaba buscando.

    Saludos.

    jueves, 28 de junio de 2018 11:43