|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
как открыть два Excela в один процесс
имеется следующий код проверки если запущен процесс EXCEL.EXE
если нет запускается Код: Код:
function RunExcel: boolean; begin //если запущен процесс Excel if GetProcessByEXE('EXCEL.EXE')<>0 then begin Result:=true; // тут видимо и есть ошибка так как при обрашение к файлам // данные берутся только из одного файла xls1:= GetActiveOleObject('Excel.Application'); xls2:= GetActiveOleObject('Excel.Application'); end else //если не запущен begin Result:=false; //создаются два процесса Excel, программа работает правильно, //но хотелось бы не грузить систему и открыть файлы в одном процессе xls1:= CreateOleObject('Excel.Application'); xls2:= CreateOleObject('Excel.Application'); end; end; если убить процесс эксэль и запустить программу она работает правильно (но запускаються два процеса EXCEL.EXE) ну а вот если эксэль запущен или повторно вызвать функцию ранэксэль то она работает уже неправильно (данные которые должны браться из разных документов берутся из одного и того же файла) есть и остальная часть программы. помогите решить проблему |
#2
|
||||
|
||||
Цитата:
Код:
xls1:= GetActiveOleObject('Excel.Application'); xls1.Workbooks.Add; xls1.Workbooks.Add; xls1.Visible:= true; Потом просто к ним обращайся по индексам xls1.Workbooks[1]... и т.д. Google в помощь |
#3
|
|||
|
|||
это если создать.
а если открыть? |
#4
|
||||
|
||||
Вместо Add Open и в скобках что открыть нужно.
Google в помощь |
#5
|
|||
|
|||
Код:
procedure TForm1.ButtonClick(Sender: TObject); begin xls1:= GetActiveOleObject('Excel.Application'); xls1.Workbooks.Open[Label1.Caption]; xls1.Workbooks.Open[Label2.Caption]; xls1.Visible:= true; //до этого момента все прекрасно а вот со следующей строчкой не знаю как Label3.Caption:=xls1.Workbooks[1].Range['A1']; end; пробовал и Код:
Label3.Caption:=xls1[1].Range['A1']; Код:
Label3.Caption:=xls1.Range['A1']; объясните пожалуйста подробней что вы имели введу Цитата:
|
#6
|
||||
|
||||
Прошу прощения, не метод Workbooks, а метод Windows:
Код:
//Поместим в лэйбл3 текст из А1 первой книги, а в лэйбл4 из второй xls1.Windows[1].Activate; Label3.Caption:= xls1.Range['A1'].Value; //небольшой комментарий: Value не обязательно указывать, это просто у меня привычка после VBA xls1.Windows[2].Activate; //на мой взгляд, более правильно обращаться к ячейкам не range, а cells: xls1.Cells[1,1].Value (A1) Label4.Caption:= xls1.Range['A1'].Value; //где первый индекс - индекс строки, а второй - индекс столбца, т.е. xls1.Cells[4,2] - B4 Код:
xls1.Windows[Label1.Caption].Activate; Google в помощь Последний раз редактировалось Ildar-tsr, 12.12.2011 в 12:28. |
#7
|
|||
|
|||
ОГРОМНОЕ СПАСИБО !!!!!!!!! все именно как я и хотел
а еще такой вопросик я делаю программу которая сравнивает ячейки в этих двух документах создаю два цикла (по линиям и колоннам) а вот где остановиться не знаю Как узнать сколько ячеек заполнено (т.е. где последняя не пустая ячейка)??? в документах могут встречаться пустые ряды и колонны |
#8
|
||||
|
||||
Цитата:
Код:
xls1.Cells.SpecialCells(11).Row; //последняя строка xls1.Cells.SpecialCells(11).Column; //последний столбец Google в помощь |
#9
|
|||
|
|||
Цитата:
Еще раз Большое спасибо! Цитата:
да это я думаю для меня не проблема! Спасибо. |