Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.041 c