Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

excel   Найти похожие ветки 

 
Sash ©   (2004-11-16 09:48) [0]

здравствуйте! я в тупике :)
копирую таблицы с одного листа на другой
кол-во таблиц - 10 штук, а идут они сверху вниз с разрывом в 2 строки. вот в чем проблема:
начинаю копировать (в цикле) первую таблицу, до появления пустой ячейки, и когда она появляется, действие останавливается, а мне надо сделать чтобы она искала следующую таблицу и скопировала нужные мне столбцы и строки
вот кусок кода:

m:=WB.Sheets.Count;
WB.Sheets.Add(,WB.Sheets[m],1,xlWorksheet)//добавлем новый лист
i:=3;
while not VarIsEmpty(WB.Sheets[alist].Cells.Item[i,1].Value) do Inc(i);
for j:=3 to i-1 do
 begin
  acol1:=WB.Sheets[alist].Cells[j,2].Value;
  WB.Sheets[m+1].Cells[j+1,1].Value := acol1;//здесь alist-номер листа с которого копирую, m-количество листов в книге
.......
.......
.......
и так девять колонок

Скажите плиз, как это сделать?
Заранее благодарен всем кто откликнется!


 
Gloomer ©   (2004-11-16 10:05) [1]

а может так?

i:=3;
for n:=1 to 10 do
begin
while not VarIsEmpty(WB.Sheets[alist].Cells.Item[i,1].Value) do Inc(i);
for j:=3 to i-1 do
begin
 acol1:=WB.Sheets[alist].Cells[j,2].Value;
....
end


 
Sash ©   (2004-11-16 11:06) [2]

нет, так он 10 раз перерисовывает одно и тоже
ты поглумился? :)))


 
Gloomer ©   (2004-11-16 11:42) [3]

Т.к. нет полного исходного кода и Excel-таблицы, то я только предположил...
Действительно, ошибочка где-то в строке
for j:=3 to i-1 do
начальное значение цикла в общем случае явно не 3,необходимо его корректировать для каждого значения. Введи еще переменную i0, в которую заноси последнюю стоку предыдущей таблицы (для начала i0:=0). Тогда
for j:=i0+3 to i-1 do
в конце цила i0:=i (насчет этой стоки точно не уверен)


 
Sash ©   (2004-11-16 11:53) [4]

вот код:

//Создаем новый лист в книге Excel
  m:=WB.Sheets.Count;
  WB.Sheets.Add(,WB.Sheets[m],1,xlWorksheet);//
//Даем названия листам
  if Alist1ChBox.Checked then
  WB.Sheets[m+1].Name:="Отчет "+Alist1ChBox.Caption;
  if Alist2ChBox.Checked then
  WB.Sheets[m+1].Name:="Отчет "+Alist2ChBox.Caption;
  if Alist3ChBox.Checked then
  WB.Sheets[m+1].Name:="Отчет "+Alist3ChBox.Caption;
  i:=3;
//Проверяем таблицу на появление пустой ячейки
while not VarIsEmpty(WB.Sheets[alist].Cells.Item[i,1].Value) do Inc(i);
//Шапка таблицы
if Alist1ChBox.Checked then
begin
WB.Sheets[m+1].Cells[1,1].Value:="Показатели нагрузки и качества обслуживания вызовов на "+Alist1ChBox.Caption;
WB.Sheets[m+1].Cells[1,1].Font.Bold:=True;
end;
if Alist2ChBox.Checked then
begin
WB.Sheets[m+1].Cells[1,1].Value:="Показатели нагрузки и качества обслуживания вызовов на "+Alist2ChBox.Caption;
WB.Sheets[m+1].Cells[1,1].Font.Bold:=True;
end;
if Alist3ChBox.Checked then
begin
WB.Sheets[m+1].Cells[1,1].Value:="Показатели нагрузки и качества обслуживания вызовов на "+Alist3ChBox.Caption;
WB.Sheets[m+1].Cells[1,1].Font.Bold:=True;
end;

WB.Sheets[m+1].Cells[3,1].Value:="Направление";
WB.Sheets[m+1].Cells[3,1].Borders.LineStyle:=1;
WB.Sheets[m+1].Cells[3,1].ColumnWidth:=12;

WB.Sheets[m+1].Cells[3,2].Value:="Попытки";
WB.Sheets[m+1].Cells[3,2].Borders.LineStyle:=1;

