web-dev-qa-db-fra.com

Erreur Excel HRESULT: 0x800A03EC lors de la tentative d'obtention d'une plage avec le nom de la cellule

Je travaille avec le projet Windows Service. qui doivent écrire des données sur une feuille dans un fichier Excel dans une séquence fois.

Mais parfois, parfois, le service lève l'exception "Exception de HRESULT: 0x800A03EC" pendant qu'il essaie d'obtenir une plage avec le nom de la cellule.

J'ai mis le code d'ouverture feuille Excel, et obtenir la cellule ici.

  • OS: serveur de fenêtres 2003 Office:
  • Microsoft Office 2003 SP2

1: Ouvrir une feuille Excel

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

2: Obtenir une cellule pour écrire

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.
16
Teerasej

Le code d'erreur 0x800A03EC (ou -2146827284) signifie NAME_NOT_FOUND; En d'autres termes, vous avez demandé quelque chose et Excel ne le trouve pas. 

C’est un code générique, qui peut s’appliquer à beaucoup de choses qu’il ne trouve pas, par exemple. L'utilisation de propriétés qui ne sont pas valides à ce moment-là, comme PivotItem.SourceNameStandard, le renvoie lorsqu'un élément de tableau croisé dynamique n'a pas de filtre appliqué. Worksheets["BLAHBLAH"] jette ceci, lorsque la feuille n'existe pas, etc. En général, vous demandez quelque chose avec un nom spécifique et cela n'existe pas. Quant à savoir pourquoi, cela vous demandera de creuser.

Vérifiez que votre feuille a bien la plage que vous demandez, ou que le .CellName donne définitivement le nom de la plage que vous demandez.

17
Dominic Zukiewicz

J'ai rencontré cette erreur parce que je tentais d'écrire une chaîne dans une cellule qui commençait par un "=". 

La solution a été de mettre un "'" (apostrophe) avant le signe égal, ce qui est un moyen de dire à Excel que vous n'essayez pas en fait d'écrire une formule et que vous souhaitez simplement imprimer le signe égal.

4
ebrts

J'ai trouvé une solution possible ici: http://www.made4dotnet.com/Default.aspx?tabid=141&aid=15

Modifier:

Si vous automatisez Microsoft Excel avec Microsoft Visual Basic .NET, Microsoft Visual C # .NET ou Microsoft Visual C++, les erreurs suivantes peuvent s'afficher lorsque vous appelez certaines méthodes, car l'environnement local est défini sur autre chose que l'anglais des États-Unis (ID régional ou LCID 1033):

Exception de HRESULT: 0x800A03EC 

et/ou

Ancien format ou bibliothèque de types non valide

SOLUTION 1:


Pour contourner cette erreur, vous pouvez définir CurrentCulture sur en-US lors de l’exécution de code lié à Excel et revenir à votre version originale à l’aide de ces 2 fonctions.

//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;
}

SOLUTION 2:


Une autre solution pouvant fonctionner, créez un répertoire 1033 sous Microsoft Office\Office11 (ou votre version bureautique correspondante), copiez Excel.exe dans le répertoire 1033 et renommez-le en xllex.dll.

Bien que vous puissiez résoudre le problème en utilisant l'une de ces solutions, lorsque vous appelez le modèle d'objet Excel dans des environnements locaux autres que l'anglais américain, le modèle d'objet Excel peut agir différemment et votre code peut échouer de manière inattendue. Par exemple, vous pourriez avoir un code qui définit la valeur d'une plage à une date:

yourRange.Value2 = "10/10/09"

Selon les paramètres régionaux, ce code peut agir différemment, entraînant Excel à placer l'une des valeurs suivantes dans la plage:

10 octobre 2009 10 septembre 2009 9 octobre 2010

3
Ole

La signification de l'erreur 800A03EC (honte sur Microsoft!) Complètement undocumented ressemble à quelque chose comme "OPERATION NOT SUPPORTED".

Ça peut arriver 

  • lorsque vous ouvrez un document dont le contenu est créé par une version Excel plus récente, que votre version Excel actuelle ne comprend pas.
  • lorsque vous enregistrez un document dans le même chemin que celui où vous l'avez chargé (le fichier est déjà ouvert et verrouillé)

Mais surtout, vous verrez cette erreur en raison de graves bugs dans Excel.

  • Par exemple, Microsoft.Office.Interop.Excel.Picture a la propriété "Activé". Lorsque vous l'appelez, vous devriez recevoir une valeur booléenne. Mais au lieu de cela, vous obtenez une erreur 800A03EC. C'est un bug.
  • Et il existe un très gros bogue dans Exel 2013 et 2016: lorsque vous automatisez un processus Excel et définissez Application.Visible=true et Application.WindowState = XlWindowState.xlMinimized, vous obtenez des centaines d'erreurs 800A03EC provenant de différentes fonctions (telles que Range.Merge (), CheckBox.Text, Shape.TopLeftCell , Shape.Locked et beaucoup plus). Ce bogue n'existe pas dans Excel 2007 et 2010.
3
Elmue

J'ai eu l'erreur avec un espace dans un nom de feuille:

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

Je l'ai corrigé en mettant des guillemets simples autour des noms de feuille avec des espaces:

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

J'ai eu ce problème lorsque j'essayais d'utiliser la fonction range.AddComment (). J'ai pu résoudre ce problème en appelant range.ClearComment () avant d'ajouter le commentaire.

1
Jay

Je l'ai eu quand j'ai oublié de déprotéger un classeur ou une feuille.

0
Makatun

En utilisant la réponse de Dominic, j'ai trouvé que la réponse à mon problème était spécifiquement une DateTiime non valide dans les données source avant son application à la plage. Quelque part entre la base de données, .NET et Excel, la conversion de la date par défaut est "1/1/1899 12:00:00 AM". Je devais le vérifier et le convertir en une chaîne vide et le réparer pour moi.

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

C'est probablement un exemple assez spécifique, mais j'espère que cela permettra à quelqu'un d'autre de gagner un peu de temps s'il tente de retrouver une donnée invalide.

0
aaron

J'ai rencontré une erreur similaire lors de l'exécution d'Excel dans VBA. Ce que j'ai appris, c'est que lorsque je récupère des données à partir de MSSQL, puis que j'utilise get_range et .Value2, toutes les valeurs de type uniqueidentifier (GUID) résultent: cette erreur. Ce n'est que lorsque j'ai converti la valeur en nvarcahr(max) que cela a fonctionné.

0
Idan Youval

J'ai rencontré ce code d'erreur lors de l'énumération des noms et de l'appel à worksheet.get_Range (name). Cela semble se produire lorsque le nom NE s'applique PAS à une plage. Dans mon cas, il s'agit du nom d'une macro.

0
Jay