Error de Excel HRESULT:0x800A03EC al intentar obtener el rango con el nombre de la celda

 C Programming >> Programación C >  >> Tags >> Excel
Error de Excel HRESULT:0x800A03EC al intentar obtener el rango con el nombre de la celda

Estoy trabajando con el proyecto Window Service. que tienen que escribir datos en una hoja en un archivo de Excel en una secuencia de tiempos.

Pero a veces, solo a veces, el servicio arroja la excepción "Excepción de HRESULT:0x800A03EC" mientras intenta obtener el rango con el nombre de la celda.

He puesto el código para abrir la hoja de Excel y obtener la celda aquí.

  • SO:servidor de ventanas 2003 Office:
  • Microsoft Office 2003 sp2

1:Abrir hoja de Excel

m_WorkBook = m_WorkBooks.Open(this.FilePath, 0, false, 5,
     "", "", true, Excels.XlPlatform.xlWindows, ";",
     true, false, 0, true, 0, 0);

2:Hacer que la celda escriba

protected object m_MissingValue = System.Reflection.Missing.Value;
Range range = m_WorkSheet.get_Range(cell.CellName, m_MissingValue);
// error from this method, and cell name is string.

El código de error 0x800A03EC (o -2146827284) significa NOMBRE_NO_ENCONTRADO; en otras palabras, ha pedido algo y Excel no puede encontrarlo.

Este es un código genérico, que puede aplicarse a muchas cosas que no puede encontrar, p. usando propiedades que no son válidas en ese momento como PivotItem.SourceNameStandard lanza esto cuando un PivotItem no tiene un filtro aplicado. Worksheets["BLAHBLAH"] lanza esto, cuando la hoja no existe, etc. En general, está pidiendo algo con un nombre específico y no existe. En cuanto a por qué, será necesario investigar un poco de tu parte.

Verifique que su hoja definitivamente tenga el Rango que está solicitando, o que el .CellName definitivamente está devolviendo el nombre del rango que está solicitando.

Me encontré con este error porque estaba intentando escribir una cadena en una celda que comenzaba con un "=".

La solución fue poner un "'" (apóstrofe) antes del signo igual, que es una forma de decirle a Excel que, de hecho, no está tratando de escribir una fórmula y solo quiere imprimir el signo igual.

Recibí el error con un espacio en un nombre de hoja:

using (var range = _excelApp.Range["Sheet Name Had Space!$A$1"].WithComCleanup())

Lo arreglé poniendo comillas simples alrededor de los nombres de las hojas con espacios:

using (var range = _excelApp.Range["'Sheet Name Had Space'!$A$1"].WithComCleanup())

El significado de los completamente indocumentados el error 800A03EC (¡lástima de Microsoft!) es algo así como "OPERACIÓN NO COMPATIBLE".

Puede pasar

  • cuando abre un documento que tiene un contenido creado por una versión más reciente de Excel, que su versión actual de Excel no comprende.
  • cuando guarda un documento en la misma ruta desde donde lo cargó (el archivo ya está abierto y bloqueado)

Pero principalmente verá este error debido a errores graves. en Excel.

  • Por ejemplo, Microsoft.Office.Interop.Excel.Picture tiene una propiedad "Habilitada". Cuando lo llames, deberías recibir un valor bool. Pero en su lugar obtiene un error 800A03EC. Esto es un error.
  • Y hay un error muy gordo en Exel 2013 y 2016:cuando automatiza un proceso de Excel y configura Application.Visible=true y Application.WindowState = XlWindowState.xlMinimized luego obtendrá cientos de errores 800A03EC de diferentes funciones (como Range.Merge(), CheckBox.Text, Shape.TopLeftCell, Shape.Locked y muchas más). Este error no existe en Excel 2007 y 2010.

Encontré una posible solución aquí:http://www.made4dotnet.com/Default.aspx?tabid=141&aid=15

Editar:

Si automatiza Microsoft Excel con Microsoft Visual Basic .NET, Microsoft Visual C# .NET o Microsoft Visual C++, es posible que reciba los siguientes errores al llamar a ciertos métodos porque la máquina tiene la configuración regional distinta del inglés estadounidense (ID de configuración regional o LCID 1033):

Excepción de HRESULT:0x800A03EC

