Virhe: Muoto on vanha tai tyyppikirjasto ei kelpaa -virhesanoma tulee näyttöön Excelin automatisoimisen yhteydessä

Oire

Jos automatisoit Microsoft Excelin Microsoft Visual Basic .NETin, Microsoft Visual C# .NETin tai Microsoft Visual C++:n avulla, saatat kohdata seuraavan virheen tiettyjen menetelmien kutsumisen yhteydessä:
Virhe: 0x80028018 (-2147647512)
Kuvaus: Muoto on vanha tai tyyppikirjasto ei kelpaa

Syy

Tämä virhe tulee näyttöön, kun Excel-menetelmää kutsutaan seuraavien ehtojen toteutuessa:
  • Menetelmä edellyttää LCID-tunnuksen (kieliasetuksen tunnuksen).
  • Käytössä on Excelin englanninkielinen versio. Tietokoneen aluekohtaiset asetukset on kuitenkin määritetty muuta kuin englannin kieltä varten.
Jos asiakastietokone suorittaa Excelin englanninkielistä versiota ja nykyisen käyttäjän kieliasetus on jokin muu kuin englanti, Excel yrittää löytää määritetyn kielen kielipaketin. Jos kielipakettia ei löydy, ilmoitetaan virheestä.

Workaround

Voit kiertää ongelman jommallakummalla seuraavista tavoista:
  • Asenna Office-versiosi Multilingual User Interface Pack -paketti.
  • Suorita Excel-menetelmä tai -ominaisuus InvokeMember-menetelmän avulla niin, että voit määrittää kutsulle CultureInfo-luokan. Seuraavassa koodissa esitellään, miten voit käynnistää Workbooks-objektin Add-menetelmän käyttämällä asetusta en-US CultureInfo-luokkana:
    Dim oApp As New Excel.Application()
    oApp.Visible = True
    oApp.UserControl = True
    Dim oBooks As Object = oApp.Workbooks
    Dim ci As System.Globalization.CultureInfo = New System.Globalization.CultureInfo("en-US")
    oBooks.GetType().InvokeMember("Add", Reflection.BindingFlags.InvokeMethod, Nothing, oBooks, Nothing, ci)
  • Voit myös määrittää CultureInfo-luokan ennen Excel-menetelmän kutsumista. Esimerkki:
    Dim oApp As New Excel.Application()
    oApp.Visible = True
    oApp.UserControl = True
    Dim oldCI As System.Globalization.CultureInfo = _
    System.Threading.Thread.CurrentThread.CurrentCulture
    System.Threading.Thread.CurrentThread.CurrentCulture = _
    New System.Globalization.CultureInfo("en-US")
    oApp.Workbooks.Add()
    System.Threading.Thread.CurrentThread.CurrentCulture = oldCI

Kun käytät jotakin näistä kiertotavoista tietokoneelle, jonka aluekohtaiset asetukset eivät vastaa Officen nykyistä kieliversiota, sinun tulee tietää, miten Excel käyttäytyy ja tulkitsee tiettyä kieliversiota varten mahdollisesti muotoillut tiedot. Lisätietoja globalisoitujen Excel-ratkaisujen kirjoittamisesta Visual Studio .NETiä varten on seuraavissa MSDN-artikkeleissa:

Creating Office Solutions for Use in Multiple Countries/Regions (Office-ratkaisujen luominen käytettäväksi useissa maissa tai useilla alueilla) Globalization and Localization Issues for Solutions Created with Microsoft Visual Studio Tools for the Microsoft Office System (Microsoft Visual Studio Tools -työkalujen avulla Microsoft Office systemiä varten luotujen ratkaisujen globalisointi- ja lokalisointiongelmat)

Tila

Microsoft on vahvistanut, että tämä virhe esiintyy artikkelin alussa luetelluissa Microsoftin tuotteissa.

Enemmän tietoa

Ongelman toistamisen vaiheet

  1. Varmista, että tietokoneen kieliasetus on muu kuin englanti.

    Windows 2000:
    1. Kaksoisnapsauta Ohjauspaneelin Aluekohtaiset asetukset -kuvaketta.
    2. Valitse Yleiset-välilehdessä sijainti ja valitse sitten OK.
    Windows XP tai Windows Server 2003:
    1. Avaa Ohjauspaneelista Aluekohtaiset- ja kieliasetukset.
    2. Valitse Aluekohtaiset asetukset -välilehdessä kieliasetus ja valitse sitten OK.
  2. Käynnistä Microsoft Visual Studio .NET.
  3. Valitse File-valikosta New ja valitse sitten Project. Valitse New Project -valintaikkunan Project Types -kohdassa Visual Basic Projects. Valitse Templates-kohdassa Windows Application ja valitse sitten OK. Oletusarvon mukaan luodaan Form1.
  4. Valitse View-valikosta Toolbox ja lisää sitten painike Form1-lomakkeeseen.
  5. Tuo lomakkeen koodi-ikkuna näyttöön kaksoisnapsauttamalla Button1.
  6. Korvaa koodi-ikkunassa seuraava koodi:
    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) _
    Handles Button1.Click
    End Sub
    seuraavalla koodilla:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim oApp As Object
    Dim oDoc As Object
    oApp = CreateObject("Excel.Application")
    oApp.Visible = True
    oDoc = oApp.Workbooks.Add
    oDoc.Close()
    oApp.Quit()
    oDoc = Nothing
    oApp = Nothing
    End Sub
  7. Lisää seuraava rivi Form1-koodimoduulin alkuun:
    Option Strict Off
  8. Muodosta ja suorita ohjelma painamalla F5-näppäintä.
  9. Luo virhe napsauttamalla Button1. Virhe ilmenee seuraavalla rivillä:
    oDoc = oApp.Workbooks.Add

Suositukset

Lisätietoja Office-automatisoinnista on seuraavassa Microsoft Office Developmentin verkkosivustossa: Lue lisätietoja seuraavista Microsoft Knowledge Base -tietokannan artikkeleista:
301982 Microsoft Excelin automatisoiminen Visual Basic .NETin avulla (tämä artikkeli saattaa olla englanninkielinen)
302084 Microsoft Excelin automatisoiminen Microsoft Visual C# .NETin avulla (tämä artikkeli saattaa olla englanninkielinen)
Ominaisuudet

Artikkelin tunnus: 320369 – Viimeisin tarkistus: 29.4.2008 – Versio: 1

Palaute