2009-05-21 38 views
16

Estoy trabajando con el proyecto del Servicio de ventanas. que tiene que escribir datos en una hoja en un archivo de Excel en una secuencia veces.Error de Excel HRESULT: 0x800A03EC al intentar obtener el rango con el nombre de la celda

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

He puesto el código de apertura de hoja de Excel y obteniendo la celda aquí.

  • OS: servidor de ventanas 2003 Oficina:
  • Microsoft Office 2003 SP2

1: Apertura hoja de Excel

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

2: Obtención de células a escribir

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. 
+0

la forma en que dices "solo algunas veces" me hace pensar en la respuesta a esto: http://stackoverflow.com/questions/20422387/adding-formula-to-cell-exception-from-hresult-0x800a03ec/26591841# 26591841 –

+0

Tengo el mismo problema En el código C# escribí 'xApp.Cells (3, 1) .FormulaR1C1 =" = SUMA (R [-2] C: R [-1] C) "': falla; luego 'xApp.Cells (3, 1) .FormulaR1C1 =" = (R [-2] C + R [-1] C) "': falla; y luego 'xApp.Cells (3, 1) .FormulaR1C1 =" = A1 + A2 "' éxito –

Respuesta

17

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

Este es un código genérico, que se puede aplicar a muchas cosas que no puede encontrar, p. el uso de propiedades que no son válidas en ese momento, como PivotItem.SourceNameStandard, arroja esto cuando un PivotItem no tiene un filtro aplicado. Worksheets["BLAHBLAH"] arroja esto, cuando la hoja no existe, etc. En general, estás pidiendo algo con un nombre específico y no existe. En cuanto a por qué, eso llevará un poco de excavación de tu parte.

Compruebe que su hoja definitivamente tiene el Rango que está solicitando, o que el .CellName definitivamente le devuelve el nombre del rango que está solicitando.

+3

puede proporcionar una referencia para corroborar su afirmación de que "El código de error 0x800A03EC (o -2146827284) significa NAME_NOT_FOUND"? No he podido encontrar ninguno ... – ForeverWintr

+0

@ForeverWintr: Estoy intentando desenterrar un enlace, pero esta respuesta fue de hace 10 meses y estaba basada en mi investigación en ese momento. También he estado construyendo una solución VSTO basada en Excel por un tiempo y he visto esto bastante cuando no puede encontrar un elemento por nombre, por rango, etc. Es un error muy genérico, por lo que puede aparecer en otras aplicaciones de Office y significa algo diferente (como archivos guardados, errores de automatización), pero si no funciona para este OP, me ayudó a resolver problemas similares en el pasado. –

+0

La razón por la que pregunto es por qué me he encontrado con 0x800A03EC con tanta frecuencia y con una gama tan diversa de llamadas en mi proyecto VSTO que estoy empezando a pensar que solo significa "error de Excel". Tu respuesta es la única referencia a "NAME_NOT_FOUND" con la que me he encontrado. – ForeverWintr

3

Encontré un posible sol Ution 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++, puede recibir los siguientes errores cuando se llama a ciertos métodos, porque la máquina tiene la configuración regional establecida en algo que no sea Estados Unidos Inglés (identificador de configuración regional o LCID 1033):

excepción de HRESULT: 0x800A03EC

y/o

Formato antiguo o biblioteca de tipos no válida

SOLUCIÓN 1:


Para solucionar este error se puede establecer CurrentCulture en-US al ejecutar código relacionado con Excel y restablecer de nuevo a su originale mediante el uso de estos 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 pudiera trabajar, crear un directorio 1033 en Microsoft Office \ Office11 (o su correspondiente oficina de la versión), copia excel.exe al directorio 1033, y cambiarle el nombre a xllex.dll. Aunque puede resolver el problema usando una de estas soluciones, cuando llama al modelo de objetos de Excel en otros idiomas que no sean inglés estadounidense, el modelo de objetos de Excel puede actuar de manera diferente y su código puede fallar de una manera que quizás no haya pensado . Por ejemplo, puede tener un código que establezca el valor de un rango en una fecha:

yourRange.Valor2 = "10/10/09"

Dependiendo de la configuración regional de este código puede actuar de manera diferente que resulta en Excel puesta en el rango de cualquiera de los siguientes valores:

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

+0

La solución 1 funcionó para mí. En francés, el equivalente de 'SUM' es 'SOMME'. Estaba diciendo '' SUM' via C# a mi Excel traducido al inglés. La fórmula estaba bien, pero Excel dijo '# NAME'. Después de hacer doble clic en la celda y presionar ENTER sin ningún cambio, Excel estaba dando el resultado de la fórmula. Se envía 'SOMME' en C# con el valor' SUM'. Entonces, la solución 1 me permitió enviar 'SUM' sin error. –

0

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.

2

que tiene el error con un espacio en el nombre de la hoja:

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

me fijo poniendo comillas simples nombres de las hojas con espacios:

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

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

FYI, con el fin de averiguar si su dll no se ha firmado bien debe hacer clic derecho sobre eso e ir a la signiture y le dirá si tiene sido electrónicamente bien firmado o no.

1

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

4

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

La solución fue colocar un "'" (apóstrofo) antes del signo igual, que es una manera de decirle a Excel que no está, de hecho, tratando de escribir una fórmula, y solo quiere imprimir los equivalentes firmar.

0

Lo tengo cuando olvidé desproteger el libro o la hoja.

0

El significado de completamente indocumentado error 800A03EC (¡lástima de Microsoft!) Es algo así como "OPERACIÓN NO APOYADA".

Puede suceder

  • cuando se abre un documento que tiene un contenido creado por una versión más reciente de Excel, que la versión actual de Excel no entiende.
  • al guardar un documento en la misma ruta en la que se ha cargado a partir de (archivo ya está abierto y cerrado)

Pero sobre todo usted verá este error debido a graves errores en Excel.

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

Usando la respuesta de Dominic encontré que la respuesta a mi problema era específicamente 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 predeterminada a "1/1/1899 12:00:00 AM". Tuve que comprobarlo y convertirlo en una cadena vacía y lo arreglé para mí.

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

Esto es probablemente un ejemplo muy específico, pero es de esperar que va a salvar a otra persona algún tiempo si están tratando de localizar a un conjunto de datos no válidos.

Cuestiones relacionadas