y/o

Formato antiguo o biblioteca de tipos no válidos

SOLUCIÓN 1:

Para sortear este error, puede establecer CurrentCulture en en-US al ejecutar código relacionado con Excel y restablecer su original usando estas 2 funciones.

//declare a variable to hold the CurrentCulture
System.Globalization.CultureInfo oldCI;
//get the old CurrenCulture and set the new, en-US
void SetNewCurrentCulture()
{
  oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
  System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
}
//reset Current Culture back to the originale
void ResetCurrentCulture()
{
  System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
}

SOLUCIÓN 2:

Otra solución que podría funcionar es crear un directorio 1033 en Microsoft OfficeOffice11 (o su versión de oficina correspondiente), copiar excel.exe en el directorio 1033 y cambiarle el nombre a xllex.dll.

Aunque es posible que resuelva el problema con una de estas soluciones, cuando llama al modelo de objetos de Excel en configuraciones regionales que no sean inglés de EE. UU., el modelo de objetos de Excel puede actuar de manera diferente y su código puede fallar de maneras en las que quizás no haya pensado. Por ejemplo, podría tener un código que establezca el valor de un rango en una fecha:

suRango.Valor2 =“10/10/09”

Según la configuración regional, este código puede actuar de manera diferente, lo que hace que Excel coloque en el rango cualquiera de los siguientes valores:

10 de octubre de 2009
10 de septiembre de 2009
9 de octubre de 2010

Tuve este problema cuando intentaba usar la función range.AddComment(). Pude resolver esto llamando a range.ClearComment() antes de agregar el comentario.

Recibí esto cuando olvidé desproteger el libro de trabajo o la hoja.

He encontrado este código de error al enumerar nombres y llamar a worksheet.get_Range(name). Parece ocurrir cuando el nombre NO se aplica a un rango, en mi caso es el nombre de una macro.

Usando la respuesta de Dominic, encontré que la respuesta a mi problema específicamente era un DateTiime no válido en los datos de origen antes de que se aplicara al rango. En algún lugar entre la base de datos, .NET y Excel, la conversión de la fecha por defecto fue "1/1/1899 12:00:00 AM". Tuve que comprobarlo y convertirlo en una cadena vacía y me lo arregló.

if (objectArray[row, col].ToString() == "1/1/1899 12:00:00 AM")
{
    objectArray[row, col] = string.Empty;
}

Este es probablemente un ejemplo bastante específico, pero con suerte le ahorrará tiempo a alguien más si está tratando de rastrear una pieza de datos no válidos.

Me encontré con un error similar al ejecutar Excel en VBA, lo que aprendí es que cuando obtengo datos de MSSQL y luego uso get_range y .Value2 aplicar está fuera del rango, cualquier valor que fuera del tipo uniqueidentifier (GUID) resultó en este error.
Solo cuando convierto el valor en nvarcahr(max) funcionó.

Lo suficientemente interesante, este error también ocurre, en el momento de la apertura cuando el .XLS? el archivo está formado incorrectamente o requiere reparaciones.

Un error difícil de encontrar es demasiadas filas en un archivo .xls (Excel antiguo).

Pruébelo:abra manualmente el archivo afectado con Excel Desktop.

Utilizo la automatización para procesar unos cientos de archivos al día. Cuando aparece este error, notifico al propietario por correo electrónico y guardo el archivo sin procesar en una ubicación temporal.

Hola, estaba enfrentando el mismo problema

Pasos

  1. asegúrese de acceder al archivo de Excel, no en modo de solo lectura (modo protegido) mientras intenta editar y guardar los cambios.

  2. Si sucede después de eso, también puede ir al archivo de Excel->Opciones->Fórmulas
    y aquí deshabilitar la verificación de errores (que es la causa de casi la mayoría de los errores HRESULT)

Si puede copiar toda la excepción, sería mucho mejor, pero una vez que me enfrenté a esta excepción y esto se debe a que la función que llama desde su archivo dll, que supongo que es Aspose.dll, no se ha firmado bien. Creo que sería el posible duplicado de este

FYI, para averiguar si su dll no se ha firmado correctamente, debe hacer clic con el botón derecho en eso e ir a la firma y le dirá si se ha firmado electrónicamente bien o no.