Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.12.2011, 20:26
KuHoMaH KuHoMaH вне форума
Прохожий
 
Регистрация: 07.12.2011
Сообщения: 13
Репутация: 10
Вопрос как открыть два 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  
Старый 07.12.2011, 21:07
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от KuHoMaH
но хотелось бы не грузить систему и открыть файлы в одном процессе
Код:
xls1:= GetActiveOleObject('Excel.Application');
xls1.Workbooks.Add;
xls1.Workbooks.Add;
xls1.Visible:= true;
Вот тебе две книги в одном процессе.
Потом просто к ним обращайся по индексам xls1.Workbooks[1]... и т.д.
__________________
Google в помощь
Ответить с цитированием
  #3  
Старый 07.12.2011, 21:40
KuHoMaH KuHoMaH вне форума
Прохожий
 
Регистрация: 07.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

это если создать.
а если открыть?
Ответить с цитированием
  #4  
Старый 08.12.2011, 06:20
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Вместо Add Open и в скобках что открыть нужно.
__________________
Google в помощь
Ответить с цитированием
  #5  
Старый 08.12.2011, 20:22
KuHoMaH KuHoMaH вне форума
Прохожий
 
Регистрация: 07.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Код:
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'];

объясните пожалуйста подробней что вы имели введу
Цитата:
обращайся по индексам xls1.Workbooks[1]... и т.д.
??
Ответить с цитированием
  #6  
Старый 09.12.2011, 06:50
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Прошу прощения, не метод 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  
Старый 12.12.2011, 01:45
KuHoMaH KuHoMaH вне форума
Прохожий
 
Регистрация: 07.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

ОГРОМНОЕ СПАСИБО !!!!!!!!! все именно как я и хотел

а еще такой вопросик я делаю программу которая сравнивает ячейки в этих двух документах
создаю два цикла (по линиям и колоннам) а вот где остановиться не знаю

Как узнать сколько ячеек заполнено (т.е. где последняя не пустая ячейка)???
в документах могут встречаться пустые ряды и колонны
Ответить с цитированием
  #8  
Старый 12.12.2011, 12:42
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от KuHoMaH
Как узнать сколько ячеек заполнено (т.е. где последняя не пустая ячейка)???
в документах могут встречаться пустые ряды и колонны
Код:
xls1.Cells.SpecialCells(11).Row; //последняя строка
xls1.Cells.SpecialCells(11).Column; //последний столбец
Правда есть одна проблема, постараюсь ее описать. Допустим заполнены с первой по 5 строку, т.е. после 5ой строки пустые ячейки. Если мы в ячейке на, скажем, 8ой строке не вводя текста установим выравнивание по центру, то это ячейка будет считаться последней, хотя в ней не будет текста.
__________________
Google в помощь
Ответить с цитированием
  #9  
Старый 12.12.2011, 22:09
KuHoMaH KuHoMaH вне форума
Прохожий
 
Регистрация: 07.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Ildar-tsr
xls1.Cells.SpecialCells(11).Row; //последняя строка
xls1.Cells.SpecialCells(11).Column; //последний столбец

Еще раз Большое спасибо!

Цитата:
Сообщение от Ildar-tsr
Правда есть одна проблема, постараюсь ее описать. Допустим заполнены с первой по 5 строку, т.е. после 5ой строки пустые ячейки. Если мы в ячейке на, скажем, 8ой строке не вводя текста установим выравнивание по центру, то это ячейка будет считаться последней, хотя в ней не будет текста.

да это я думаю для меня не проблема!
Спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter