Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление ячеек в таблице Exel со сдвигом 
:(
    Опции темы
TP@MB@Y
Дата 19.7.2006, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



У меня есть таблица из четырех столбцов.

номер1 - значение1 - номер2 - значение2

задача состоит в том чтобы убрать все повторяющиеся комбинации, т.е. я пробегаю по номерам1 и сравниваю их с номерами2, если есть совпадение, то сравниваю значения, если и тут совпалдение, то удаляю обе пары.

раньше с офисом не работал в дельфи. порылся в доках и вот что написал:

Код

procedure TForm1.bGoClick(Sender: TObject);
var Excel, Sheet:Variant;
    i,j:Integer;
begin
 Excel := CreateOleObject('Excel.Application');
 try
  Excel.Workbooks.Open(feOpen.FileName);
  Sheet:=Excel.Workbooks.Item[1];
  i:=1;
  while Sheet.Cells[i,1]<>'' do begin
        j:=1;
        while Sheet.Cells[j,3]<>'' do begin
              if Sheet.Cells[i,1]=Sheet.Cells[j,3] then
                 if Sheet.Cells[i,2]-Sheet.Cells[j,4]=0 then begin
                    //Удаляем ячейки
                 end;
              j:=j+1;
        end;
        i:=i+1;
  end;
 except
 end;

end;


1)Выдает критическую ошибку при запуске, что то с методом Cells неправильно я делаю(

2)Как удалить выбранные ячейки, со сдвигом вверх? 
 
PM   Вверх
Mechanic
Дата 19.7.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: нет
Всего: 7



Код

    Range("C9:C17").Select
    Selection.Delete Shift:=xlUp
 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Albinos_x
Дата 20.7.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Эта вопрос http://forum.vingrad.ru/index.php?showforum=89 этого раздела...

советую ознакомиться вот с этой статьёй:
http://forum.vingrad.ru/index.php?showtopi...34&view=all

1. Правильно выдаёт ошибку... т.к. ты работаешь не с листом, а с книгой...
здесь лучше ввести ещё переменную Book:OleVariant;
Код
...
Book:=Excel.Workbooks.Open(feOpen.FileName);
...

для работы с листом сделать так:
Код

Sheet:=Book.Sheets[1];

теперь можно работать с листом по твоему коду...

2. это будет выглядить где-то так:
Код
...
ExcelWorksheet.Range['F1','F2'].Select;
ExcelWorksheet.Range['F1','F2'].Delete(xlToLeft);
...

не проверял... но где-то возле этого должно быть...  

Это сообщение отредактировал(а) Albinos_x - 20.7.2006, 00:24


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 20.7.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Mechanic,  спасибо

вот что у меня получилось:

Код

procedure TForm1.bGoClick(Sender: TObject);
var Excel, Sheet:Variant;
    i,j:Integer;
begin
 Excel := CreateOleObject('Excel.Application');
 try
  Excel.Workbooks.Open(feOpen.FileName);
  Sheet:=Excel.Workbooks.Item[1];
  caption:=Sheet.Cells[1,1].asString;
  i:=1;
  while Sheet.Cells[1,i]<>'' do begin
        j:=1;
        while Sheet.Cells[3,j]<>'' do begin
              if Sheet.Cells[1,i]=Sheet.Cells[3,j] then
                 if Sheet.Cells[2,i]-Sheet.Cells[4,j]=0 then begin
                    //Óäàëÿåì îáå çàïèñè
                    Sheet.Range('A'+IntToStr(i)+':B'+IntToStr(i)).Select;
                    Sheet.Shift:=xlUp;
                    Sheet.Selection.Delete;
                    //À òåïåðü âòîðóþ
                    Sheet.Range('Ñ'+IntToStr(j)+':Â'+IntToStr(j)).Select;
                    Sheet.Shift:=xlUp;
                    Sheet.Selection.Delete;
                 end;
              j:=j+1;
        end;
        i:=i+1;
  end;
 except
  ShowMessage('Îøèáêà!');
 end;
end;


Но программа выдает ошибку, что метод Cells not supported automation object. Что за ерунда? Может в коде я неправильно обращаюсь к ячейке? 
PM   Вверх
Albinos_x
Дата 20.7.2006, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



ЗЫ: после оончания работы с экселем переменные надо освободить... т.е. сделать unassigned 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 20.7.2006, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Albinos_x,  спасибо за хорошую ссылку на статью! Обязательно прочту.

Но щас мне надо сделать прогу)

Вот код:

Код

procedure TForm1.bGoClick(Sender: TObject);
var Excel,Book,Sheet:Variant;
    i,j:Integer;
    v:OleVariant;
begin
 Excel := CreateOleObject('Excel.Application');
 try
  Book:=Excel.Workbooks.Open(feOpen.FileName);
  Sheet:=Book.Sheets[1];
  v:=Sheet.Range['A1',EmptyParam];
  //caption:=inttostr(v);
  i:=1;
  while Sheet.Cells[1,i].Value<>'' do begin
        j:=1;
        while Sheet.Cells[3,j].Value<>'' do begin
              if Sheet.Cells[1,i].Value=Sheet.Cells[3,j].Value then
                 if Sheet.Cells[2,i].Value-Sheet.Cells[4,j].Value=0 then begin
                    //Óäàëÿåì îáå çàïèñè
                    Sheet.Range('A'+IntToStr(i)+':B'+IntToStr(i)).Select;
                    Sheet.Shift:=xlUp;
                    Sheet.Selection.Delete;
                    //À òåïåðü âòîðóþ
                    Sheet.Range('Ñ'+IntToStr(j)+':Â'+IntToStr(j)).Select;
                    Sheet.Shift:=xlUp;
                    Sheet.Selection.Delete;
                    caption:='111';
                 end;
              j:=j+1;
        end;
        i:=i+1;
  end;
 except
  ShowMessage('Îøèáêà!');
  Excel.Quit;
  exit
 end;
 Excel.Quit;