WB.Sheets[m+1].Cells[3,3].Value:="Ответы, %";
WB.Sheets[m+1].Cells[3,3].Borders.LineStyle:=1;
WB.Sheets[m+1].Cells[3,3].ColumnWidth:=10;

WB.Sheets[m+1].Cells[3,4].Value:="Неответы, %";
WB.Sheets[m+1].Cells[3,4].Borders.LineStyle:=1;
WB.Sheets[m+1].Cells[3,4].ColumnWidth:=12;

WB.Sheets[m+1].Cells[3,5].Value:="Занято, %";
WB.Sheets[m+1].Cells[3,5].Borders.LineStyle:=1;
WB.Sheets[m+1].Cells[3,5].ColumnWidth:=10;

WB.Sheets[m+1].Cells[3,6].Value:="Временная неисправность, %";
WB.Sheets[m+1].Cells[3,6].Borders.LineStyle:=1;
WB.Sheets[m+1].Cells[3,6].ColumnWidth:=26;

WB.Sheets[m+1].Cells[3,7].Value:="Нет канала, %";
WB.Sheets[m+1].Cells[3,7].Borders.LineStyle:=1;
WB.Sheets[m+1].Cells[3,7].ColumnWidth:=13;

WB.Sheets[m+1].Cells[3,8].Value:="Ошибка протокола, %";
WB.Sheets[m+1].Cells[3,8].Borders.LineStyle:=1;
WB.Sheets[m+1].Cells[3,8].ColumnWidth:=20;

WB.Sheets[m+1].Cells[3,9].Value:="Ресурс недоступен, %";
WB.Sheets[m+1].Cells[3,9].Borders.LineStyle:=1;
WB.Sheets[m+1].Cells[3,9].ColumnWidth:=20;

for j:=3 to i-1 do
 begin
  acol1:=WB.Sheets[alist].Cells[j,2].Value;
  WB.Sheets[m+1].Cells[j+1,1].Value := acol1;
  WB.Sheets[m+1].Cells[j+1,1].Borders.LineStyle:=1;

  acol2:=WB.Sheets[alist].Cells[j,5].Value;
  WB.Sheets[m+1].Cells[j+1,2].Value := acol2;
  WB.Sheets[m+1].Cells[j+1,2].Borders.LineStyle:=1;

  acol3:=WB.Sheets[alist].Cells[j,6].Value;
  WB.Sheets[m+1].Cells[j+1,3].Value := acol3;
  WB.Sheets[m+1].Cells[j+1,3].Borders.LineStyle:=1;
  if strtofloat(acol3)<45 then WB.Sheets[m+1].Cells[j+1,3].Interior.ColorIndex:=6;

  acol4:=WB.Sheets[alist].Cells[j,8].Value;
  WB.Sheets[m+1].Cells[j+1,4].Value := acol4;
  WB.Sheets[m+1].Cells[j+1,4].Borders.LineStyle:=1;
  if StrToFloat(acol4)>15 then WB.Sheets[m+1].Cells[j+1,4].Interior.ColorIndex:=38;

  acol5:=WB.Sheets[alist].Cells[j,9].Value;
  WB.Sheets[m+1].Cells[j+1,5].Value := acol5;
  WB.Sheets[m+1].Cells[j+1,5].Borders.LineStyle:=1;
  if StrToFloat(acol5)>25 then WB.Sheets[m+1].Cells[j+1,5].Interior.ColorIndex:=37;

  acol6:=WB.Sheets[alist].Cells[j,10].Value;
  WB.Sheets[m+1].Cells[j+1,6].Value := acol6;
  WB.Sheets[m+1].Cells[j+1,6].Borders.LineStyle:=1;
  if StrToFloat(acol6)>1 then WB.Sheets[m+1].Cells[j+1,6].Interior.ColorIndex:=44;

  acol7:=WB.Sheets[alist].Cells[j,11].Value;
  WB.Sheets[m+1].Cells[j+1,7].Value := acol7;
  WB.Sheets[m+1].Cells[j+1,7].Borders.LineStyle:=1;
  if StrToFloat(acol7)>1 then WB.Sheets[m+1].Cells[j+1,7].Interior.ColorIndex:=46;

  acol8:=WB.Sheets[alist].Cells[j,17].Value;
  WB.Sheets[m+1].Cells[j+1,8].Value := acol8;
  WB.Sheets[m+1].Cells[j+1,8].Borders.LineStyle:=1;
  if StrToFloat(acol8)>1 then WB.Sheets[m+1].Cells[j+1,8].Interior.ColorIndex:=42;

  acol9:=WB.Sheets[alist].Cells[j,19].Value;
  WB.Sheets[m+1].Cells[j+1,9].Value := acol9;
  WB.Sheets[m+1].Cells[j+1,9].Borders.LineStyle:=1;
  if StrToFloat(acol9)>1 then WB.Sheets[m+1].Cells[j+1,9].Interior.ColorIndex:=10; //12
 end;


 
