Ошибка при импорте в Excel

Я пытаюсь импортировать около 1500 файлов Excel в свою систему. Код работает в цикле, и я могу открывать и импортировать около 600 файлов Excel. После этого я получаю сообщение об ошибке вроде: Ошибка вызова функции внешнего объекта в строке 55 …..

Я действительно придерживался этой проблемы, если кто-то может помочь, это будет благодарно.


Код отправлен в ответные комментарии:

For ll_LoopCnt = 1 To Dw_1.rowcount( ) Ls_File_Name = Dw_1.getitemstring( ll_LoopCnt, "file_name") Ls_Path =Dw_1.getitemstring( ll_LoopCnt, "file_path") ll_Sr_No= Dw_1.getitemNumber( ll_LoopCnt, "sr_no") ldt_File_Date= Dw_1.getitemDateTime( ll_LoopCnt, "file_date") Excel.Application.DisplayAlerts = "False" Excel.WorkBooks.Open( Ls_Path ) Excel.Application.Visible = False Excel.windowstate = 2 // 1 : Normal, 2 : Minimize, 3 : Maximize Excel.Application.CutCopyMode = False Lb_sheet_rtn = excel.worksheets(7).Activate Ls_ClipBoard = clipboard() Excel.Application.ActiveWorkbook.Save() Excel.Worksheets(7).UsedRange.Copy ll_cnt = ds_1.importclipboard() IF ll_cnt <= 1 THEN Messagebox("Error", "Could not find.") Else Dw_1.Scrolltorow( ll_LoopCnt ) Dw_1.SetItem( ll_LoopCnt, "status", 'Success') For ll_Inner_LoopCnt = 1 To Ds_1.RowCount( ) Ds_1.Object.file_path[ll_Inner_LoopCnt] = Ls_Path Ds_1.Object.file_name[ll_Inner_LoopCnt] = Ls_File_Name Ds_1.Object.file_sr_no[ll_Inner_LoopCnt] = ll_Sr_No Ds_1.Object.file_date[ll_Inner_LoopCnt] = ldt_File_Date Next END IF Clipboard(ls_ClipBoard) Ds_1.Reset( ) //Reset the data store Excel.Application.ActiveWorkbook.Save() Excel.Application.ActiveWorkbook.Close(False); Excel.Application.Quit Excel.Application.CutCopyMode = False IF ll_LoopCnt = ll_Excel_Cnt Then //--->> After 100 files reset the memmory ll_Excel_Cnt = ll_LoopCnt + 100 Excel.DisConnectObject() DESTROY excel DESTROY TEst_Excel GarbageCollect ( ) Excel = Create OLEObject Test_Excel = Create OLEObject Li_rtn = excel.ConnectToNewObject("excel.application") IF li_rtn <> 0 THEN MessageBox('Excel error','can not run Excel Program') DESTROY Excel RETURN 0 END IF End IF Next Excel.displayalerts = False Excel.Application.Quit Excel.displayalerts = True Excel.DisConnectObject() DESTROY Excel DESTROY Test_Excel /* This is the code i written i dont think the OLE is crashing i think the connnectto the OLE is getting lost after some time, but stile its going fine for almost 600 records.. */ 

Видеть строку кода поможет, но это сообщение об ошибке обычно (в контексте OLE, которое, как я предполагаю, здесь имеет место) происходит от PowerBuilder, вызывающего вызов OLE, который отклоняет узел OLE. Из предоставленной вами информации невозможно определить, был ли поврежден узел OLE и больше не отвечает, или если хост OLE находится в состоянии, когда эти функции больше не применимы, или если объект OLE стало недействительным, или что.

Если бы это был я, и это происходило последовательно, я бы запустил приложение в отладчике, чтобы добраться до состояния, в котором произойдет ошибка (вы можете установить дополнительные атрибуты в точках останова, чтобы не активировать прерывание каждый раз, когда это ) и попробуйте опросить объекты OLE. Я ожидаю, что вам также придется вставить какой-нибудь тестовый код, так как я не уверен, что все, что вы хотите проверить, будет доступно для отладчика.


Новый 21 февраля

Я также изменил бы набор обрабатываемых файлов, чтобы я мог определить, является ли ключ к сбою конкретным файлом или количеством обработанных файлов. Например, если вы избавитесь от первых 100 файлов, он по-прежнему падает на 600-й файл (такое же количество) или на 500-й файл (тот же файл)?

Одна из возможностей заключается в том, что у вас заканчивается память. Каждая «точка» в ссылке OLE (доступ атрибута, вызов метода) создает объект в памяти, который не уничтожается до сбора мусора. Клип кода, который вы опубликовали, никогда не войдет в блок, где вызывается GarbageCollect () (ll_Excel_Cnt никогда не инициализируется), поэтому вы можете захотеть убедиться, что эта часть работает. Я также избавился бы от ненужных звонков. Например, у вас есть несколько вызовов, поддерживающих состояние Excel в цикле (например, Excel.Application.Visible), когда их нужно только один раз вызывать. Я также не понимаю, из кода, почему вам нужно вызвать Save (), либо время; это тоже можно расходуть. Эта очистка также должна ускорить работу вашего кода.


Удачи,

Терри

Вокруг линии 30 у вас есть

 Excel.Application.ActiveWorkbook.Save() Excel.Application.ActiveWorkbook.Close(False); Excel.Application.Quit 

Вы не должны вызывать Excel.Application.Quit . Кроме того, я всегда рекомендую поместить все, что использует OLE внутри блока Try..Catch и уловить OleRuntimeError и RuntimeError.

Interesting Posts

Определенная пользователем функция Excel VBA с параметрами десятичного типа

совпадение индекса с подстановочными знаками и несколькими критериями

Как скрыть столбец при экспорте в Excel из SSRS

Использование символа hash (#) в имени листа Excel

Vlookup возвращает ошибку, когда элемент находится в списке

VBA Skippin второй сложный Do Loop

Горизонтальный поиск по нескольким критериям

PHPExcel идентифицирует файл .xlsx как файл CSV

есть другой способ записи диапазона

Поиск значения в excel или vba

Как передать значение EffectiveUserName в SSAS через службу Excel с использованием FBA (проверка подлинности на основе форм) в SharePoint 2013

Найти столбца даты

Запросить веб-сайт со значением из листа google, очистить данные с страницы результатов и импортировать данные на тот же лист

Каковы преимущества и недостатки Passed Arrays vs Global Arrays в Excel VBA

Excel: как подсчитать появление определенного цвета (зеленый) в строке?

Давайте будем гением компьютера.