end;


Ошибок не выдает, но и не работает как надо. У меня в ячейке число. Как мне его вытащить чтобы обработать?

Код

v:=Sheet.Range['A1',EmptyParam];
caption:=inttostr(v);


 - что-то типа этого. 
PM   Вверх
Albinos_x
Дата 20.7.2006, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



что-то типа... только приведение типов указанное не прокатит.. т.к. v :или variant или OleVariant... следовательно v нужно будет приводить к нужному типу...  


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 20.7.2006, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Albinos_x,  а разве приведение типов неяно не делается при 

Код

i:integer;

i:=Sheet.Cells[1,1].Value;
caption:=inttostr(i);


практика показала что делается smile

вот код последней версии. прога зависает...
скорее всего из-за условия в цикле. по логике все правильно. как еще определить что ячейка пуста?

Код

while Sheet.Cells[i,1].Value<>null do begin
        j:=1;
        while Sheet.Cells[j,3].Value<>null do begin
              if Sheet.Cells[i,1].Value=Sheet.Cells[j,3].Value then
                 if Sheet.Cells[i,2].Value-Sheet.Cells[j,4].Value=0 then begin
                    //Удаляем обе записи
                    Sheet.Range('A'+IntToStr(i)+':B'+IntToStr(i)).Select;
                    Sheet.Selection.Delete(xlUp);
                    //А теперь вторую
                    Sheet.Range('С'+IntToStr(j)+':В'+IntToStr(j)).Select;
                    Sheet.Selection.Delete(xlUp);
                    caption:='111';
                 end;
              j:=j+1;
        end;
        i:=i+1;
  end;
 
PM   Вверх
Albinos_x
Дата 20.7.2006, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



1. делается, но надо учитывать, что в ячейке может быть и не числовое значение... или числовое, но сохранёное как текст...

2. в твоём случае наверно лучше проверку условие оставить из первого варианта, и цикл ограничить активными ячейками, в указанной статье, как это сделать 2 варианта, при этом в там разделе недавно это обсуждали....
Цитата(TP@MB@Y @  20.7.2006,  02:08 Найти цитируемый пост)
null

может:
Код
nil

?

Добавлено @ 02:35 
Цитата(Albinos_x @  20.7.2006,  02:34 Найти цитируемый пост)
при этом в там разделе недавно это обсуждали....

http://forum.vingrad.ru/index.php?showtopi...79&view=all 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 20.7.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Код

Sheet.Range['A'+IntToStr(i),'B'+IntToStr(i)].Select;


невозможно получить свойство select класса range :-\  

Это сообщение отредактировал(а) TP@MB@Y - 20.7.2006, 10:42
PM   Вверх
TP@MB@Y
Дата 20.7.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Вроде справился. Работает...

Вот код, может кому интересно...

Код

procedure TForm1.BitBtn1Click(Sender: TObject);
var i,j,x,y:Integer;
    s:string;
begin
// çàïóñêàåì Excel
ExApp.AutoConnect:=true;
// îòêðûâàåì êíèãó
exBook.ConnectTo(ExApp.Workbooks.OpenXML(feOpen.FileName,EmptyParam));
// ñîåäèíÿåìñÿ ñ êíèãîé
ExApp.ConnectTo(ExBook.Application);
ExSheet.ConnectTo(exBook.ActiveSheet as ExcelWorksheet);
// äåëàåì âèäèìûì Excel
ExApp.Visible[0]:=false;
try
  i:=1;
  s:=exSheet.Range['A'+IntToStr(i),EmptyParam].Value2;
  while{ (i<=5)and }s<>'' do begin
        j:=1;
        //while Sheet.Cells[j,1].Value<>nil do begin
        while (j<=5) do begin
              if exSheet.Range['A'+IntToStr(i),EmptyParam].Value2=exSheet.Range['C'+inttostr(j),EmptyParam].Value2 then begin
                 x:=exSheet.Range['B'+IntToStr(i),EmptyParam].Value2;
                 y:=exSheet.Range['D'+IntToStr(j),EmptyParam].Value2;
                 //ShowMessage(IntToStr(x)+' '+IntToStr(y));
                 if (x-y)=0 then begin
                    //Óäàëÿåì îáå çàïèñè
                    //ShowMessage(IntToStr(i));
                    exSheet.Range['A'+IntToStr(i),'B'+IntToStr(i)].Select;
                    exSheet.Range['A'+IntToStr(i),'B'+IntToStr(i)].Delete(xlUp);
                    //À òåïåðü âòîðóþ
                    exSheet.Range['C'+IntToStr(j),'D'+IntToStr(j)].Select;
                    exSheet.Range['C'+IntToStr(j),'D'+IntToStr(j)].Delete(xlUp);
                    //Âûõîäèì èç öèêëà ê ñëåäóùåìó íîìåðó
                    if i<>1 then i:=i-1;
                    break
                 end
              end;
              j:=j+1;
        end;
        i:=i+1;
        s:=exSheet.Range['A'+IntToStr(i),EmptyParam].Value2
  end;
except
 exBook.Close;
 exApp.Quit;
 ShowMessage('Îøèïêà!');
 exit
end;
 exBook.Close;
 exApp.Quit;
end;
 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.