Sash ©   (2004-11-16 12:02) [5]

и еще, каждая таблица имеет разное число СТРОК


 
Sash ©   (2004-11-17 09:39) [6]

Товарищ Gloomer! Помогите!


 
ЮЮ ©   (2004-11-17 10:07) [7]

Ничего, если я не Gloomer и не Товарищ ?
Ну, например, так:
iStart := 1;
while iStart < 65000 // или сколько их там? листать тяжело :) do begin
 while (iStart < 65000) and VarIsEmpty(WB.Sheets[alist].Cells.Item[iStart,1].Value) do Inc(iStart); // ищем начало таблицы
 if (iStart >= 65000) then break; //новой таблицы не найдено
 iEnd := iStart;
 while not VarIsEmpty(WB.Sheets[alist].Cells.Item[iEnd ,1].Value)   do Inc(iEnd); // ищем конец таблицы

 for j := iStart to iEnd do begin
 ...
 end;
 iStart := iEnd + 1
end;


 
Gloomer ©   (2004-11-17 10:24) [8]

>[7] ЮЮ
Примерно это я и имел ввиду, только мысль до конца не додумал :-(
>Sash
выкинь стоки
i:=3;
//Проверяем таблицу на появление пустой ячейки
while not VarIsEmpty(WB.Sheets[alist].Cells.Item[i,1].Value) do Inc(i);

Переменной i вообще не будет. Предложенный ЮЮ [7] код (до многоточия) вставляем
вместо строки for j:=3 to i-1 do
В конце
if StrToFloat(acol9)>1 then WB.Sheets[m+1].Cells[j+1,9].Interior.ColorIndex:=10; //12
end;
iStart := iEnd + 1
end;


 
Наиль   (2004-11-17 11:06) [9]

> Sash
Возможно мой совет не кстати, но разбраться с тем кодом, что дал достаточно сложно. Поэтому я переписал его начиная с if Alist1ChBox.Checked then. Код касающийся оформления у тебя закрывает суть программы. Так как, совет тебе уже успели дать, то могут предложить только оптимизированый текст программы

Const
cw:array[1..9] of integer =(12,0,10,12,10,26,13,20,20);
txt:array[1..9] of string = ("Направление","Попытки","Ответы, %",
"Неответы, %","Занято, %","Временная неисправность, %","Нет канала, %",
"Ошибка протокола, %","Ресурс недоступен, %");
nm:array[1..9] of integer =(2,5,6,8,9,10,11,17,19);
nm2:array[1..9] of integer =(0,0,45,15,25,1,1,1,1);
nm3:array[1..9] of integer =(0,0,6,38,37,44,46,42,10);
Var
z:real;
begin
// ...
With WB.Sheets[m+1] do Begin
 With Cells[1,1] do Begin
  Value:="Показатели нагрузки и качества обслуживания вызовов на ";
  if Alist1ChBox.Checked then Value:=Value+Alist1ChBox.Caption;
  if Alist2ChBox.Checked then Value:=Value+Alist2ChBox.Caption;
  if Alist3ChBox.Checked then Value:=Value+Alist3ChBox.Caption;
  Font.Bold:=True;
 End;

 For x:=1 to 9 do Begin
  With Cells[3,x] do Begin
   Value:=txt[x];
   Borders.LineStyle:=1;
   if x=2 then Continue;
   ColumnWidth:=cw[x];
  End;
 End;

 for j:=3 to i-1 do
  begin
   For x:=1 to 9 do Begin
    acol:=WB.Sheets[alist].Cells[j,nm[x]].Value;
    With Cells[j+1,x] do Begin
     Value := acol;
     Borders.LineStyle:=1;
     z:=strtofloat(acol);
     if x=3 then
      if z<nm2[x] then Interior.ColorIndex:=nm3[x];
     if x in [4..9] then
      if z>nm2[x] then Interior.ColorIndex:=nm3[x];
    End;
   End;
  end;
end;
end;


 
Sash ©   (2004-11-17 11:22) [10]

2 ЮЮ ©   (17.11.04 10:07) [7]
 Gloomer ©   (17.11.04 10:24) [8]
 Наиль   (17.11.04 11:06) [9]
Спасибо Вам всем большое! теперь все ясно.


 
Sash ©   (2004-11-17 11:42) [11]

блин, выскакивает ошибка:
"answered" is not a valid floating point value
скажите  пожалуйста, что не так?


 
ЮЮ ©   (2004-11-17 11:53) [12]

где-то float переменной пытаешься присвоить строку "answered"


 
Sash ©   (2004-11-17 12:01) [13]

у меня вообще нет такой переменной


 
ЮЮ ©   (2004-11-17 12:04) [14]

strtofloat(acol3)
...
StrToFloat(acol9)


 
Sash ©   (2004-11-17 12:09) [15]

а как сделать иначе? преобразую для : во-первых в таблице много значений с запятой, а во-вторых
если значение ячейки больше определенного лимита, то эту ячейку выделяю цветом


 
Sash ©   (2004-11-17 12:11) [16]

во вторых - не в тему :)


 
ЮЮ ©   (2004-11-17 12:14) [17]

