Jdi na obsah Jdi na menu
 


Office 2000 - Chyba v BuiltinDocumentProperties

24. 1. 2010

Pracuji na projektu který transformuje data z aplikace MS Word do sešitu MS Excel. Projekt jako takový funguje již několik let a doplňují se do něj pouze nové funkce a opravuji chyby. Při zpracování jednoho z tisíce dokumentů jsme začli dostávat podivné chyby pocházející z C++ - ony známe chyby s chybovým kódem např. -2147417851, které nikdy nic nikomu neřeknou. Velice podrobným zkoumáním jsem přišel na zvláští chování objektu BuiltInDocumentProperties, který pro specifické zadání dat zcela skrytě a bez chybové hlášky zničí instanci třídy aplikace MS Excel!

Celý kód je spouštěn z šablony MS Word kde je vytvořena instance třídy MS Excel a poté, se z dokumentu MS Word transformují data do aplikace MS Excel a zároveň se využívá objektu BuiltInDocumentProperties kde se - např. zde do kolonky Author - zapisují souhrné informace z dokumentu. Vše funguje perfektně až do doby, kdy se pokouším zapsat data do kolonky Author, které mají počet znaků od 252 do 255.


objWkb.BuiltInDocumentProperties("Author") = strText


Při této délce znaků dochází k zcela skrýtému zničení třídy aplikace MS Excel a chyba se pak projeví až při prvním dalším pokusu o práci s instanci třídy. ( v přiloženém kódu jsem použil metodu PageSetup a vlastnost LeftFooter ). Chyba je o to zvláštní, že při zápisu více jak 255 znaků k chybě nedochází. Také na systému Office 2007 tato chyba nenastavá. Nikdy jsem se nepotkal s tak zvláštní chybou - proč zrovna toto rozmezí počtu znaků je smrticí je mi velkou záhadou. Vypadá to, že jde o nezdokumentovanou chybu a jak jsem napsal výše vyskytuje se pouze pro Office 2000. ( Vyzkoušel jsem chování kódu na Office 2003 EN a Win XP Prof SP2 a proběhlo bez chyby ).
Chyba se navíc extremně špatně hledala. K destrukci třídy došlo v úplně jiném modulu než se následně objevila chyba, která navíc nijak nesouvisela s předchozí činnosti.

Výše uvedené chování kódu jsem schopen kdykoliv reprodukovat na Win XP Prof SP2 EN a Office 2000 SP3 EN.
Přikládám kód na kterém jsem ověřoval funkčnost. Kód se vkláda do aplikace MS Word. Pokud byste měli chuť zkuste otestovat na Vašem systému a napište do komentářů jestli máte možnost vidět stejné chování - jen tak pro zajimavost.

'********************************************************************************
'TestZruseniTridy_Office2000
'
' Purpose:  Pri pokusu zapsat data do objektu BuiltInDocumentProperties("Author")
'           o delce mezi 252 az 255 znaky bude zcela tise a bez jakekoliv
'           chybove hlasky znicena instance tridy Excel. Chyba se nasledne
'           projevi az pri pokusu o jakoukoliv praci s tridou Excel resp.
'           tridou pro excelovsky sesit.
'           NOTE: KOD SE SPOUSTI Z APLIKACE MS WORD
'
' Inputs:   -none-
'
' Outputs:  -none-
'
' Created:  24/01/2010  Premysl Lazecky
'
' Modified: .
'
'********************************************************************************

Sub TestZruseniTridy_Office2000()
    
    Dim objExcelApp As Object 'Excel.Application
    Dim objWkb      As Object 'Excel.Workbook
    Dim strText     As String
    Dim i           As Byte

    On Error GoTo ErrorHandler
            
    ' vytvoreni instance tridy MS Excel
    'Set objExcelApp = New Excel.Application
    Set objExcelApp = CreateObject("Excel.Application")
    Set objWkb = objExcelApp.Workbooks.Add
    
    objExcelApp.Visible = True
    objExcelApp.ScreenUpdating = True
    
    ' vlozeni znaku o delce 251 znaku = NEvyvola chybu
    'strText = String$(251, "a")
    ' vlozeni znaku o delce 252 znaku = VYvola chybu
    strText = String$(252, "a")
    ' vlozeni znaku o delce 256 znaku = NEvola chybu
    'strText = String$(256, "a")
    
    ' zapis do pole Author
    objWkb.BuiltinDocumentProperties("Author") = strText
    
    ' zde muze byt jakykoliv dlouhu kus kodu, pokud se nepokusite
    ' pristoupit k instanci tridy MS Excel vse pracuje perfektne
    ' Z toho vyplyva jak extremne spatne se dana chyba hledala.
    ' Chyba totiz nastala uplne v jinem modulu pri zcela nesouvisejici cinnosti
    Debug.Print Now
    
    ' pokus o zapis do zapati listu (pokus pouzit znovu tridu)
    objWkb.Sheets(1).PageSetup.LeftFooter = "Cokoliv"
        
ExitRoutine:
    objWkb.Close False
    objExcelApp.Quit
    
    Set objExcelApp = Nothing
    Set objWkb = Nothing
    Exit Sub
    
ErrorHandler:
    MsgBox "Neznama chyba" & vbNewLine & _
           "Popis chyby: " & Err.Description & vbNewLine & _
           "Cislo chyby: " & Err.Number, vbCritical
   GoTo ExitRoutine
  
End Sub

Obrazek

 

Komentáře

Přidat komentář

Přehled komentářů

Zvlastni

(Premek, 26. 1. 2010 9:51)

Tak jeste to muze byt zpusobeno jazykovou odlisnosti, ve firme kde mame jen anglicke office a anglicke windowsy to pada vsude.

Chybu nemohu zreprodukovat

(mkarlik@spolana.cz, 26. 1. 2010 7:45)

Dobry den,

mam MS Office 2000 Cz SP3 a chyba se u mne neprojevuje. Zkopiroval jsem makro, spustil ve Wordu a nic. Zadna neznama chyba, ale ani zapati v listu pri spusteni nahledu.

Pozdravuje Michal Karlik

PS: Nejsem si jist, zda-li jsem na tomto pocitaci take neinstaloval nejaky modul kompatibility s 2007.

 

 

 

Z DALŠÍCH WEBŮ

REKLAMA