Форум » [x]Harbour » Скопировать лист Экселя? » Ответить

Скопировать лист Экселя?

SADSTAR4: Может глаз замылился Хочу скопировать лист из файла в новый [pre2] oExcel:Workbooks:Open(cFile) oBook:=oExcel:ActiveWorkbook() oBook:Activate() oBook:Worksheets(1):Activate() oSheet := oBook:Worksheets(1) oSheet:Copy() oWorkBookN:=oExcel:WorkBooks:Add() //новая пустая книга oSheetN:=oWorkBookN:Worksheets(1) oSheetN:Paste() // ??? [/pre2] сообщение об ошибке [pre2]Error 1553980/14 E_OUTOFMEMORY: PASTE Called from TOLEAUTO:PASTE(0) Called from PRINTAKT2(513) ...[/pre2] но при этом имею в Экселе открытую книгу исходного файла Книга1 с нужной копией страницы Книга2 пустая сделано в 46-й версии МиниГУИ - программа старая нужно изменить/добавить

Ответов - 10

Pasha: Это ошибка не харбора и не hmg. Excel выполняет команду Paste, возникает out of memory, и генерируется ошибка в приложении hmg А если сделать копипаст в экселе, ошибка есть ?

Haz: лови разгадку oExcel:Workbooks:Open(cFile) oBook:=oExcel:ActiveWorkbook() oBook:Activate() oBook:Worksheets(1):Activate() oSheet := oBook:Worksheets(1) oSheet:Cells:Select() oExcel:Selection:Copy() oWorkBookN:=oExcel:WorkBooks:Add() //новая пустая книга oSheetN:=oWorkBookN:Worksheets(1) oSheetN:Paste()

SADSTAR4: Что-то не помогает. Лист в ту же книгу копирует без проблем [pre2] oSheet:Cells:Select() oExcel:Selection:Copy() //oSheet2 := oBook:Worksheets(2) //oSheet2:Paste() oWorkBookN:=oExcel:WorkBooks:Add() //новая пустая книга oSheetN:=oWorkBookN:Worksheets(1) oSheetN:Paste() // ??? [/pre2] а в другую - ошибка. Уже другая. [pre2]Error 1552500/3 DISP_E_MEMBERNOTFOUND: PASTE Called from TOLEAUTO:PASTE(0) Called from PRINTAKT2(512) [/pre2]


Pasha: SADSTAR4 пишет: а в другую - ошибка. Уже другая. Может, в новой книге надо сначала создать пустой лист ?

fil: Попробуй не лист копировать, а RANGE в лист новой книги

Haz: Проделай все руками и запиши макрос, посмотри как надо. у меня получилось так Cells.Select Selection.Copy Workbooks.Add ActiveSheet.Paste соответствующий код в харбуре oSheet:Cells:Select() oExcel:Selection:Copy() oWorkBookN:=oExcel:WorkBooks:Add() oWorkBookN:ActiveSheet:Paste() но и предыдущий пример работал без ругани на офисе 2010 и последней сборке минигуи как предлагает fil - тоже выход, если диаgазон известен , проще использовать range

SADSTAR4: нашел возможность убрать ошибку, но не понял причину. реально у меня была еще одна строка - колич.листов в новой книге [pre2] oSheet:Cells:Select() oExcel:Selection:Copy() oExcel:SheetsInNewWorkbook := 1 //количество листов в новой книге oWorkBookN:=oExcel:WorkBooks:Add() //новая пустая книга oSheetN:=oWorkBookN:Worksheets(1) oSheetN:Paste() // ??? [/pre2] вылетало на ошибку хотя новая книга с одним листом создавалась. убрал эту строку - не вылетает. P.S. окончательный код такой [pre2] oExcel:Workbooks:Open(cFile) oBook:=oExcel:ActiveWorkbook() oBook:Activate() oBook:Worksheets(1):Activate() oSheet := oBook:Worksheets(1) oSheet:Cells:Copy() oWorkBookN:=oExcel:WorkBooks:Add() //новая пустая книга oSheetN:=oWorkBookN:Worksheets(1) oSheetN:Paste() oSheet:Range("A1"):Copy() //для очистки клипборда чтобы не всплывал диалог ВклипбордеБольшойОбъем oBook:Saved:=.t. //чтобы не всплывал диалог СохранитьИзменения oBook:Close() oSheetN:Activate() ... работа с листом ... oExcel:Visible := .T. [/pre2]

Haz: Вместо этого : SADSTAR4 пишет: oSheet:Range("A1"):Copy() //для очистки клипборда чтобы не всплывал диалог ВклипбордеБольшойОбъем oBook:Saved:=.t. //чтобы не всплывал диалог СохранитьИзменения Попробуй так: oExcel:Set( "DisplayAlerts", .F. )

Pasha: Haz пишет: Попробуй так: oExcel:Set( "DisplayAlerts", .F. ) еще можно так: oExcel:CutCopyMode := .f. при этом снимается выделение ячеек

SADSTAR4: еще более окончательный код после всех советов и "Бритвы Оккама" [pre2] oExcel:Workbooks:Open(cFile) oBook:=oExcel:ActiveWorkbook() oBook:Worksheets(1):Cells:Copy() oBookN:=oExcel:WorkBooks:Add() //новая пустая книга oSheet:=oBookN:Worksheets(1) oSheet:Paste() t:=oExcel:Get( "DisplayAlerts") //временно сохранить текущую настройку oExcel:Set( "DisplayAlerts", .F. ) oBook:Close() oExcel:Set( "DisplayAlerts", t ) //восстановить предыдущую настройку oSheet:Activate() ... работа с листом ... oExcel:Visible := .T. [/pre2]



полная версия страницы