а если в ячейке стояло и в acolX попал текст "answered"?


 
Sash ©   (2004-11-17 12:22) [18]

точно! есть такое слово в заголовке столбца каждой из десяти таблиц.
посоветуйте пожалуйста, что же тогда предпринять


 
Gloomer ©   (2004-11-17 12:32) [19]

есть такая функция function VarIsFloat(const V: Variant): Boolean;. В хелпе почитай.
тогда получим
if VarIsFloat(acol3)then strtofloat(acol3)


 
ЮЮ ©   (2004-11-17 12:36) [20]

>посоветуйте пожалуйста, что же тогда предпринять
Для начада, пропускать заголовок:
 for j := iStart + 1 to iEnd do begin

>VarIsFloat(const V: Variant): Boolean;. В хелпе почитай
VarIsFloat(string) = false, независимо, что в той стринг нарисовано :)


 
Sash ©   (2004-11-17 12:39) [21]

кстати, первую таблицу нарисовал, а как встретилась уже пустая ячейка, программа опять загнулась :(
блин, хреновый из меня прогаммер, пока что :)


 
Gloomer ©   (2004-11-17 12:54) [22]

> ЮЮ ©   (17.11.04 12:36) [20]
Виноват, действительно VarIsFloat проверяет только тип переменной. Предложенный Вами вариант действительно более радикальный

> Sash ©   (17.11.04 12:39) [21]
а что говорит при этом программа?


 
Sash ©   (2004-11-17 13:22) [23]

сделал так:
  if VarIsFloat(acol3) then
  if strtofloat(acol3)<45 then WB.Sheets[m+1].Cells   [j+1,3].Interior.ColorIndex:=6;
вроде работает :)
еще раз всем СПАСИБО!


 
Sash ©   (2004-11-17 13:51) [24]

опять проблема :)
  if VarIsFloat(acol9)=False then
  if StrToFloat(acol9)>1 then WB.Sheets[m+1].Cells[j+1,9].Interior.ColorIndex:=10; //12

как встречается пустая ячейка, выдает ошибку
"" is not a valid floating point value

может что неправильно делаю?


 
Sash ©   (2004-11-17 14:15) [25]

скажите плиз! где ошибка?


 
ЮЮ ©   (2004-11-18 03:54) [26]

какого типа acol9 ? стринг или variant?
для стринг
if (acol9 <> "") and (StrToFloat(acol9)>1)
для вариант, возможно, надо будет ещё проверить VarIsNull


 
Sash ©   (2004-11-18 06:21) [27]

2 ЮЮ ©   (18.11.04 03:54) [26]
acol есть стринг
спасибо!, сейчас попробую


 
Sash ©   (2004-11-18 06:26) [28]

пишет: operator not applicable to this operand type


 
Sash ©   (2004-11-18 06:37) [29]

сделал так:
все переменные acoln перевел в вариант и проверил на varisnull и
о чудо! все прекрасно работает!
Спасибо Вам ЮЮ!



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
1-1100779971
Dolphin001
2004-11-18 15:12
2004.12.05
Delphi 5


6-1095885348
Ivanov_F.
2004-09-23 00:35
2004.12.05
Ограничение траффика


6-1096023735
Wolfram
2004-09-24 15:02
2004.12.05
Работа с vCard


3-1099915999
Danila
2004-11-08 15:13
2004.12.05
InterBase 6.0 Как получить список полей из системной таблици


1-1101032493
PoUlerer
2004-11-21 13:21
2004.12.05
Menu