|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не работает цикл поиска-копирования по стирокам excel
Здравствуйте,господа. Помогите пожалуйста. В delphi-программе работаю с excel.
Программа создает 2 книги - 1.*ночные данные* и 2.*дневные данные*. Далее не могу собрать эти данные в один документ. Пытаюсь скопировать *ночные* в *дневные*. В обоих книгах столбцы b,c,d,e по-строчно заполнены одинаково: книга1: b1:маша c1:саша d1:даша e1:наташа, b2:петя c2:коля d2:ваня e2:толик, книга2: b1:маша c1:саша d1:даша e1:наташа,b2:петя c2:коля d2:ваня e2:толик, и т.д. Количество столбцов вообще в обоих книгах одинаково, количество строк разное и строки конечно могут быть не по порядку и поменяны. Есть столбцы в *ночных* (k,l,n), данные из которых мне нужно скопировать в *дневные*. В общем делаю так (но с ошибками блин ): По каждой строчке от начала до конца книги1 беру диапазон1 b[i]:e[i], диапазон2 k[i]:l[i], диапазон3 n[i]. Ищу в книге2 диапазон1, номер строки где он прячется присваиваю j, и вставляю диапазон2 в k[j]:l[j], диапазон3 n[j]. Прилагаю код процедуры. Что-то в цикле я где-то неправильно делаю,помогите разобраться. Спасибо. Код:
procedure TFobexcel.Button5Click(Sender: TObject); var diapazon1,vstavka1,vstavka2,vst1,vst2,FirstAddress1:string; i:integer; diapazon1_range,ztext,rangevstavka1,rangevstavka2,rangecopy1,rangecopy2:variant; begin //первый столбец на листе 3 colfirst:=E1.WorkBooks.Item[3].ActiveSheet.usedrange.column; //кол-во столбцов на листе 3 collast:=E1.WorkBooks.Item[3].ActiveSheet.usedrange.columns.count; //первая строка на листе 3 rowfirst:=E1.WorkBooks.Item[3].ActiveSheet.usedrange.row; //кол-во строк на листе 3 rowlast:=E1.WorkBooks.Item[3].ActiveSheet.usedrange.rows.count; //перебор по строкам. //Пропускаем "шапку"- c 9 строчки и до конца листа 3 for i:= 9 to rowlast do begin //дипазон1-это i-тая строка A[i]:D[i] с названиями //ExcelChar - функция перевода номера столбца в букву diapazon1:=ExcelChar(colfirst)+inttostr(i)+':'+ExcelChar(colfirst+3)+inttostr(i); //определяем в excel diapazon1_range:=E1.WorkBooks.Item[3].ActiveSheet.Range[diapazon1]; //Вот это - текст или value- нужно потом искать в листе 6 ztext:=diapazon1_range.value; // или .text? //vst1-это i-тая строка k[i]:l[i] с нужными данными vst1:=ExcelChar(colfirst+10)+inttostr(i)+':'+ExcelChar(colfirst+11)+inttostr(i); //vst2-это i-тая строка n[i] с другими нужными данными vst2:=ExcelChar(colfirst+13)+inttostr(i); //определяем vst1 в excel как диапазон для копирования на листе 3 rangecopy1:=E1.WorkBooks.Item[3].ActiveSheet.Range[vst1]; //копируем в буфер rangecopy1.copy; //определяем vst2 в excel как диапазон для копирования на листе 3 rangecopy2:=E1.WorkBooks.Item[3].ActiveSheet.Range[vst2]; //копируем в буфер rangecopy2.copy; try //обработка есес-сно:) //FindRange1-диапазон на листе 6, где ищем ztext из листа 3 FindRange1 := E1.WorkBooks.Item[6].ActiveSheet.usedrange.find(ztext); //дневное if not VarIsEmpty(FindRange1) then begin FirstAddress1 := FindRange1.Address; repeat find:=FindRange1.Row; //нашли ztext, в строке find //vstavka1-это строка k[i]:l[i] на листе 6, куда встанут нужные данные из листа 3 vstavka1:=ExcelChar(colfirst+10)+inttostr(find)+':'+ExcelChar(colfirst+11)+inttostr(find); //vstavka1-это строка k[i]:l[i] на листе 6, куда встанут другие нужные данные из листа 3 vstavka2:=ExcelChar(colfirst+13)+inttostr(find); //определяем дипазоны для вставки в excel rangevstavka1:= E1.WorkBooks.Item[6].ActiveSheet.Range[vstavka1]; rangevstavka2 :=E1.WorkBooks.Item[6].ActiveSheet.Range[vstavka2]; //вставляем данные листа 3 из буфера на лист 6 rangecopy1.copy(rangevstavka1); rangecopy2.copy(rangevstavka2); // повторяем поиск FindRange1 := E1.WorkBooks.Item[6].ActiveSheet.usedrange.FindNext(After :=FindRange1); // until FirstAddress1 = FindRange1.Address; end; except messagebox(handle,'Просто нажми меня','Внимание!',0); end; end; end; |